创建图块(块中包含两条直线和一个圆)
View Code
1 static void lzxARX_AcDbDatabasemakeABlock(void) 2 { 3 //创建一个新的块表记录并为这个块表记录取名 4 AcDbBlockTableRecord *pBlockTableRec = new AcDbBlockTableRecord(); 5 pBlockTableRec->setName(L"MyBlock"); 6 7 //获得块表 8 AcDbBlockTable *pBlockTable = NULL; 9 acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForWrite); 10 11 //将这个新的块表记录添加到块表中 12 AcDbObjectId blockTableRecordId; 13 pBlockTable->add(blockTableRecordId, pBlockTableRec); 14 pBlockTable->close(); 15 16 //创建一条水平直线,并将这条直线添加到块表记录中 17 AcDbLine *pLine1 = new AcDbLine(); 18 AcDbObjectId lineId1; 19 20 //设置直线的起点和终点 21 pLine1->setStartPoint(AcGePoint3d(-0.8, 0, 0)); 22 pLine1->setEndPoint(AcGePoint3d(0.8, 0, 0)); 23 pLine1->setColorIndex(3); 24 25 //创建一条垂直直线,并将这条直线添加到块表记录中 26 AcDbLine *pLine2 = new AcDbLine(); 27 AcDbObjectId lineId2; 28 29 //设置直线的起点和终点 30 pLine2->setStartPoint(AcGePoint3d(0, -0.8, 0)); 31 pLine2->setEndPoint(AcGePoint3d(0, 0.8, 0)); 32 pLine2->setColorIndex(3); 33 34 //创建一个圆,并将这圆添加到块表记录中 35 AcDbCircle *pCircle = new AcDbCircle(AcGePoint3d::kOrigin,AcGeVector3d(0,0,1),0.5); 36 AcDbObjectId circleId; 37 38 //将直线和圆添加到块表记录中 39 pBlockTableRec->appendAcDbEntity(lineId1, pLine1); 40 pBlockTableRec->appendAcDbEntity(lineId2, pLine2); 41 pBlockTableRec->appendAcDbEntity(circleId, pCircle); 42 43 //关闭直线和块表记录 44 pLine1->close(); 45 pLine2->close(); 46 pCircle->close(); 47 pBlockTableRec->close(); 48 }
创建带属性定义的块
View Code
1 static void defineBlockWithAttributes(AcDbObjectId& blockId, const AcGePoint3d& basePoint, double textHeight, double textAngle) 2 { 3 int retCode = 0; 4 AcDbBlockTable *pBlockTable = NULL; 5 AcDbBlockTableRecord* pBlockRecord = new AcDbBlockTableRecord; 6 AcDbObjectId entityId; 7 8 //设置块名和基点 9 pBlockRecord->setName(L"BLOCK-WITH-ATTR"); 10 pBlockRecord->setOrigin(basePoint); 11 12 //打开块表 13 acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForWrite); 14 15 //将块表记录添加到块表中 16 pBlockTable->add(blockId, pBlockRecord); 17 18 //创建一个圆实体 19 AcDbCircle *pCircle = new AcDbCircle; 20 21 //设置圆实体的属性 22 pCircle->setCenter(basePoint); 23 pCircle->setRadius(textHeight * 4.0); 24 pCircle->setColorIndex(3); 25 26 //将圆添加到块表中 27 pBlockRecord->appendAcDbEntity(entityId, pCircle); 28 pCircle->close(); 29 30 //创建属性定义实体 31 AcDbAttributeDefinition *pAttdef = new AcDbAttributeDefinition; 32 33 //设置属性定义的值 34 pAttdef->setPosition(basePoint); 35 pAttdef->setHeight(textHeight); 36 pAttdef->setRotation(textAngle); 37 pAttdef->setHorizontalMode(AcDb::kTextLeft); 38 pAttdef->setVerticalMode(AcDb::kTextBase); 39 pAttdef->setPrompt(L"提示"); 40 pAttdef->setTextString(L"默认"); 41 pAttdef->setTag(L"标记"); 42 pAttdef->setInvisible(Adesk::kFalse); 43 pAttdef->setVerifiable(Adesk::kFalse); 44 pAttdef->setPreset(Adesk::kFalse); 45 pAttdef->setConstant(Adesk::kFalse); //属性对象设为可见 46 pAttdef->setFieldLength(25); 47 48 //将属性定义添加到块中 49 pBlockRecord->appendAcDbEntity(entityId, pAttdef); 50 51 //创建第二个属性定义 52 //使用克隆第一个属性定义的方法来创建第二个属性定义 53 AcDbAttributeDefinition *pAttdef2 = AcDbAttributeDefinition::cast(pAttdef->clone()); 54 55 //设置第二个属性定义的属性值 56 AcGePoint3d tempPt(basePoint); 57 tempPt.y -= pAttdef2->height(); 58 pAttdef2->setPosition(tempPt); 59 pAttdef2->setColorIndex(1); 60 pAttdef2->setConstant(Adesk::kTrue); 61 62 //将第二个属性定义添加到块中 63 pBlockRecord->appendAcDbEntity(entityId, pAttdef2); 64 65 //关闭对象返回 66 pAttdef->close(); 67 pAttdef2->close(); 68 pBlockRecord->close(); 69 pBlockTable->close(); 70 return; 71 }
插入带属性定义的块
View Code
1 static void lzxARX_AcDbDatabaseAddBlockWithAttributes(void) 2 { 3 //获得属性定义的插入点 4 AcGePoint3d basePoint; 5 if (acedGetPoint(NULL, L"\nEnter insertion point: ", asDblArray(basePoint)) != RTNORM) 6 return; 7 8 //获得属性定义的旋转值 9 double textAngle; 10 if (acedGetAngle(asDblArray(basePoint), L"\nEnter rotation angle: ", &textAngle) != RTNORM) 11 return; 12 13 //定义属性定义文本的高度 14 double textHeight; 15 if (acedGetDist(asDblArray(basePoint), L"\nEnter text height: ", &textHeight) != RTNORM) 16 return; 17 18 //创建要插入的块定义 19 AcDbObjectId blockId; 20 defineBlockWithAttributes(blockId, basePoint, textHeight, textAngle); 21 22 //创建块引用对象 23 AcDbBlockReference *pBlkRef = new AcDbBlockReference; 24 25 //给新创建的块定义设置块引用 26 pBlkRef->setBlockTableRecord(blockId); 27 28 //获得当用户坐标系的法向矢量 29 struct resbuf to, from; 30 31 from.restype = RTSHORT; 32 from.resval.rint = 1; 33 to.restype = RTSHORT; 34 to.resval.rint = 0; 35 36 AcGeVector3d normal(0.0, 0.0, 1.0); 37 acedTrans(&(normal.x), &from, &to, Adesk::kTrue, &(normal.x)); 38 39 //设置块引用的插入点 40 pBlkRef->setPosition(basePoint); 41 42 //设置块引用的旋转角和法向矢量 43 pBlkRef->setRotation(0.0); 44 pBlkRef->setNormal(normal); 45 46 //打开当前的数据库模型空间块表记录 47 AcDbBlockTable *pBlockTable; 48 acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead); 49 50 AcDbBlockTableRecord *pBlockTableRecord; 51 pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite); 52 53 pBlockTable->close(); 54 55 //将块引用添加到模型空间块表记录中 56 AcDbObjectId newEntId; 57 pBlockTableRecord->appendAcDbEntity(newEntId, pBlkRef); 58 pBlockTableRecord->close(); 59 60 //以读方式打开块定义 61 AcDbBlockTableRecord *pBlockDef; 62 acdbOpenObject(pBlockDef, blockId, AcDb::kForRead); 63 64 //创建一个块表记录遍历器用来浏览属性定义 65 AcDbBlockTableRecordIterator *pIterator; 66 pBlockDef->newIterator(pIterator); 67 68 //遍历属性定义 69 AcDbEntity *pEnt; 70 AcDbAttributeDefinition *pAttdef; 71 for (pIterator->start(); !pIterator->done(); pIterator->step()) 72 { 73 //获得下一个实体 74 pIterator->getEntity(pEnt, AcDb::kForRead); 75 76 //判断是否是属性定义 77 pAttdef = AcDbAttributeDefinition::cast(pEnt); 78 79 if (pAttdef != NULL && !pAttdef->isConstant()) 80 { 81 //实体是属性定义,创建一个属性实体 82 AcDbAttribute *pAtt = new AcDbAttribute(); 83 pAtt->setPropertiesFrom(pAttdef); 84 pAtt->setInvisible(pAttdef->isInvisible()); 85 86 //通过块引用获得属性 87 //为了保证正确性,应该对整个块进行操作 88 basePoint = pAttdef->position(); 89 basePoint += pBlkRef->position().asVector(); 90 pAtt->setPosition(basePoint); 91 92 pAtt->setHeight(pAttdef->height()); 93 pAtt->setRotation(pAttdef->rotation()); 94 95 pAtt->setTag(L"标记"); 96 pAtt->setFieldLength(25); 97 98 ACHAR *pStr = pAttdef->tag(); 99 pAtt->setTag(pStr); 100 free(pStr); 101 102 pAtt->setFieldLength(pAttdef->fieldLength()); 103 104 //显示数据库列的值 105 //在使用insert命令时显示如下提示 106 pAtt->setTextString(L"Assigned Attribute Value"); 107 108 AcDbObjectId attId; 109 110 pBlkRef->appendAttribute(attId, pAtt); 111 pAtt->close(); 112 } 113 pEnt->close(); 114 } 115 116 //删除遍历器并关闭对象 117 delete pIterator; 118 pBlockDef->close(); 119 pBlkRef->close(); 120 }
对块表进行遍历
View Code
1 static void lzxARX_AcDbDatabasePrintAll(void) 2 { 3 //获得用户输入的块名 4 int rc; 5 ACHAR blkName[50]; 6 rc = acedGetString(Adesk::kTrue, L"Enter Block Name <CR for current space>: ", blkName); 7 8 //如果获得块名操作失败,则返回 9 if (rc != RTNORM) 10 return; 11 12 //如果用户输入的块名为空 13 if (blkName[0] == '\0') 14 { 15 //对TILEMODE系统变量进行判断 16 //TILEMODE 将“模型”选项卡或上一个布局选项卡置为当前。 17 //0 激活最后一个布局选项卡(图纸空间) 18 //1 激活“模型”选项卡 相关主题 设定模型空间视口 19 if (acdbHostApplicationServices()->workingDatabase()->tilemode() == Adesk::kFalse) 20 { 21 struct resbuf rb; 22 acedGetVar(L"cvport", &rb); 23 if (rb.resval.rint == 1) 24 { 25 _tcscpy(blkName, ACDB_PAPER_SPACE); 26 } 27 else 28 { 29 _tcscpy(blkName, ACDB_MODEL_SPACE); 30 } 31 } 32 else 33 { 34 _tcscpy(blkName, ACDB_MODEL_SPACE); 35 } 36 } 37 38 //获得当前块表 39 AcDbBlockTable *pBlockTable; 40 acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead); 41 42 //获得用户输入名称的块表记录 43 AcDbBlockTableRecord *pBlockTableRecord; 44 pBlockTable->getAt(blkName, pBlockTableRecord, AcDb::kForRead); 45 pBlockTable->close(); 46 47 //创建新的遍历器 48 AcDbBlockTableRecordIterator *pBlockIterator; 49 pBlockTableRecord->newIterator(pBlockIterator); 50 51 //对获得的块进行遍历 52 for (; !pBlockIterator->done(); pBlockIterator->step()) 53 { 54 //获得块中实体 55 AcDbEntity *pEntity; 56 pBlockIterator->getEntity(pEntity, AcDb::kForRead); 57 58 //获得实体的句柄 59 AcDbHandle objHandle; 60 pEntity->getAcDbHandle(objHandle); 61 62 //获得实体所属的类 63 ACHAR handleStr[20]; 64 objHandle.getIntoAsciiBuffer(handleStr); 65 const ACHAR *pCname = pEntity->isA()->name(); 66 67 //输出实体的信息 68 acutPrintf(L"Object Id %lx, handle %s, class %s.\n", pEntity->objectId(), handleStr, pCname); 69 70 //关闭实体 71 pEntity->close(); 72 } 73 74 //删除遍历器并关闭对象 75 delete pBlockIterator; 76 pBlockTableRecord->close(); 77 78 //输出回车 79 acutPrintf(L"\n"); 80 }