明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1729|回复: 10

根据图层分离实体(有源码)

[复制链接]
发表于 2023-4-14 00:19:32 | 显示全部楼层 |阅读模式
本帖最后由 SdlFreeCAD 于 2024-5-31 12:45 编辑

[url=]layoutentbyLayer.gif[/url]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2023-4-18 20:17:57 | 显示全部楼层
这个非常棒,给大神大大的赞
发表于 2023-4-19 09:59:29 | 显示全部楼层
这不是【原码共享】版块?
发表于 2023-4-20 16:05:25 | 显示全部楼层
lxl217114 发表于 2023-4-19 09:59
这不是【原码共享】版块?

到处都是商业的气息,技术的风气不正
发表于 2023-8-19 16:06:32 | 显示全部楼层
可以分享下吗
 楼主| 发表于 2023-8-21 08:51:04 | 显示全部楼层

可以, 加QQ
发表于 2024-5-27 15:51:17 来自手机 | 显示全部楼层
可以分享一下源码吗?
 楼主| 发表于 2024-5-31 12:35:12 | 显示全部楼层
本帖最后由 SdlFreeCAD 于 2024-5-31 12:43 编辑

工程全套源码是需要的话,发私信。
 楼主| 发表于 2024-5-31 12:42:51 | 显示全部楼层
  1. void
  2. ArxDbgCmdTests::registerCommandLineFunctions(AcEdCommandStack* cmdStack, LPCTSTR appname)
  3. {
  4.         cmdStack->addCommand(appname, _T("LayoutEntByLayer"), _T("LayoutEntByLayer"), (ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET), &LayoutEntitiesByLayer);
  5. }

  6. void ArxDbgCmdTests::LayoutEntitiesByLayer()
  7. {
  8.         acutPrintf(_T("\n\n--------------------QQ:1005144760-------------------------------------"));
  9.         acutPrintf(_T("\n定制CAD功能开发,支持Autocad、Revit、 NX、 Solidwork、CATIA等平台. QQ:1005144760"));
  10.         acutPrintf(_T("\n--------------------QQ:1005144760-------------------------------------\n\n"));
  11.         acutPrintf(_T("\n根据图层排序,排序规则: 实体包围盒左下点坐标和排序方向确定(Y轴方向排序:Y坐标从小到大, X轴方向排序:X坐标从由小到大)"));
  12.         CString strPrompt;
  13.         strPrompt.Format(_T("\n选择块实体或 <全部选择>"));
  14.         ArxDbgRbList filter;
  15.         ArxDbgSelSet ss;
  16.         AcDbObjectIdArray objIds;
  17.         ArxDbgSelSet::SelSetStatus selStatus = ss.userSelect(strPrompt, NULL, filter.data());
  18.         if (selStatus == ArxDbgSelSet::kNone)
  19.         {
  20.                 // 选择图中所有的块实体
  21.                 ss.allSelect(filter.data());
  22.                 ss.asArray(objIds);
  23.         }
  24.         else if (selStatus == ArxDbgSelSet::kSelected)
  25.         {
  26.                 // 用户选择了文本转换选择集
  27.                 ss.asArray(objIds);
  28.         }

  29.         if (objIds.length() == 0)
  30.         {
  31.                 acutPrintf(_T("\n没有实体,命令退出!"));
  32.                 return;
  33.         }

  34.         std::map<AcDbObjectId, AcDbObjectIdArray> layerToObjIds;
  35.         std::map<AcDbObjectId, AcDbExtents> layerToExtent;

  36.         for (int i = 0; i < objIds.logicalLength(); i++)
  37.         {
  38.                 AcDbEntityPointer pEnt(objIds[i], AcDb::kForRead);
  39.                 if (pEnt.openStatus() != Acad::eOk)
  40.                 {
  41.                         acutPrintf(_T("\nWarning: open error. ignore one entity."));
  42.                         continue;
  43.                 }
  44.                 AcDbExtents ex;
  45.                 if (Acad::eOk != pEnt->getGeomExtents(ex))
  46.                 {
  47.                         acutPrintf(_T("\nWarning: geom extent error. ignore this entity."));
  48.                         continue;
  49.                 }
  50.                 layerToObjIds[pEnt->layerId()].append(objIds[i]);
  51.                 layerToExtent[pEnt->layerId()].addExt(ex);
  52.         }

  53.         size_t nLayerCount = layerToObjIds.size();
  54.         acutPrintf(_T("\n共选择%d实体, 分布在%d图层"), objIds.logicalLength(), nLayerCount);
  55.         if (nLayerCount <= 1)
  56.         {
  57.                 acutPrintf(_T("\n 图层数量过少,不需要排序!"));
  58.                 return;
  59.         }

  60.         bool bIsYAxis = true;
  61.         ArxDbgUiPrKeyWordDef prKeyDirection(_T("选择排序方向[X轴(X)/Y轴(Y)]"), _T("X Y"), _T("Y"));
  62.         if (prKeyDirection.go() != ArxDbgUiPrBase::kOk)
  63.                 return;
  64.         if (prKeyDirection.isKeyWordPicked(_T("X")))
  65.                 bIsYAxis = Adesk::kFalse;

  66.         AcDbExtents exTotal;
  67.         std::map<AcDbObjectId, AcDbExtents> layerToExtentToSort;
  68.         layerToExtentToSort = layerToExtent;
  69.         AcDbObjectIdArray sortedLayers;
  70.         while (layerToExtentToSort.size() > 0)
  71.         {
  72.                 if (layerToExtentToSort.size() == 1)
  73.                 {
  74.                         sortedLayers.append(layerToExtentToSort.begin()->first);
  75.                         break;
  76.                 }
  77.                 std::map<AcDbObjectId, AcDbExtents>::iterator it = layerToExtentToSort.begin();
  78.                 AcDbExtents exMin = it->second;
  79.                 AcDbObjectId idMin = it->first;
  80.                 it++;
  81.                 for (; it != layerToExtentToSort.end(); it++)
  82.                 {
  83.                         AcDbExtents exCur = it->second;
  84.                         if (bIsYAxis)
  85.                         {
  86.                                 if (exMin.minPoint().y - exCur.minPoint().y > -1e-6)
  87.                                 {
  88.                                         exMin = exCur;
  89.                                         idMin = it->first;
  90.                                 }
  91.                         }
  92.                         else
  93.                         {
  94.                                 if (exMin.minPoint().x - exCur.minPoint().x > -1e-6)
  95.                                 {
  96.                                         exMin = exCur;
  97.                                         idMin = it->first;
  98.                                 }
  99.                         }
  100.                 }
  101.                 sortedLayers.append(idMin);
  102.                 layerToExtentToSort.erase(idMin);
  103.                 exTotal.addExt(exMin);
  104.         }

  105.         ArxDbgUiPrPoint prInsert(_T("\n指定布局插入点"), NULL);
  106.         if (prInsert.go() != ArxDbgUiPrBase::kOk)
  107.         {
  108.                 return;
  109.         }
  110.         CString str;
  111.         if (bIsYAxis)
  112.         {
  113.                 str.Format(_T("\n指定Y轴间距"));
  114.         }
  115.         else
  116.         {
  117.                 str.Format(_T("\n指定X轴间距"));
  118.         }
  119.         double dOffset = 0.0;
  120.         ArxDbgUiPrDistDef prDist(_T("\n指定偏移距离"), NULL, ArxDbgUiPrDist::kNoNeg, prInsert.value(), 0.0);
  121.         prDist.setAllowNone(true);
  122.         ArxDbgUiPrBase::Status st = prDist.go();
  123.         if (st == ArxDbgUiPrBase::kNone)
  124.         {
  125.                 dOffset = 0.0;
  126.         }
  127.         else if (st == ArxDbgUiPrBase::kOk)
  128.         {
  129.                 dOffset = prDist.value();
  130.         }
  131.         else
  132.         {
  133.                 return;
  134.         }

  135.         AcGePoint3d ptInsert = prInsert.value();
  136.         AcGeVector3d offVec = AcGeVector3d::kYAxis * dOffset;
  137.         if (!bIsYAxis)
  138.         {
  139.                 offVec = AcGeVector3d::kXAxis * dOffset;
  140.         }

  141.         bool bCreateLayerName = false;
  142.         ArxDbgUtils::yesNoPromptDef(_T("创建图层名字?"), bCreateLayerName, false);

  143.         AcGeVector3d lastOffVec;
  144.         for (int i = 0; i < sortedLayers.logicalLength(); i++)
  145.         {
  146.                 AcDbExtents ex = exTotal; //layerToExtent.at(sortedLayers[i]); 按每个图形的Extend计算.
  147.                 AcGeMatrix3d matrix = AcGeMatrix3d::translation(ptInsert - ex.minPoint());

  148.                 //For Test
  149. //                 AcDbExtents extmp = ex;
  150. //                 extmp.transformBy(matrix);
  151. //                 drawExtent(extmp);

  152.                 if (bCreateLayerName)
  153.                 {
  154.                         AcGePoint3d ptLeftBottom = ex.minPoint();
  155.                         ptLeftBottom.transformBy(matrix);

  156.                         AcDbLayerTableRecordPointer pLayerTblRec(sortedLayers[i], AcDb::kForRead);
  157.                         if (pLayerTblRec.openStatus() == Acad::eOk)
  158.                         {
  159.                                 AcString strName;
  160.                                 pLayerTblRec->getName(strName);
  161.                                 if (!strName.isEmpty())
  162.                                 {
  163.                                         AcDbMText* pNewText = new AcDbMText;
  164.                                         pNewText->setLocation(ptLeftBottom); // set to be just to the right of the logo
  165.                                         double dHeight = (ex.maxPoint() - ex.minPoint()).dotProduct(AcGeVector3d::kYAxis);
  166.                                         pNewText->setTextHeight(dHeight * 0.05);
  167.                                         //pNewText->setWidth(0.0);
  168.                                         pNewText->setContents(strName);
  169.                                         pNewText->setAttachment(AcDbMText::kBottomLeft);
  170.                                         ArxDbgUtils::addToCurrentSpaceAndClose(pNewText);
  171.                                 }
  172.                         }
  173.                 }

  174.                 const AcDbObjectIdArray& entIds = layerToObjIds[sortedLayers[i]];
  175.                 for (int j = 0; j < entIds.logicalLength(); j++)
  176.                 {
  177.                         AcDbEntityPointer pEnt(entIds[j], AcDb::kForWrite);
  178.                         if (pEnt.openStatus() == Acad::eOk)
  179.                         {
  180.                                 pEnt->transformBy(matrix);
  181.                         }
  182.                 }

  183.                 if (bIsYAxis)
  184.                 {
  185.                         ptInsert += AcGeVector3d(0, ex.maxPoint().y - ex.minPoint().y, 0);
  186.                 }
  187.                 else
  188.                 {
  189.                         ptInsert += AcGeVector3d(ex.maxPoint().x - ex.minPoint().x, 0, 0);
  190.                 }
  191.                 ptInsert += offVec;
  192.         }

  193. }
发表于 2024-6-2 10:43:49 | 显示全部楼层

您好,请问这是arx的源码吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 03:28 , Processed in 0.588465 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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