zoukankan      html  css  js  c++  java
  • 块与属性块

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

    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     }


     

  • 相关阅读:
    Post返回json值
    调用接口并获取放回json值
    c# 获取IP
    sqlserver2008不允许保存更改
    判断客户端是否是手机或者PC
    3.docker tomcat集群
    1.docker 安装
    Maven profiles 多环境配置
    MySQL 定时任务
    MyBatis 三剑客
  • 原文地址:https://www.cnblogs.com/lzx838/p/2669184.html
Copyright © 2011-2022 走看看