找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
楼主: admin

ObjectArx图层操作封装

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-5-4 19:22:25 | 显示全部楼层
  1. oid MFC采用TEST::deleteObjectsOnLayer(const ACHAR* layerName)
  2. {
  3.     AcDbDatabase* pDatabase = acdbHostApplicationServices()->workingDatabase();
  4.     AcDbLayerTable* pLayerTable;
  5.     pDatabase->getLayerTable(pLayerTable, AcDb::kForRead);
  6.     AcDbLayerTableRecord* pLayerRecord;
  7.     if (pLayerTable->getAt(layerName, pLayerRecord, AcDb::kForRead) == Acad::eOk)
  8.     {
  9.         // 获取图层的 Object ID
  10.         AcDbObjectId layerId = pLayerRecord->objectId();
  11.         pLayerRecord->close();
  12.         AcDbBlockTable* pBlockTable;
  13.         pDatabase->getBlockTable(pBlockTable, AcDb::kForRead);
  14.         AcDbBlockTableRecord* pBlockTableRecord;
  15.         if (pBlockTable->getAt(ACDB采用MODEL采用SPACE, pBlockTableRecord, AcDb::kForWrite) == Acad::eOk)
  16.         {
  17.             // 遍历模型空间中的所有实体
  18.             AcDbBlockTableRecordIterator* pIterator;
  19.             pBlockTableRecord->newIterator(pIterator);
  20.             for (; !pIterator->done(); pIterator->step())
  21.             {
  22.                 AcDbEntity* pEntity;
  23.                 if (pIterator->getEntity(pEntity, AcDb::kForWrite) == Acad::eOk)
  24.                 {
  25.                     // 检查实体所在的图层是否为指定图层
  26.                     if (pEntity->layerId() == layerId)
  27.                     {
  28.                         // 删除实体
  29.                         pEntity->erase();
  30.                     }
  31.                     pEntity->close();
  32.                 }
  33.             }
  34.             delete pIterator;
  35.             pBlockTableRecord->close();
  36.         }
  37.         pBlockTable->close();
  38.     }
  39.     pLayerTable->close();
  40. }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-5-4 19:22:39 | 显示全部楼层
  1.         // 新建一个图层
  2.         void CLayerOperator::NewLayer(ACHAR* layerName)
  3.         {
  4.             //获得当前图形的层表
  5.             AcDbLayerTable *pLayerTbl;
  6.             acdbHostApplicationServices()
  7.                 ->workingDatabase()
  8.                 ->getLayerTable(pLayerTbl,AcDb::kForWrite);
  9.     //是否已经包含指定的层表记录
  10.     if(pLayerTbl->has(layerName)){
  11.         pLayerTbl->close();
  12.         acedPrompt(采用T("对应名称的图层已经存在!"));
  13.         return;
  14.     }
  15.     //创建层表记录
  16.     AcDbLayerTableRecord *pLayerTblRcd;
  17.     pLayerTblRcd=new AcDbLayerTableRecord();
  18.     pLayerTblRcd->setName(layerName);        //这里的layerName需要用(采用T("?"))这种格式来命名
  19.     //将新建的层表记录添加到层表中
  20.     AcDbObjectId layerTblRcdId;
  21.     pLayerTbl->add(layerTblRcdId,pLayerTblRcd);
  22.     //设置图形的当前图层
  23.     acdbHostApplicationServices()
  24.         ->workingDatabase()
  25.         ->setClayer(layerTblRcdId);
  26.         //关闭层表
  27.     pLayerTblRcd->close();
  28.     pLayerTbl->close();
  29.         }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-5-4 19:22:47 | 显示全部楼层
  1. // 使用图形对话框设置指定图层的颜色
  2. void CLayerOperator::SetLayerColor(ACHAR* layerName)
  3. {
  4.     //获得当前图形的层表
  5.     AcDbLayerTable *pLayerTbl;
  6.     acdbHostApplicationServices()
  7.         ->workingDatabase()
  8.         ->getLayerTable(pLayerTbl,AcDb::kForRead);
  9.     //判断是否包含指定名称的层表记录
  10.     if(!pLayerTbl->has(layerName)){
  11.         pLayerTbl->close();
  12.         return;
  13.     }
  14.     //获得指定层表记录的指针
  15.     AcDbLayerTableRecord *pLayerTblRcd;
  16.     pLayerTbl->getAt(layerName,pLayerTblRcd,AcDb::kForWrite);
  17.     //弹出“颜色”对话框
  18.     AcCmColor oldColor=pLayerTblRcd->color();
  19.     //图层修改前的颜色
  20.     int nCurColor=oldColor.colorIndex();
  21.     //用户选择的颜色
  22.     int nNewColor=oldColor.colorIndex();
  23.     if(acedSetColorDialog(nNewColor,Adesk::kFalse,nCurColor)){
  24.         AcCmColor color;
  25.         color.setColorIndex(nNewColor);
  26.         pLayerTblRcd->setColor(color);
  27.     }
  28.     //关闭层表
  29.     pLayerTblRcd->close();
  30.     pLayerTbl->close();
  31. }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-5-4 19:22:54 | 显示全部楼层
  1. // 删除一个图层
  2. void CLayerOperator::DelLayer(ACHAR* layerName)
  3. {
  4.     //获得当前图形的层表
  5.     AcDbLayerTable *pLayerTbl;
  6.     acdbHostApplicationServices()
  7.         ->workingDatabase()
  8.         ->getLayerTable(pLayerTbl,AcDb::kForRead);
  9.     //判断是否包含指定名称的层表记录
  10.     if(!pLayerTbl->has(layerName)){
  11.         pLayerTbl->close();
  12.         return;
  13.     }
  14.     //获得指定层表记录的指针
  15.     AcDbLayerTableRecord *pLayerTblRcd;
  16.     pLayerTbl->getAt(layerName,pLayerTblRcd,AcDb::kForWrite);
  17.     //为其设置“删除”标记
  18.     pLayerTblRcd->erase();
  19.     pLayerTblRcd->close();                //关闭层表
  20.     pLayerTbl->close();
  21. }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-5-4 19:23:38 | 显示全部楼层
  1. //获取指定图层上所有实体ID
  2. 2 AcDbObjectIdArray GetAllEntityId(const TCHAR* layername)
  3. 3 {
  4. 4     AcDbObjectIdArray entIds;
  5. 5     bool bFilterlayer = false;
  6. 6     AcDbObjectId layerId;
  7. 7     //获取指定图层对象ID
  8. 8     if (layername != NULL)
  9. 9     {
  10. 10         AcDbLayerTable *pLayerTbl = NULL;
  11. 11         acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pLayerTbl, AcDb::kForRead);
  12. 12         if (!pLayerTbl->has(layername))
  13. 13         {
  14. 14             pLayerTbl->close();
  15. 15             return entIds;
  16. 16         }
  17. 17         pLayerTbl->getAt(layername, layerId);
  18. 18         pLayerTbl->close();
  19. 19         bFilterlayer = true;
  20. 20     }
  21. 21     //获得块表
  22. 22     AcDbBlockTable *pBlkTbl = NULL;
  23. 23     acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlkTbl, AcDb::kForRead);
  24. 24     //块表记录
  25. 25     AcDbBlockTableRecord *pBlkTblRcd = NULL;
  26. 26     pBlkTbl->getAt(ACDB采用MODEL采用SPACE, pBlkTblRcd, AcDb::kForRead);
  27. 27     pBlkTbl->close();
  28. 28     //创建遍历器,依次访问模型空间中的每一个实体
  29. 29     AcDbBlockTableRecordIterator *it = NULL;
  30. 30     pBlkTblRcd->newIterator(it);
  31. 31     for (it->start(); !it->done(); it->step())
  32. 32     {
  33. 33         AcDbEntity *pEnt = NULL;
  34. 34         Acad::ErrorStatus es = it->getEntity(pEnt, AcDb::kForRead);
  35. 35         if (es == Acad::eOk)
  36. 36         {
  37. 37             if (bFilterlayer)//过滤图层
  38. 38             {
  39. 39                 if (pEnt->layerId() == layerId)
  40. 40                 {
  41. 41                     entIds.append(pEnt->objectId());
  42. 42                 }
  43. 43             }
  44. 44             else
  45. 45             {
  46. 46             //    entIds.append(pEnt->objectId());
  47. 47                 pEnt->close();
  48. 48             }
  49. 49         }
  50. 50     }
  51. 51     delete it;
  52. 52     pBlkTblRcd->close();
  53. 53     return entIds;
  54. 54 }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-5-4 19:24:28 | 显示全部楼层
  1. #pragma once
  2. class Layer
  3. {
  4. public:
  5.         Layer();
  6.         ~Layer();
  7.         // 添加图层:图层名(其实是层表记录的name值)、颜色索引值
  8.         static AcDbObjectId Add(const ACHAR *name, int colorIndex = 7);
  9.         // 获取图层id:图层名
  10.         static AcDbObjectId GetLayerId(const ACHAR *name);
  11.         // 设置图层颜色:图层名、颜色索引值
  12.         static bool  SetColor(const ACHAR *name, int colorIndex);
  13.         // 获取 所有 层表记录id 的 列表
  14.         static void GetLayerList(AcDbObjectIdArray &layIds);
  15. };
  16. #include "stdafx.h"
  17. #include "Layer.h"
  18. Layer::Layer(){}
  19. Layer::~Layer(){}
  20. // 添加图层:图层名(其实是层表记录的name值)、颜色索引值
  21. AcDbObjectId Layer::Add(const ACHAR *name, int colorIndex)
  22. {        // 断言图层名不为空、颜色索引值在范围内
  23.         assert(name != NULL);
  24.         assert(colorIndex >= 1 && colorIndex <= 255);
  25.         AcDbObjectId layerId;
  26.         // 获得层表指针
  27.         AcDbLayerTable *pLayTbl = NULL;
  28.         acdbHostApplicationServices()->workingDatabase()->
  29.                                 getLayerTable(pLayTbl, AcDb::kForWrite);
  30.         // 检索层表:通过图层名判断是否有图层(has其实调用了getIdAt)
  31.         if (!pLayTbl->has(name))
  32.         {        // 新建块表记录:设置层名
  33.                 AcDbLayerTableRecord *pLayTblRcd = new AcDbLayerTableRecord();
  34.                 pLayTblRcd->setName(name);
  35.                 // 新建颜色对象:设置颜色索引值,添加进层表记录
  36.                 AcCmColor color;
  37.                 color.setColorIndex(colorIndex);
  38.                 pLayTblRcd->setColor(color);
  39.                 // 将层表记录添加进层表中,存储层表记录id,关闭层表记录
  40.                 pLayTbl->add(pLayTblRcd);
  41.                 layerId = pLayTblRcd->objectId();
  42.                 pLayTblRcd->close();
  43.         }
  44.         // 图层名已存在,打印
  45.         else
  46.         {
  47.                 acutPrintf(采用T("\n图层%s已存在"), name);
  48.         }
  49.         pLayTbl->close();
  50.         return layerId;
  51. }
  52. // 获取图层id:图层名
  53. AcDbObjectId Layer::GetLayerId(const ACHAR *name)
  54. {        // 断言图层名不为空
  55.         assert(name != NULL);
  56.         AcDbLayerTable *pLayerTbl = NULL;
  57.         acdbHostApplicationServices()->workingDatabase()->
  58.                                 getLayerTable(pLayerTbl, AcDb::kForRead);
  59.         AcDbObjectId layerId = AcDbObjectId::kNull;
  60.         if (pLayerTbl->has(name))
  61.         {        // getAt方法获得图层id并赋值layerId
  62.                 pLayerTbl->getAt(name, layerId);
  63.         }
  64.         pLayerTbl->close();
  65.         // 若没有则为默认值kNull
  66.         return layerId;
  67. }
  68. // 设置图层颜色:图层名、颜色索引值
  69. bool Layer::SetColor(const ACHAR *name, int colorIndex)
  70. {        // 调用本类的方法获得图层id
  71.         AcDbObjectId layerId = GetLayerId(name);
  72.         bool bRet = false;
  73.         AcDbLayerTableRecord *pLayRcd = NULL;
  74.         // 获得层表记录指针
  75.         if (acdbOpenObject(pLayRcd, layerId, AcDb::kForWrite) == Acad::eOk)
  76.         {        // 设置颜色
  77.                 AcCmColor color;
  78.                 color.setColorIndex(colorIndex);
  79.                 // 层表记录修改颜色
  80.                 pLayRcd->setColor(color);
  81.                 bRet = true;
  82.                 pLayRcd->close();
  83.         }
  84.         return bRet;
  85. }
  86. // 获取 所有 层表记录id 的 列表
  87. void Layer::GetLayerList(AcDbObjectIdArray &layIds)
  88. {        // 获得层表对象指针、获得层表遍历器指针
  89.         AcDbLayerTable *pLayTbl = NULL;
  90.         acdbHostApplicationServices()->workingDatabase()->
  91.                                                 getLayerTable(pLayTbl, AcDb::kForRead);
  92.         AcDbLayerTableIterator *pItr = NULL;
  93.         pLayTbl->newIterator(pItr);
  94.         AcDbLayerTableRecord *pLayerTblRcd = NULL;
  95.         // 层表遍历器遍历获取每个层表记录对象指针
  96.         for (pItr->start();!pItr->done();pItr->step())
  97.         {
  98.                 if (pItr->getRecord(pLayerTblRcd, AcDb::kForRead) == Acad::eOk)
  99.                 {        // 将每个层表记录id累加到层表记录id列表中
  100.                         layIds.append(pLayerTblRcd->objectId());
  101.                         pLayerTblRcd->close();
  102.                 }
  103.         }
  104.         delete pItr;
  105.         pLayTbl->close();
  106. }
  107. #include "StdAfx.h"
  108. void AddCommands();
  109. void CreateLayer();
  110. void SetLayerColor();
  111. void DeleteLayer();
  112. void ExportLayer();
  113. void ImPortLayer();
  114. #include "StdAfx.h"
  115. #include "Commands.h"
  116. #include "Editor.h"
  117. #include "Layer.h"
  118. #include <vector>
  119. #include "ConvertUtil.h"
  120. #include "TextFileUtil.h"
  121. #include "StringUtil.h"
  122. void AddCommands()
  123. {        // 新建图层
  124.         Editor::AddCommand(L"Add", ACRX采用CMD采用MODAL, CreateLayer);
  125.         // 修改图层颜色
  126.         Editor::AddCommand(L"setcolor", ACRX采用CMD采用MODAL, SetLayerColor);
  127.         // 删除图层
  128.         Editor::AddCommand(L"delete", ACRX采用CMD采用MODAL, DeleteLayer);
  129.         // 导出图层到文件
  130.         Editor::AddCommand(L"exportlayer", ACRX采用CMD采用MODAL, ExportLayer);
  131.         // 导入图层到文件
  132.         Editor::AddCommand(L"importlayer", ACRX采用CMD采用MODAL, ImPortLayer);
  133. }
  134. // 添加图层
  135. void CreateLayer()
  136. {
  137.         ACHAR layerName[128];
  138.         if (acedGetString(NULL, 采用T("\n输入图层名:"), layerName) != RTNORM)
  139.         {
  140.                 return;
  141.         }
  142.         Layer::Add(layerName);
  143. }
  144. // 设置图层颜色
  145. void SetLayerColor()
  146. {
  147.         ACHAR layerName[128];
  148.         // 交互输入字符串:是否允许空格、提示信息、接收字符串的变量
  149.         if (acedGetString(NULL, 采用T("\n输入图层名:"), layerName) != RTNORM)
  150.         {
  151.                 return;
  152.         }
  153.         // 获得层名对应的id
  154.         AcDbObjectId layerId = Layer::GetLayerId(layerName);
  155.         if (layerId != AcDbObjectId::kNull)
  156.         {        // 调出颜色选项板:接收选择的颜色索引、是否开启随层随块选项、默认颜色索引
  157.                 int newColor;
  158.                 if (acedSetColorDialog(newColor, Adesk::kFalse, 1))
  159.                 {
  160.                         Layer::SetColor(layerName, newColor);
  161.                 }
  162.         }
  163.         else
  164.         {
  165.                 acutPrintf(采用T("\n查无此图层!"));
  166.         }
  167. }
  168. // 删除图层
  169. void DeleteLayer()
  170. {
  171.         ACHAR layerName[128];
  172.         if (acedGetString(NULL, 采用T("\n请输入待删除的图层名:"), layerName) != RTNORM)
  173.                 return;
  174.         AcDbObjectId layerId = Layer::GetLayerId(layerName);
  175.         if (layerId != AcDbObjectId::kNull)
  176.         {
  177.                 AcDbLayerTableRecord *pRcd = NULL;
  178.                 if (acdbOpenObject(pRcd, layerId, AcDb::kForWrite) == Acad::eOk)
  179.                 {        // 删除操作,只是在层表记录上打个标记,关闭文件时永久写入
  180.                         pRcd->erase();
  181.                         pRcd->close();
  182.                 }
  183.         }
  184.         else
  185.                 acutPrintf(采用T("\n查无此图层!"));
  186. }
  187. // 导出层表文件到桌面
  188. void ExportLayer()
  189. {        // 获取层表所有层表记录id
  190.         AcDbObjectIdArray layIds;
  191.         Layer::GetLayerList(layIds);
  192.         // TextFileUtil::ToFile函数的第二个参数
  193.         std::vector<CString>layLines;
  194.         // 获得并操作每个层表记录对象指针:通过传入的layIds
  195.         for (int i = 0; i < layIds.length(); i++)
  196.         {        // 获取当前循环的层表记录
  197.                 AcDbLayerTableRecord *pLayRcd = NULL;
  198.                 if (acdbOpenObject(pLayRcd, layIds.at(i), AcDb::kForRead) == Acad::eOk)
  199.                 {        // 当前层表信息容器:获取当前层表记录的所有信息
  200.                         std::vector<CString>layInfos;
  201.                         // 层表记录名称
  202.                         ACHAR *szLayerName;
  203.                         pLayRcd->getName(szLayerName);
  204.                         layInfos.push采用back(szLayerName);
  205.                         acutDelString(szLayerName);        // 释放指针
  206.                         // 层表记录颜色
  207.                         AcCmColor col = pLayRcd->color();
  208.                         layInfos.push采用back(ConvertUtil::ToString(col.colorIndex()));
  209.                         // 层表记录->线型id->名称
  210.                         AcDbLinetypeTableRecord *pLineTypeRcd = NULL;
  211.                         acdbOpenObject(pLineTypeRcd, pLayRcd->linetypeObjectId(), AcDb::kForRead);
  212.                         ACHAR *szLinetypeName;
  213.                         pLineTypeRcd->getName(szLinetypeName);
  214.                         pLineTypeRcd->close();
  215.                         layInfos.push采用back(szLinetypeName);
  216.                         acutDelString(szLinetypeName);        // 释放指针
  217.                         // 层表记录线宽
  218.                         AcDb::LineWeight lineWeight = pLayRcd->lineWeight();
  219.                         int nVal = (int)lineWeight;
  220.                         layInfos.push采用back(ConvertUtil::ToString(nVal));
  221.                         // 当前层表信息容器 拼接成 字符串,加到layIds
  222.                         CString strLayer = StringUtil::Join(layInfos, 采用T(","));
  223.                         layLines.push采用back(strLayer);
  224.                         pLayRcd->close();
  225.                 }
  226.         }
  227.         // 新建桌面文件并接收layLines
  228.         TextFileUtil::ToFile(采用T("C:\\Users\\Administrator\\Desktop\\test.txt"), layLines);
  229. }
  230. void ImPortLayer()
  231. {
  232.         std::vector<CString>lines;
  233.         CString fileName = 采用T("C:\\Users\\Administrator\\Desktop\\test.txt");
  234.         // cstring类有隐式类型转换方法:将cstring转为const achar*类型
  235.         if (TextFileUtil::FromFile(fileName, lines))
  236.         {        // 提取容器每个元素,并按 分隔符 切割字符串
  237.                 for (int i = 0; i < lines.size(); i++)
  238.                 {       
  239.                         std::vector<CString>layInfo;
  240.                         StringUtil::Split(lines.at(i), 采用T(","), layInfo);
  241.                         if (layInfo.size() == 4)
  242.                         {        // 检索层名:如果层表中没记录新增,有记录,不新增直接修改
  243.                                 CString layName = layInfo.at(0);
  244.                                 AcDbObjectId layId = Layer::GetLayerId(layName);
  245.                                 if (layId.isNull())
  246.                                 {
  247.                                         layId = Layer::Add(layName);
  248.                                 }
  249.                                 AcDbLayerTableRecord *pLayRcd = NULL;
  250.                                 if (acdbOpenObject(pLayRcd, layId, AcDb::kForWrite) == Acad::eOk)
  251.                                 {        // 修改颜色
  252.                                         AcCmColor col;
  253.                                         Adesk::UInt16 colorIndex = 采用ttoi(layInfo.at(1));
  254.                                         col.setColorIndex(colorIndex);
  255.                                         pLayRcd->setColor(col);
  256.                                         // 修改线型
  257.                                         AcDbLinetypeTable *pLinetypeTbl = NULL;
  258.                                         AcDbObjectId linetypeId;
  259.                                         // 打开线型表
  260.                                         acdbHostApplicationServices()->workingDatabase()->
  261.                                                                 getLinetypeTable(pLinetypeTbl, AcDb::kForRead);
  262.                                         // 检索线性表:如果有同名记录
  263.                                         if (pLinetypeTbl->has(layInfo.at(2)))
  264.                                         {        // 获得线型记录id
  265.                                                 pLinetypeTbl->getAt(layInfo.at(2), linetypeId);
  266.                                                 // 层表记录设置线型id
  267.                                                 pLayRcd->setLinetypeObjectId(linetypeId);
  268.                                         }
  269.                                         pLinetypeTbl->close();
  270.                                         // 修改线宽(采用ttoi能将CString转换成整形)
  271.                                         AcDb::LineWeight lineWeight =
  272.                                                                         (AcDb::LineWeight) 采用ttoi(layInfo.at(3));
  273.                                         pLayRcd->setLineWeight(lineWeight);
  274.                                         pLayRcd->close();
  275.                                 }
  276.                         }
  277.                 }
  278.         }
  279. }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-5-4 19:26:18 | 显示全部楼层
  1. ObjectARX选择图层的上所有实体
  2. Acad::ErrorStatus selectEntityInLayer(std::wstring nLayerName, AcDbObjectIdArray&  nIDs)
  3. {
  4.         Acad::ErrorStatus es = Acad::eOk;
  5.         ads采用name ents;
  6.         struct  resbuf  * rb;
  7.         rb = acutNewRb(AcDb::kDxfLayerName);
  8.         rb->restype = 8;
  9.         acutNewString(nLayerName.c采用str(), rb->resval.rstring);
  10.         rb->rbnext = NULL;
  11.         acedSSGet(L"X", NULL, NULL, rb, ents);
  12.         long  entNums = 0;
  13.         acedSSLength(ents, &entNums);
  14.         if (entNums == 0)
  15.                 es = Acad::eInvalidInput;
  16.         else
  17.         {
  18.                 for (long a = 0; a < entNums; a++)
  19.                 {
  20.                         AcDbObjectId  objId;
  21.                         ads采用name      ent;
  22.                         acedSSName(ents, a, ent);
  23.                         acdbGetObjectId(objId, ent);
  24.                         nIDs.append(objId);
  25.                 }
  26.         }
  27.         acedSSFree(ents);
  28.         acutRelRb(rb);
  29.         return  es;
  30. }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-5-4 19:27:10 | 显示全部楼层
  1. ObjectARX如何锁定一个图层
  2. 一般来说,更改图层设置后需要重生成图纸,但是重生成时间开销太大。为了降低时间开销,可以采取以下两种方法。
  3. 一、通过设置LAYLOCKFADECTL避免重生成
  4. 找到需要锁定的图层,打开它,设置其为锁定状态。但是注意,使用该方式前必须设置LAYLOCKFADECTL系统变量为一个新值,设定图层锁定后再设回原值。
  5. void SetLayLock()
  6. {
  7.         int iOldLockFade, iNewLockFade;
  8.         struct resbuf buf;
  9.         acedGetVar(采用T("LAYLOCKFADECTL"), &buf);
  10.         iOldLockFade = buf.resval.rint;
  11.         iNewLockFade = iOldLockFade ? -iOldLockFade : 1;
  12.         buf.resval.rint = iNewLockFade;
  13.         acedSetVar(采用T("LAYLOCKFADECTL"), &buf);        //这一步必不可少,否则不会暗显锁定图层的对象
  14.         //提示用户选择一个实体
  15.         ads采用name ss;
  16.         ads采用point pt;
  17.         if (RTNORM != acedEntSel(采用T("请选择一个实体"), ss, pt))
  18.                 return;
  19.         AcDbObjectId id;
  20.         if (Acad::eOk == acdbGetObjectId(id, ss))
  21.         {
  22.                 AcDbEntity* pEnt;
  23.                 if (Acad::eOk == acdbOpenObject(pEnt, id, AcDb::kForRead))
  24.                 {
  25.                         id = pEnt->layerId();
  26.                         pEnt->close();
  27.                         AcDbLayerTableRecord* pLyrRec;
  28.                         if (Acad::eOk == acdbOpenObject(pLyrRec, id, AcDb::kForWrite))
  29.                         {
  30.                                 pLyrRec->setIsLocked(true);
  31.                                 pLyrRec->close();
  32.                         }
  33.                 }
  34.         }
  35.         buf.resval.rint = iOldLockFade;
  36.         acedSetVar(采用T("LAYLOCKFADECTL"), &buf);//这一步必不可少
  37. }
  38. 这种方法同样不需要重生成图纸,但是并不推荐,首先是CAD命令行最多只能输入256个字符,当需要锁定多个图层(在ads采用command的实参字符串中,每个图层名中用,隔开)时,ads采用command实参字符串长度可能超过256;其次,图层名称中含有诸如#、.等通配符时需要特殊处理;最后,由于未知的原因,采用发送命令的方式无法锁定部分图层。
  39. void SetLayLock2()
  40. {
  41.         //提示用户选择一个实体
  42.         ads采用name ss;
  43.         ads采用point pt;
  44.         if (RTNORM != acedEntSel(采用T("请选择一个实体"), ss, pt))
  45.                 return;
  46.         CString sLayer;
  47.         TCHAR* pszLayer;
  48.         AcDbObjectId id;
  49.         if (Acad::eOk == acdbGetObjectId(id, ss))
  50.         {
  51.                 AcDbEntity* pEnt;
  52.                 if (Acad::eOk == acdbOpenObject(pEnt, id, AcDb::kForRead))
  53.                 {
  54.                         pszLayer= pEnt->layer();
  55.                         sLayer = pszLayer;
  56.                         acutDelString(pszLayer);
  57.                         pEnt->close();
  58.                 }
  59.         }
  60.         if (!sLayer.IsEmpty())
  61.                 ads采用command(RTSTR, 采用T("-layer"), RTSTR, 采用T("lo"), RTSTR, sLayer, RTSTR, 采用T(""), RTNONE);
  62. }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-5-4 19:28:03 | 显示全部楼层
  1. OBJECT ARX 操作图层
  2. //添加图层
  3. static void TESTaddlayercmd(){
  4. CString strLayerName;
  5. if(acedGetString(Adesk::kFalse,采用T("\n输入层名称"),strLayerName.GetBuffer()) != RTNORM){
  6. return;
  7. }
  8. 获得当前图形的层表
  9. AcDbLayerTable* pLayerTbl;
  10. acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl,AcDb::kForWrite);
  11. 是否已经包含制定的层表记录
  12. if(pLayerTbl->has(strLayerName)){
  13. pLayerTbl->close();
  14. return;
  15. }
  16. 创建新的层表记录
  17. AcDbLayerTableRecord* pLayerTblRcd;
  18. pLayerTblRcd = new AcDbLayerTableRecord();
  19. pLayerTblRcd->setName(strLayerName);
  20. 将新创建的层表记录添加到层表中
  21. AcDbObjectId layerTblRcdId;
  22. pLayerTbl->add(layerTblRcdId,pLayerTblRcd);
  23. acdbHostApplicationServices()->workingDatabase()->setClayer(layerTblRcdId);
  24. pLayerTblRcd->close();
  25. pLayerTbl->close();
  26. }
  27. //修改图层颜色============================
  28. static void TESTlayercolorcmd(){
  29. CString strLayerName;
  30. if(acedGetString(Adesk::kFalse,采用T("\n输入图层的名称:"),strLayerName.GetBuffer()) != RTNORM){
  31. return;
  32. }
  33. 获得当前的图层列表
  34. AcDbLayerTable* pLayerTbl;
  35. acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl,AcDb::kForRead);
  36. 判断是否包含指定名称的层表记录
  37. if(!pLayerTbl->has(strLayerName)){
  38. pLayerTbl->close();
  39. return;
  40. }
  41. 获得制定层表记录的指针
  42. AcDbLayerTableRecord* pLayerTblRcd;
  43. pLayerTbl->getAt(strLayerName,pLayerTblRcd,AcDb::kForWrite);
  44. 弹出颜色对话框
  45. AcCmColor oldColor = pLayerTblRcd->color();
  46. int nCurColor = oldColor.colorIndex();//旧的颜色
  47. int nNewColor = oldColor.colorIndex();//用户选择的颜色
  48. if(acedSetColorDialog(nNewColor,Adesk::kFalse,nCurColor)){
  49. AcCmColor color;
  50. color.setColorIndex(nNewColor);
  51. pLayerTblRcd->setColor(color);
  52. }
  53. pLayerTblRcd->close();
  54. pLayerTbl->close();
  55. }
  56. //删除图层
  57. static void TESTdellayercmd(){
  58. CString strLayerName;
  59. if(acedGetString(Adesk::kFalse,采用T("\n输入图层名称"),strLayerName.GetBuffer()) != RTNORM){
  60. return;
  61. }
  62. 获得当前的图层列表
  63. AcDbLayerTable* pLayerTbl;
  64. acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl,AcDb::kForRead);
  65. 判断是否包含指定名称的层表记录
  66. if(!pLayerTbl->has(strLayerName)){
  67. pLayerTbl->close();
  68. return;
  69. }
  70. 获得制定层表记录的指针
  71. AcDbLayerTableRecord* pLayerTblRcd;
  72. pLayerTbl->getAt(strLayerName,pLayerTblRcd,AcDb::kForWrite);
  73. pLayerTblRcd->erase();
  74. pLayerTblRcd->close();
  75. pLayerTbl->close();
  76. }
  77. 导出层的信息到文本文件中
  78. static void TESTexportlayercmd(){
  79. //创建要导出的文本文件
  80. CStdioFile f;
  81. CFileException e;
  82. CString pFileName;
  83. pFileName = 采用T("D:\\layer.txt");
  84. if(!f.Open(pFileName.GetString(),CFile::modeCreate|CFile::modeWrite,&e)){
  85. acutPrintf(采用T("\n创建文件失败"));
  86. return;
  87. }
  88. 获得层表指针
  89. AcDbLayerTable *pLayerTbl;
  90. AcDbLayerTableRecord* pLayerTblRcd;
  91. acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl,AcDb::kForRead);
  92. 使用遍历器访问每条层表记录
  93. AcDbLayerTableIterator* pItr;
  94. pLayerTbl->newIterator(pItr);
  95. for(pItr->start();!pItr->done();pItr->step()){
  96. pItr->getRecord(pLayerTblRcd,AcDb::kForRead);
  97. 输出图层的信息
  98. CString strLayerInfo;
  99. TCHAR* layerName;
  100. pLayerTblRcd->getName(layerName);
  101. 名称
  102. strLayerInfo = layerName;
  103. free(layerName);
  104. strLayerInfo.Append(采用T(","));
  105. CString strColor;
  106. AcCmColor color = pLayerTblRcd->color();
  107. strColor.Format(采用T("%d"),color.colorIndex());
  108. strLayerInfo.Append(strColor);
  109. 线型
  110. CString strLineType;
  111. AcDbLinetypeTableRecord* pLinetypeTblRcd;
  112. acdbOpenObject(pLinetypeTblRcd,pLayerTblRcd->linetypeObjectId(),AcDb::kForRead);
  113. TCHAR* linetypeName;
  114. pLinetypeTblRcd->getName(linetypeName);
  115. pLinetypeTblRcd->close();
  116. strLineType = linetypeName;
  117. free(linetypeName);
  118. strLayerInfo.Append(strLineType);
  119. strLayerInfo.Append(采用T(","));
  120. 线宽
  121. CString strLineWeight;
  122. AcDb::LineWeight lineWeight = pLayerTblRcd->lineWeight();
  123. strLineWeight.Format(采用T("%d"),lineWeight);
  124. strLayerInfo.Append(strLineWeight);
  125. /写文件
  126. f.WriteString(strLayerInfo);
  127. f.WriteString(采用T("\n"));
  128. pLayerTblRcd->close();
  129. }
  130. delete pItr;
  131. pLayerTbl->close();
  132. }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-5-4 19:28:44 | 显示全部楼层
  1. [ObjectARX]-修改实体的图层 CH3采用2
  2. static void aaaMyGroupMyCommand () {
  3.                
  4.                 ads采用name srcSS;  
  5.                 ads采用name targEnt;
  6.                 int rc;
  7.                 ads采用point pickPt;
  8.                 acedPrompt(采用T("\nSelect entities for layer change!"));
  9.                 rc = acedSSGet(NULL, NULL, NULL, NULL, srcSS);
  10.                 if (rc != RTNORM)
  11.                 {
  12.                         acutPrintf(采用T("\nNo entities selected!"));
  13.                         return;
  14.                 }
  15.                 rc = acedEntSel(采用T("Select target layer entity."),targEnt,pickPt);
  16.                 switch (rc)
  17.                 {
  18.                 case RTERROR:
  19.                         acutPrintf(采用T("\nNothing selected!"));
  20.                         break;
  21.                 case RTCAN:
  22.                         acutPrintf(采用T("\nUser canceled."));
  23.                 case RTNORM:
  24.                         COtherUtil::chgEntsLyr(targEnt, srcSS);
  25.                         break;
  26.                 }
  27.                 acedSSFree(srcSS);
  28.         }
  29. void COtherUtil::chgEntsLyr(ads采用name ent, ads采用name ss)
  30. {
  31.         acutPrintf(采用T("\n进入chgEntsLyr()函数"));
  32.         long idx;
  33.         long lenSS;
  34.     ACHAR lyrName[32];
  35.         ads采用name ssEntName;
  36.         struct resbuf *rbTargEnt;
  37.         struct resbuf *rbSSEnt;
  38.         struct resbuf *rbTrav;
  39.         int rc;
  40.         acutPrintf(采用T("\n获取目标实体的图层名."));
  41.         rbTargEnt = acdbEntGet(ent);
  42.         if (!rbTargEnt)
  43.         {
  44.                 acutPrintf(采用T("\nFailed to get target entities data."));
  45.                 return;
  46.         }
  47.         rbTrav = rbTargEnt;
  48.         while (rbTrav)
  49.         {
  50.                 switch (rbTrav->restype)
  51.                 {
  52.                 case 8:
  53.                         strcpy(reinterpret采用cast<char *>(lyrName),
  54.                   reinterpret采用cast<const char*>(rbTrav->resval.rstring));
  55.                         break;
  56.                 }
  57.                 rbTrav=rbTrav->rbnext;
  58.         }
  59.         acutPrintf(采用T("\n释放rbTargEnt."));
  60.         if (rbTargEnt)
  61.         {
  62.                 acutRelRb(rbTargEnt);
  63.         }
  64.         acutPrintf(采用T("\n遍历选择集."));
  65.         rc = acedSSLength(ss, reinterpret采用cast<Adesk::Int32*>(&lenSS));
  66.         if (rc != RTNORM)
  67.         {
  68.                 acutPrintf(采用T("\nInvalid or empty selection set."));
  69.                 return;
  70.           
  71.         }
  72.         acutPrintf(采用T("\n进入for循环."));
  73.         for (idx = 0; idx < lenSS; idx++)
  74.         {
  75.                 rc = acedSSName(ss, idx, ssEntName);
  76.                 if (rc != RTNORM)
  77.                 {
  78.                         break;
  79.                 }
  80.                 //Get ssEntName entity data
  81.                 rbSSEnt = acdbEntGet(ssEntName);
  82.                 if (!rbSSEnt)
  83.                 {
  84.                         break;
  85.                 }
  86.                 rbTrav = rbSSEnt;
  87.                 acutPrintf(采用T("\n进入while循环."));
  88.                 while (rbTrav)
  89.                 {
  90.                         switch (rbTrav->restype)
  91.                         {
  92.                         case 8:
  93.                                 strcpy(reinterpret采用cast<char *>(rbTrav->resval.rstring),
  94.                            reinterpret采用cast<const char*>(lyrName));
  95.                                 break;
  96.                         }
  97.                         rbTrav = rbTrav->rbnext;
  98.                 }
  99.                 acutPrintf(采用T("\nacdbEntMod()函数."));
  100.                 rc = acdbEntMod(rbSSEnt);
  101.                 if (rc != RTNORM)
  102.                 {
  103.                         acutPrintf(采用T("\nFailded to modify the entity."));
  104.                 }
  105.                 //Release the resbuf
  106.                 if (rbSSEnt)
  107.                 {
  108.                         acutRelRb(rbSSEnt);
  109.                 }
  110.         }
  111. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-27 07:02 , Processed in 0.135986 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表