关于objectArx /CAD二次开发中“属性块”操作

属性块就是在图块上附加一些文字属性(Attribute),这些文字可以非常方便地修改。属性块被广泛应用在工程设计和机械设计中,在工程设计中会用属性块来设计轴号、门窗、水暖电设备等,在机械设计中会应用于粗糙度符号定制、图框标题栏、明细表等。例如建筑图中的轴号就是同一个图块

objectArx /CAD二次开发中常见的“属性块”操作有
1.创建属性块
2.插入属性块
3.向现有的块参照中追加属性
4.读取块中属性值
5.修改块中属性值
6.判断块中是否包含某标识的属性
1.创建属性块
创建一个带属性的块定义时,可直观地将“属性”看成一个直线一样的“实体”,将其附加到块表记录中即可。下面函数演示的是创建包含两条直线,一个圆以及属性标志为“直径”,值为“20”的属性块定义。

bool yBlock::createBlockWithAtt(CString blkName)
{// 获得当前图形数据库的块表AcDbBlockTable *pBlkTbl = NULL;acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForWrite);// 创建新的块表记录AcDbBlockTableRecord *pBlkTblRcd ;Acad::ErrorStatus es = pBlkTbl->getAt(blkName, pBlkTblRcd, AcDb::kForRead);if (es == Acad::eOk){pBlkTbl->close();acutPrintf(_T("记录已经存在"));return false;}pBlkTblRcd->setName(blkName);// 将块表记录添加到块表中AcDbObjectId blkDefId;pBlkTbl->add(blkDefId, pBlkTblRcd);pBlkTbl->close();// 向块表记录中添加实体AcGePoint3d ptStart(-10, 0, 0), ptEnd(10, 0, 0);AcDbLine *pLine1 = new AcDbLine(ptStart, ptEnd);    // 创建一条直线ptStart.set(0, -10, 0);ptEnd.set(0, 10, 0);AcDbLine *pLine2 = new AcDbLine(ptStart, ptEnd);   // 创建一条直线AcGeVector3d vecNormal(0, 0, 1);AcDbCircle *pCircle = new AcDbCircle(AcGePoint3d::kOrigin, vecNormal, 6);// 创建一个属性  输入直径AcDbAttributeDefinition *pAttDef = new AcDbAttributeDefinition(ptEnd, TEXT("20"), TEXT("直径"), TEXT("输入直径"));AcDbObjectId entId;pBlkTblRcd->appendAcDbEntity(entId, pLine1);pBlkTblRcd->appendAcDbEntity(entId, pLine2);pBlkTblRcd->appendAcDbEntity(entId, pCircle);pBlkTblRcd->appendAcDbEntity(entId, pAttDef);// 关闭实体和块表记录pLine1->close();pLine2->close();pCircle->close();pAttDef->close();pBlkTblRcd->close();return true;
}

2.插入属性块
当数据库内存在属性块时,插入属性块与插入普通快有较大区别,其过程可描述为:
1.插入一个普通的块参照
2.遍历块参照中对应的块表记录,如果找到的记录是属性定义,则创建一个属性,属性参数来自于块记录,最后附加到块参照中。
下面函数展示的是掺入一个属性块,参数idBlkDef(块定义ID),ptInsert(属性块插入位置),返回属性块参照。

AcDbBlockReference* CreateAttBlkRef(const AcDbObjectId& idBlkDef, const AcGePoint3d& ptInsert)
{AcDbBlockReference* pBlkRef = new AcDbBlockReference(ptInsert, idBlkDef);//判断指定的块表是否包含属性定义AcDbBlockTableRecordPointer pBlkTblRcd(idBlkDef, AcDb::kForWrite);if (Acad::eOk != pBlkTblRcd.openStatus())return pBlkRef;if (!pBlkTblRcd->hasAttributeDefinitions())return pBlkRef;//创建块表记录遍历器,用于访问块定义中的所有实体AcDbBlockTableRecordIterator* pIter = NULL;Acad::ErrorStatus es = pBlkTblRcd->newIterator(pIter);if (Acad::eOk != es)return pBlkRef;for (pIter->start(); !pIter->done(); pIter->step()){AcDbEntity* pEnt = NULL;if (Acad::eOk != pIter->getEntity(pEnt, AcDb::kForRead))continue;//如果是属性定义,就向块参照添加属性AcDbAttributeDefinition* pAttDef = AcDbAttributeDefinition::cast(pEnt);if (pAttDef != NULL){//创建一个新的属性对象AcDbAttribute* pAtt = new AcDbAttribute();//从属性定义获得属性对象的对象特征pAtt->setPropertiesFrom(pBlkRef);pAtt->setLayer(pBlkRef->layerId());//设置属性对象的其它特性pAtt->setInvisible(pAttDef->isInvisible());pAtt->setPosition(pAttDef->position());pAtt->setHeight(pAttDef->height());pAtt->setWidthFactor(pAttDef->widthFactor());pAtt->setRotation(pAttDef->rotation());pAtt->setHorizontalMode(pAttDef->horizontalMode());pAtt->setVerticalMode(pAttDef->verticalMode());pAtt->setAlignmentPoint(pAttDef->alignmentPoint());pAtt->setTextStyle(pAttDef->textStyle());pAtt->setAttributeFromBlock(pBlkRef->blockTransform());//获得属性对象的Tag、Prompt和TextStringpAtt->setTag(pAttDef->tagConst());pAtt->setFieldLength(pAttDef->fieldLength());pAtt->setTextString(pAttDef->textStringConst());//设置颜色pAtt->setColorIndex(pAttDef->colorIndex());//向块参照追加属性对象pBlkRef->appendAttribute(pAtt);pAtt->close();}pEnt->close();}DEL(pIter);return pBlkRef;
}

3.向现有的块参照中追加属性
当数据库中已经创建了块参照,而块参照中并无属性,以下函数展示了像现有的块参照中追加属性,注意,该块参照追加属性后,再插入一个新的同名块时,属性也存在块定义中了。
参数:blkRefId(块参照ID),ptPos(属性在块参照中的位置),strTag(属性标志)
prompt(属性提示字符串),strValue(属性值),textHeight(属性文字高度),textStyle(属性文字样式)

bool AppendBlkAttribute(AcDbObjectId &blkRefId, AcGePoint3d ptPos, CString strTag, CString prompt, CString strValue,double textHeight, AcDbObjectId textStyle)
{if (!blkRefId.isValid()){return false;}//AcDbObjectPointer<AcDbBlockReference> pBlkRef(blkRefId, AcDb::kForWrite);if (pBlkRef == NULL){return false;}AcDbObjectId blkTblRcdId = pBlkRef->blockTableRecord();AcDbObjectPointer<AcDbBlockTableRecord> pBlkTblRcd(blkTblRcdId, AcDb::kForWrite);AcDbBlockTableRecordIterator* pIter = NULL;if (Acad::eOk != pBlkTblRcd->newIterator(pIter) || NULL == pIter)return false;int nRs = 0;for (pIter->start(); !pIter->done(); pIter->step()){AcDbObjectId attId;if (Acad::eOk != pIter->getEntityId(attId))continue;AcDbObjectPointer<AcDbAttributeDefinition> pDef(attId, AcDb::kForRead);if (Acad::eOk != pDef.openStatus())continue;CString strText;CString strTagT = pDef->tagConst();if (strTagT.Compare(strTag) == 0){//pDef->setPrompt(strPro);strText = pDef->textStringConst();return true;}}//添加属性AcDbAttributeDefinition *pAttDef = new AcDbAttributeDefinition(ptPos, strValue, strTag,prompt);pAttDef->setHeight(textHeight);pAttDef->setInvisible(false);pAttDef->setTextStyle(textStyle);//pAttDef->setVisibility(AcDb::Visibility::kInvisible);Acad::ErrorStatus es = pBlkTblRcd->appendAcDbEntity(pAttDef);pAttDef->close();if (es == Acad::eOk){AcDbAttribute *pAtt = new AcDbAttribute(ptPos, strValue, strTag);pAtt->setInvisible(false);pBlkRef->appendAttribute(pAtt);pAtt->close();}return false;
}

4.读取块中属性值
以下函数展示了获取块参照的属性标志以及对应的属性值
参数:idRef(块参照ID)

std::map<CString, CString> GetAttInfoOnBlkRef(const AcDbObjectId& idRef)
{std::map<CString, CString> maptag;AcDbObjectPointer<AcDbBlockReference> pBlkRef(idRef, AcDb::kForRead);if (pBlkRef.openStatus() != Acad::eOk)return maptag;AcDbObjectIterator* pIter = pBlkRef->attributeIterator();if (!pIter)return maptag;for (pIter->start(); !pIter->done(); pIter->step()){AcDbObjectId attId = pIter->objectId();AcDbAttribute* pAtt = NULL;if (pBlkRef->openAttribute(pAtt, attId, AcDb::kForRead) != Acad::eOk)continue;maptag.insert(std::pair<CString, CString>(pAtt->tagConst(), pAtt->textStringConst()));pAtt->close();}DEL(pIter);return maptag;
}

5.修改块中属性值
以下函数展示了设置属性块某个标志的值
参数:idRef(块参照ID),szTag(属性标志),szText(属性值)

bool SetAttTextOnBlkRef(const AcDbObjectId& idRef, LPCTSTR szTag, LPCTSTR szText)
{AcDbObjectPointer<AcDbBlockReference> pBlkRef(idRef, AcDb::kForWrite);if (pBlkRef.openStatus() != Acad::eOk)return false;AcDbObjectIterator* pIter = pBlkRef->attributeIterator();if (!pIter)return false;bool bFlag = false;for (pIter->start(); !pIter->done(); pIter->step()){AcDbObjectId attId = pIter->objectId();AcDbAttribute* pAtt = NULL;if (pBlkRef->openAttribute(pAtt, attId, AcDb::kForWrite) != Acad::eOk)continue;CString strTempTag = pAtt->tagConst();if (_tcsicmp(szTag, strTempTag) == 0){pAtt->setTextString(szText);pAtt->close();bFlag = true;break;}pAtt->close();}DEL(pIter);return bFlag;
}

6.判断块中是否包含某个标识的属性
以下函数展示了判断一个块中是否包含了标识为szTag的属性
参数:pBlkRef(块参照),szAttName(属性标志)

bool IsExistAtt(AcDbBlockReference* pBlkRef, LPCTSTR szAttName)
{AcDbObjectIterator* pIter = pBlkRef->attributeIterator();if (!pIter)return false;for (pIter->start(); !pIter->done(); pIter->step()){AcDbObjectId attId = pIter->objectId();AcDbAttribute* pAtt = NULL;if (pBlkRef->openAttribute(pAtt, attId, AcDb::kForRead) != Acad::eOk)continue;CString strTempTag = pAtt->tagConst();if (_tcsicmp(szAttName, strTempTag) == 0){pAtt->close();DEL(pIter);return true;}pAtt->close();}DEL(pIter);return false;
}

关于objectArx /CAD二次开发中“属性块”操作相关推荐

  1. 关于objectArx /CAD二次开发中“绘制点、线、圆、圆弧、多段线、矩形、文字等”

    使用CAD软件绘图时,所有的图元均可由点.线.圆.圆弧.多段线.文字等构成,使用objectArx绘制图元时可调用相应的接口函数,如AcDbLine绘制直线. 1.绘制点 参数:pt(点的位置) Ac ...

  2. 使用C#中的AutoCAD .NET API对CAD二次开发,获取块的属性

    使用C#中的AutoCAD .NET API对CAD二次开发,获取块的属性 /// <summary> /// 获得块对象的所有属性 /// </summary> public ...

  3. lisp陡坎程序_(终稿)毕业论文设计_Autolisp在CAD二次开发中的应用.doc(最终版)最新版...

    <毕业论文:Autolisp在CAD二次开发中的应用.doc>由会员分享,可免费在线阅读全文,更多与<(终稿)毕业论文设计_Autolisp在CAD二次开发中的应用.doc(最终版) ...

  4. c# cad 二次开发 类库 netload 图层操作、创建图层、删除图层、设置当前图层等

    c# cad 二次开发 类库 netload 图层操作.创建图层.删除图层.设置当前图层等 using Autodesk.AutoCAD.ApplicationServices; using Auto ...

  5. intersect 相交 范围_关于CAD二次开发中(范围线自相交)相交线的问题

    CAD二次开发对于毕业没多久,又是半路出家的我来说,是一个很大的挑战,遇到过很多难以解决的问题,这次在CAD二次开发遇到一个很苦恼的问题:判断 一个由线段组成的闭合区域中,是否存在着相互之间相交的线段 ...

  6. C#之CAD二次开发实例 (13) 图层操作

    # 0. 引言 图层在CAD中也是一个重要的角色,自然而然二次开发也必不可少,先来回顾一下图形数据库,也就是下面这个东西 Database db = HostApplicationServices.W ...

  7. Cad二次开发中使经常使用的线性和线型

    acad_iso03w100 - 这是一种标准的 ISO 线型,用于绘制等距投影.它包括了一系列平行的虚线段,用于表示不同的深度和高度. DASH - 这是一种常见的实线虚线混合线型,它由一系列连续的 ...

  8. C# Cad二次开发新手入门系列教程(二)Line对象

    目录 Line对象说明 创建一个Line对象 Line对象说明 Line对象为CAD中的直线,什么是直线,严格来说CAD中的直线并非数学中定义的直线,实际上CAD的直线只是一个线段而已!那么在数学上我 ...

  9. c#CAD二次开发全套视频目录

    本人非专业编程人员,设计院画图民工一名.自学CAD编程,也写了一些小程序!初期学习lisp编程语言,基本了解CAD各中开发模块,写过一些程序!前段时间自学C#CAD二次开发,遍布网上无教学视频.经过自 ...

最新文章

  1. (linux) Firefox is already running, but is not responding解决方法
  2. 大乐斗2服务器维护,2月23日更新公告
  3. linux grep命令详解_Linux 上USB 调试神器lsusb命令详解
  4. 开发函数计算的正确姿势——借助 Ghostscript 将 PDF 转换成 JPG
  5. CentOS上快速安装Oracle服务器脚本
  6. 【docker】docker Portainer容器可视化管理工具使用文档
  7. mfc多线程编程实例_多线程技术的PLC与PC的通讯方式
  8. 计算机网络按信息传输介质的性能来划分,第3章 计算机网络基础和 Internet 应用...
  9. Redis RDB和AOF总结
  10. java判断数组值类型,判断(1分) Java语言中的数组元素只能是基本数据类型而不能为对象类型。...
  11. 嵌入式linux入门六步曲
  12. Qt for WebAssembly 环境配置 - 知其然并知其所以然
  13. js判断数字,如果出现全角数字,将其转换为半角
  14. vue外卖十九:商家详情-底部购物车组件,购物车相关vuex状态设计、相关计算、清空购物车+滚动购物车
  15. DeepFashion2: 一个针对衣服图片的检测、姿态估计、分割和重认证多用途基准
  16. 设计用什么笔记本好?三大选择要点
  17. 如何git命令创建一个本地分支,并提交到远程(remote)
  18. 基于springboot小型命题系统毕业设计源码011508
  19. uniapp 手机端时禁止输入框弹出键盘,使用自定义键盘
  20. java 怎样卸载一个类_java 类型卸载问题

热门文章

  1. 微博第三方登录 php,php 网站使用微博第三方授权登录
  2. php7.0的新特性
  3. 触发器(基本的SR触发器、同步触发器、D触发器)
  4. ImageNet Classification with Deep Convolutional Neural Networks论文翻译——中文版
  5. Freeswitch 默认配置
  6. JSM之ActivityMQ
  7. git 重置用户名和密码
  8. 设置文件编译规则的makefile---配置编译器环境的c_pp_properties.json---设置的文本配置seting.json
  9. 与() 、或(|)、异或(^) 、取反(~) 运算
  10. SendMessage实现进程间通信