天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 237|回复: 19

ObjectArx图层操作封装

[复制链接]
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
    发表于 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. }
    复制代码

     

     

     

     

    ObjectArx图层操作封装
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

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

     

     

     

     

    ObjectArx图层操作封装
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

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

     

     

     

     

    ObjectArx图层操作封装
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

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

     

     

     

     

    ObjectArx图层操作封装
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

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

     

     

     

     

    ObjectArx图层操作封装
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

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

     

     

     

     

    ObjectArx图层操作封装
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

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

     

     

     

     

    ObjectArx图层操作封装
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

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

     

     

     

     

    ObjectArx图层操作封装
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

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

     

     

     

     

    ObjectArx图层操作封装
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

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

     

     

     

     

    ObjectArx图层操作封装
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-11-1 08:05 , Processed in 0.157066 second(s), 28 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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