天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
楼主: admin

ObjectArx图层操作封装

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 82 天

    [LV.6]常住居民II

    1591

    主题

    204

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
     楼主| 发表于 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. }
    复制代码

     

     

     

     

    ObjectArx图层操作封装
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 82 天

    [LV.6]常住居民II

    1591

    主题

    204

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
     楼主| 发表于 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.         }
    复制代码

     

     

     

     

    ObjectArx图层操作封装
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 82 天

    [LV.6]常住居民II

    1591

    主题

    204

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
     楼主| 发表于 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. }
    复制代码

     

     

     

     

    ObjectArx图层操作封装
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 82 天

    [LV.6]常住居民II

    1591

    主题

    204

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
     楼主| 发表于 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. }

    复制代码

     

     

     

     

    ObjectArx图层操作封装
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 82 天

    [LV.6]常住居民II

    1591

    主题

    204

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
     楼主| 发表于 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 }
    复制代码

     

     

     

     

    ObjectArx图层操作封装
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 82 天

    [LV.6]常住居民II

    1591

    主题

    204

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
     楼主| 发表于 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. }
    复制代码

     

     

     

     

    ObjectArx图层操作封装
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 82 天

    [LV.6]常住居民II

    1591

    主题

    204

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
     楼主| 发表于 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. }
    复制代码

     

     

     

     

    ObjectArx图层操作封装
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 82 天

    [LV.6]常住居民II

    1591

    主题

    204

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
     楼主| 发表于 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. }

    复制代码

     

     

     

     

    ObjectArx图层操作封装
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 82 天

    [LV.6]常住居民II

    1591

    主题

    204

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
     楼主| 发表于 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. }


    复制代码

     

     

     

     

    ObjectArx图层操作封装
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 82 天

    [LV.6]常住居民II

    1591

    主题

    204

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
     楼主| 发表于 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. }
    复制代码

     

     

     

     

    ObjectArx图层操作封装
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-5-19 05:54 , Processed in 0.068250 second(s), 21 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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