找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 270|回复: 19

ObjectArx图层操作封装

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-5-4 19:15:30 | 显示全部楼层 |阅读模式
  1. //新建图层
  2. void CLayerOper::NewLayer()
  3. {
  4.     // 提示用户输入新建图层的名称
  5.     TCHAR layerName[100];
  6.     if (acedGetString(Adesk::kFalse, 采用T("\n输入新图层的名称:"), layerName) != RTNORM)
  7.     {
  8.         return;
  9.     }
  10.    
  11.     // 获得当前图形的层表
  12.     AcDbLayerTable *pLayerTbl;
  13.     acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl, AcDb::kForWrite);
  14.    
  15.     // 是否已经包含指定的层表记录
  16.     if (pLayerTbl->has(layerName))
  17.     {
  18.         pLayerTbl->close();
  19.         return;
  20.     }
  21.    
  22.     // 创建新的层表记录
  23.     AcDbLayerTableRecord *pLayerTblRcd;
  24.     pLayerTblRcd = new AcDbLayerTableRecord();
  25.     pLayerTblRcd->setName(layerName);
  26.     // 将新建的层表记录添加到层表中
  27.     AcDbObjectId layerTblRcdId;
  28.     pLayerTbl->add(layerTblRcdId, pLayerTblRcd);
  29.     //AcDbDatabase 类的 setClayer 函数能够设置图形的当前图层。
  30.     acdbHostApplicationServices()->workingDatabase()->setClayer(layerTblRcdId);
  31.     pLayerTblRcd->close();
  32.     pLayerTbl->close();
  33. }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-5-4 19:15:41 | 显示全部楼层
  1. Adesk::Boolean acedSetColorDialog(
  2.     int& nColor,  //nColor 参数指定了显示【选择颜色】对话框时的默认颜色,并且在函数返回值后保存用户选择的新颜色
  3.     Adesk::Boolean bAllowMetaColor,  //bAllowMetaColor 参数限定在【选择颜色】对话框中是否可以选择“随层”或“随块”
  4.     int nCurLayerColor);             //nCurLayerColor 参数指定当前图层的颜色。
  5. AcCmColor //代表颜色对象,可以通过颜色索引来构建一个新的颜色对象。
  6.           //通过颜色索引,可以将【选择颜色】对话框的结果设置为指定图层的颜色,
  7. 其相关代码为:
  8. AcCmColor color;
  9. color.setColorIndex(nNewColor);
  10. pLayerTblRcd->setColor(color);
  11. //修改图层颜色
  12. void CModifyLayer::ModifyLayerColor()
  13. {
  14.     // 提示用户输入要修改的图层名称
  15.     TCHAR layerName[100];
  16.     if (acedGetString(Adesk::kFalse, 采用T("\n输入图层的名称:"), layerName) != RTNORM)
  17.     {
  18.         return;
  19.     }
  20.     // 获得当前图形的层表
  21.     AcDbLayerTable *pLayerTbl;
  22.     acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl, AcDb::kForRead);
  23.     // 判断是否包含指定名称的层表记录
  24.     if (!pLayerTbl->has(layerName))
  25.     {
  26.         pLayerTbl->close();
  27.         return;
  28.     }
  29.     // 获得指定层表记录的指针
  30.     AcDbLayerTableRecord *pLayerTblRcd;
  31.     pLayerTbl->getAt(layerName, pLayerTblRcd, AcDb::kForWrite);
  32.     // 弹出“颜色”对话框
  33.     AcCmColor oldColor = pLayerTblRcd->color();
  34.     int nCurColor = oldColor.colorIndex(); // 图层修改前的颜色
  35.     int nNewColor = oldColor.colorIndex(); // 用户选择的颜色
  36.     if (acedSetColorDialog(nNewColor, Adesk::kFalse, nCurColor))
  37.     {
  38.         AcCmColor color;
  39.         color.setColorIndex(nNewColor);
  40.         pLayerTblRcd->setColor(color);
  41.     }
  42.     // 关闭
  43.     pLayerTblRcd->close();
  44.     pLayerTbl->close();
  45. }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-5-4 19:16:06 | 显示全部楼层
  1. //删除图层
  2. void CModifyLayer::DelLayer()
  3. {
  4.     // 提示用户输入要修改的图层名称
  5.     TCHAR layerName[100];
  6.     if (acedGetString(Adesk::kFalse, 采用T("\n输入图层的名称:"), layerName) != RTNORM)
  7.     {
  8.         return;
  9.     }
  10.     // 获得当前图形的层表
  11.     AcDbLayerTable *pLayerTbl;
  12.     acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl, AcDb::kForRead);
  13.     // 判断是否包含指定名称的层表记录
  14.     if (!pLayerTbl->has(layerName))
  15.     {
  16.         pLayerTbl->close();
  17.         return;
  18.     }
  19.     // 获得指定层表记录的指针
  20.     AcDbLayerTableRecord *pLayerTblRcd;
  21.     pLayerTbl->getAt(layerName, pLayerTblRcd, AcDb::kForWrite);
  22.     pLayerTblRcd->erase(); // 为其设置“删除”标记
  23.     pLayerTblRcd->close();
  24.     pLayerTbl->close();
  25. }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-5-4 19:16:15 | 显示全部楼层
  1. //导出图层到文本文档
  2. void CModifyLayer::ExportLayer()
  3. {
  4.     // 创建所要导出的文本文件
  5.     CStdioFile f;
  6.     CFileException e;
  7.     TCHAR *pFileName = 采用T("C:\\layers.txt");
  8.     if (!f.Open(pFileName, CFile::modeCreate | CFile::modeWrite, &e))
  9.     {
  10.         acutPrintf(采用T("\n创建导出文件失败!"));
  11.         return;
  12.     }
  13.     // 获得层表指针
  14.     AcDbLayerTable *pLayerTbl;
  15.     AcDbLayerTableRecord *pLayerTblRcd;
  16.     acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl, AcDb::kForRead);
  17.     // 使用遍历器访问每一条层表记录
  18.     AcDbLayerTableIterator *pItr;
  19.     pLayerTbl->newIterator(pItr);
  20.     for (pItr->start(); !pItr->done(); pItr->step())
  21.     {
  22.         pItr->getRecord(pLayerTblRcd, AcDb::kForRead);
  23.         
  24.         // 输出图层的信息
  25.         CString strLayerInfo; // 图层名称
  26.         TCHAR *layerName;
  27.         pLayerTblRcd->getName(layerName);
  28.         strLayerInfo = layerName;
  29.         free(layerName);
  30.         strLayerInfo += ","; // 分隔符
  31.         CString strColor; // 图层颜色
  32.         AcCmColor color = pLayerTblRcd->color();
  33.         strColor.Format(采用T("%d"), color.colorIndex());
  34.         strLayerInfo += strColor;
  35.         strLayerInfo += ",";
  36.         CString strLinetype; // 图层线型
  37.         AcDbLinetypeTableRecord *pLinetypeTblRcd;
  38.         acdbOpenObject(pLinetypeTblRcd, pLayerTblRcd->linetypeObjectId(), AcDb::kForRead);
  39.         TCHAR *linetypeName;
  40.         pLinetypeTblRcd->getName(linetypeName);
  41.         pLinetypeTblRcd->close();
  42.         strLinetype = linetypeName;
  43.         free(linetypeName);
  44.         strLayerInfo += strLinetype;
  45.         strLayerInfo += ",";
  46.         CString strLineWeight; // 图层的线宽
  47.         AcDb::LineWeight lineWeight = pLayerTblRcd->lineWeight();
  48.         strLineWeight.Format(采用T("%d"), lineWeight);
  49.         strLayerInfo += strLineWeight;
  50.         
  51.         // 将图层特性写入到文件中
  52.         f.WriteString(strLayerInfo);
  53.         f.WriteString(采用T("\n"));
  54.         pLayerTblRcd->close();
  55.     }
  56.    
  57.     delete pItr;
  58.     pLayerTbl->close();
  59. }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-5-4 19:16:42 | 显示全部楼层
  1. //解析文本(图层的名称、颜色、线型和线宽)
  2. BOOL GetFieldText(CString strLineText, CStringArray &fields); //解析文本(图层的名称、颜色、线型和线宽)
  3. //解析文本(图层的名称、颜色、线型和线宽)
  4. BOOL CModifyLayer::GetFieldText(CString strLineText, CStringArray &fields)
  5. {
  6.     if (strLineText.Find(采用T(","), 0) == -1) // 如果找不到英文逗号,函数退出
  7.     {
  8.         return FALSE;
  9.     }
  10.     int nLeftPos = 0, nRightPos = 0; // 查找分隔符的起始位置
  11.     while ((nRightPos = strLineText.Find(采用T(","), nRightPos)) != -1)
  12.     {
  13.         fields.Add(strLineText.Mid(nLeftPos, nRightPos - nLeftPos));
  14.         nLeftPos = nRightPos + 1;
  15.         nRightPos++;
  16.     }
  17.     // 最后一个列的数据
  18.     fields.Add(strLineText.Mid(nLeftPos));
  19.     return TRUE;
  20. }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-5-4 19:16:52 | 显示全部楼层
  1. //从文本文档到导入图层
  2. void CModifyLayer::ImportLayer()
  3. {
  4.     // 打开所要导入的文本文件
  5.     CStdioFile f;
  6.     CFileException e;
  7.     TCHAR *pFileName = 采用T("C:\\layers.txt");
  8.     if (!f.Open(pFileName, CFile::modeRead, &e))
  9.     {
  10.         acutPrintf(采用T("\n打开导入文件失败!"));
  11.         return;
  12.     }
  13.     // 获得层表指针
  14.     AcDbLayerTable *pLayerTbl;
  15.     AcDbLayerTableRecord *pLayerTblRcd;
  16.     acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl, AcDb::kForWrite);
  17.     // 读取文件中的每一行数据
  18.     CString strLineText; // 一行文字
  19.     while (f.ReadString(strLineText))
  20.     {
  21.         // 跳过空行
  22.         if (strLineText.IsEmpty())
  23.             continue;
  24.         // 解析出图层名称、颜色、线型和线宽
  25.         CStringArray layerInfos;
  26.         if (!GetFieldText(strLineText, layerInfos))
  27.             continue;
  28.         // 创建新的层表记录,或者打开存在的块表记录
  29.         AcDbLayerTableRecord *pLayerTblRcd;
  30.         AcDbObjectId layerTblRcdId;
  31.         if (pLayerTbl->has(layerInfos.GetAt(0)))
  32.         {
  33.             pLayerTbl->getAt(layerInfos.GetAt(0), layerTblRcdId);
  34.         }else
  35.         {
  36.             pLayerTblRcd = new AcDbLayerTableRecord();
  37.             pLayerTblRcd->setName(layerInfos.GetAt(0));
  38.             pLayerTbl->add(layerTblRcdId, pLayerTblRcd);
  39.             pLayerTblRcd->close();
  40.         }
  41.         acdbOpenObject(pLayerTblRcd, layerTblRcdId, AcDb::kForWrite);
  42.         
  43.         // 设置层表记录的颜色
  44.         AcCmColor color;
  45.         Adesk::UInt16 colorIndex = 采用wtol(layerInfos.GetAt(1));
  46.         color.setColorIndex(colorIndex);
  47.         pLayerTblRcd->setColor(color);
  48.         
  49.         // 设置线型
  50.         AcDbLinetypeTable *pLinetypeTbl;
  51.         AcDbObjectId linetypeId;
  52.         acdbHostApplicationServices()->workingDatabase()->getLinetypeTable(pLinetypeTbl, AcDb::kForRead);
  53.         if (pLinetypeTbl->has(layerInfos.GetAt(2)))
  54.         {
  55.             pLinetypeTbl->getAt(layerInfos.GetAt(2), linetypeId);
  56.         }else
  57.         {
  58.             pLinetypeTbl->getAt(采用T("Continous"), linetypeId);
  59.         }
  60.         pLayerTblRcd->setLinetypeObjectId(linetypeId);
  61.         pLinetypeTbl->close();
  62.         
  63.         // 设置线宽
  64.         AcDb::LineWeight lineWeight = (AcDb::LineWeight)采用wtol(layerInfos.GetAt(3));
  65.         pLayerTblRcd->setLineWeight(lineWeight);
  66.         pLayerTblRcd->close();
  67.     }
  68.     pLayerTbl->close();
  69. }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-5-4 19:17:03 | 显示全部楼层
  1.     //当前项目中注册命令 新建/删除/插入/导出/导入
  2.     static void MidasMyGroupMyNewLayer()
  3.     {
  4.         CLayerOper m采用layerOper;
  5.         m采用layerOper.NewLayer();
  6.     }
  7.     static void MidasMyGroupMyDelLayer()
  8.     {
  9.         CModifyLayer m采用modifyLayer;
  10.         m采用modifyLayer.DelLayer();
  11.     }
  12.     static void MidasMyGroupMyModifyLayerColor()
  13.     {
  14.         CModifyLayer m采用modifyLayer;
  15.         m采用modifyLayer.ModifyLayerColor();
  16.     }
  17.     static void MidasMyGroupMyExportLayer()
  18.     {
  19.         CModifyLayer m采用modifyLayer;
  20.         m采用modifyLayer.ExportLayer();
  21.     }
  22.     static void MidasMyGroupMyImportLayer()
  23.     {
  24.         CModifyLayer m采用modifyLayer;
  25.         m采用modifyLayer.ImportLayer();
  26.     }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-5-4 19:17:53 | 显示全部楼层
  1. 选择指定图层上的所有实体
  2. Acad::ErrorStatus selectEntityInLayer(const std::wstring sLayerName, 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.         rb->resval.rstring = (ACHAR *)sLayerName.c采用str();
  10.         rb->rbnext = NULL;
  11.         acedSSGet(L"X", NULL, NULL, rb, ents);
  12.         Adesk::Int32 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:18:08 | 显示全部楼层
  1. 设置当前层
  2. Acad::ErrorStatus SetCurLayer(const std::wstring lpLayerName, AcDbDatabase* pDb/* = NULL */)
  3. {
  4.         AcDbDatabase* pCurDb = pDb;
  5.         if (pCurDb == NULL)
  6.         {
  7.                 pCurDb = acdbHostApplicationServices()->workingDatabase();
  8.         }
  9.         AcDbLayerTableRecordPointer spRecord(lpLayerName.c采用str(), pCurDb, AcDb::kForRead);
  10.         Acad::ErrorStatus es = spRecord.openStatus();
  11.         if (es == Acad::eOk)
  12.         {
  13.                 es = pCurDb->setClayer(spRecord->objectId());
  14.         }
  15.         return es;
  16. }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-5-4 19:21:59 | 显示全部楼层
锁定图层: layiso ;解锁图层:layuniso

创建图层记录:
  1. void ZffCHAP4NewLayer()
  2. {
  3. // 提示用户输入新建图层的名称
  4. char layerName[100];
  5. if (acedGetString(Adesk::kFalse, "\n输入新图层的名称:",layerName) != RTNORM)
  6.    return;
  7. // 获得当前图形的层表
  8. AcDbLayerTable *pLayerTbl = NULL;
  9. acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl, AcDb::kForWrite);
  10. // 是否已经包含指定的层表记录
  11. if (pLayerTbl->has(layerName))
  12. {
  13. pLayerTbl->close();
  14. return;
  15. }
  16. // 创建新的层表记录
  17. AcDbLayerTableRecord *pLayerTblRcd = new AcDbLayerTableRecord();
  18. pLayerTblRcd->setName(layerName);
  19. // 设置颜色,层的其他属性(线型等)都用缺省值
  20. AcCmColor color;
  21. color.setColorIndex(1);
  22. pLayerTblRcd->setColor(color);
  23. // 将新建的层表记录添加到层表中
  24. AcDbObjectId layerTblRcdId;
  25. pLayerTbl->add(layerTblRcdId, pLayerTblRcd);
  26. acdbHostApplicationServices()->workingDatabase()->setClayer(layerTblRcdId);
  27. pLayerTblRcd->close();
  28. pLayerTbl->close();
  29. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-27 06:24 , Processed in 0.131928 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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