网站标签图片修改,seo网站概述,河南省监理建设协会网站,江西网站备案流程ObjectArx创建自定义块 一. 目的仿照AutoCad的Block命令#xff0c;实现简版创建块功能!二. 开发环境Win7操作系统#xff0c;AutoCad2012#xff0c; VS2008, ObjectArx_SDK_2012三. 相关函数简介1) int acedSSGet (const ACHAR *str, const void *pt1,const void *pt2…ObjectArx创建自定义块
一. 目的仿照AutoCad的Block命令实现简版创建块功能!二. 开发环境Win7操作系统AutoCad2012 VS2008, ObjectArx_SDK_2012三. 相关函数简介1) int acedSSGet (const ACHAR *str, const void *pt1,const void *pt2, const struct resbuf *filter,ads_name ss); 选择集个人理解就是让你一次可以选择多个实体与之相似的acedEntSel()一次只能选择一个实体2) int acedSSName (const ads_name ss, AdInt32 i, ads_name entres)既然选择了多个实体我怎么得到其中的每一个实体呢次函数即可让你得到选择实体中的任一个参数二相当于索引参数三就是还回的实体名3Acad::ErrorStatus acdbGetObjectId(AcDbObjectId objId,const ads_name objName);通过实体名获取实体ID与之相同的另外几个函数指针句柄ads_name之间的转换acdbopenAcDbEntityobjectidgetAcDbObjectacdbGetObjectidacdbGetAdsName等四.代码实现流程 1) 首先我们得获取实体保存这些实体的ID实现代码void MyBlock::GetPickEntity(AcDbObjectIdArray idObjectArray){ads_name adsName;AdInt32 ssLen;acedSSGet(NULL, NULL, NULL, NULL, adsName);acedSSLength(adsName, ssLen);idObjectArray.removeAll();for (INT32 i 0; i ssLen; i){ads_name entityName;acedSSName(adsName, i, entityName);AcDbObjectId entityID;acdbGetObjectId(entityID, entityName);idObjectArray.append(entityID); }acedSSFree(adsName);}2) 从当前块表中查看是否已存在此块名记录没有则创建新的块表记录将选择的实体Clone一份插入到新的块表记录中切记关闭所有的数据库对象实现代码代码有点渣Acad::ErrorStatus MyBlock::CreateBlock(const CString strBlockName, const AcDbObjectIdArray idObjectArray){AcDbBlockTable *pBlockTable NULL;Acad::ErrorStatus es acdbHostApplicationServices()-workingDatabase()-getBlockTable(pBlockTable, AcDb::kForRead);if (Acad::eOk ! es){return es;}if (Adesk::kTrue pBlockTable-has(strBlockName)){pBlockTable-close();return es;}AcDbBlockTableRecord *pBlockTableRcd new AcDbBlockTableRecord();es pBlockTableRcd-setName(strBlockName);es pBlockTableRcd-setOrigin(AcGePoint3d::kOrigin);es pBlockTable-upgradeOpen();if (Acad::eOk ! es){pBlockTableRcd-close();pBlockTable-close();return es;}es pBlockTable-add(pBlockTableRcd);if (Acad::eOk ! es){ pBlockTable-close();pBlockTableRcd-close();return es;}pBlockTable-close();AcGeMatrix3d mat;mat.setToIdentity();for (INT32 i 0; i idObjectArray.length(); i){AcDbEntity *pEntity NULL;es acdbOpenAcDbEntity(pEntity, idObjectArray.at(i), AcDb::kForRead);if (Acad::eOk ! es){acDocManager-unlockDocument(curDoc());pBlockTableRcd-close();return es;}AcDbEntity *pNewEntity AcDbEntity::cast(pEntity-clone());es pBlockTableRcd-appendAcDbEntity(pNewEntity);if (Acad::eOk ! es){acDocManager-unlockDocument(curDoc());pBlockTableRcd-close();pEntity-close();pNewEntity-close();return es;}pEntity-close();pNewEntity-close();}pBlockTableRcd-close();return es;}三.创建非模式对话框继承自CAcUiDialog类 具体添加一些控件与消息响应以及还未完成的非模式对话框销毁(DestoryWindow)就不一一叙述了五. 成果截图 1执行自定义命令点击拾取我这里选择3条边与一个圆总共4个对象joke为新块名然后点击创建2在命令提示符输入指令insert即可预览刚才创建的新块3点击确定即可在Cad工作区添加此块然后可点击颜色如下:4)这里我先则蓝色即可改变刚才插入新块的颜色:六. 源码 源码地址http://download.csdn.net/detail/u012158162/9795717七 后序 A. 由于个人技术原因以及刚接触Cad与ObjectArx几天其中难免有些胡说八道请见谅B. 程序中修改块的颜色存在Bug以及没对MFC的对话框销毁做处理C. 祝大家学习是艰辛的生活是快乐的