块与属性块

创建图块(块中包含两条直线和一个圆)

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     }


 

原文地址:https://www.cnblogs.com/lzx838/p/2669184.html