SdlFreeCAD 发表于 2023-4-14 00:19:32

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

本帖最后由 SdlFreeCAD 于 2024-5-31 12:45 编辑

layoutentbyLayer.gif

999999 发表于 2023-4-18 20:17:57

这个非常棒,给大神大大的赞

lxl217114 发表于 2023-4-19 09:59:29

这不是【原码共享】版块?

ferious 发表于 2023-4-20 16:05:25

lxl217114 发表于 2023-4-19 09:59
这不是【原码共享】版块?

到处都是商业的气息,技术的风气不正

664571221 发表于 2023-8-19 16:06:32

可以分享下吗

SdlFreeCAD 发表于 2023-8-21 08:51:04

664571221 发表于 2023-8-19 16:06
可以分享下吗

可以, 加QQ

jcmtxgt 发表于 2024-5-27 15:51:17

可以分享一下源码吗?

SdlFreeCAD 发表于 2024-5-31 12:35:12

本帖最后由 SdlFreeCAD 于 2024-5-31 12:43 编辑

工程全套源码是需要的话,发私信。

SdlFreeCAD 发表于 2024-5-31 12:42:51

void
ArxDbgCmdTests::registerCommandLineFunctions(AcEdCommandStack* cmdStack, LPCTSTR appname)
{
        cmdStack->addCommand(appname, _T("LayoutEntByLayer"), _T("LayoutEntByLayer"), (ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET), &LayoutEntitiesByLayer);
}

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

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

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

        for (int i = 0; i < objIds.logicalLength(); i++)
        {
                AcDbEntityPointer pEnt(objIds, AcDb::kForRead);
                if (pEnt.openStatus() != Acad::eOk)
                {
                        acutPrintf(_T("\nWarning: open error. ignore one entity."));
                        continue;
                }
                AcDbExtents ex;
                if (Acad::eOk != pEnt->getGeomExtents(ex))
                {
                        acutPrintf(_T("\nWarning: geom extent error. ignore this entity."));
                        continue;
                }
                layerToObjIds.append(objIds);
                layerToExtent.addExt(ex);
        }

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

        bool bIsYAxis = true;
        ArxDbgUiPrKeyWordDef prKeyDirection(_T("选择排序方向"), _T("X Y"), _T("Y"));
        if (prKeyDirection.go() != ArxDbgUiPrBase::kOk)
                return;
        if (prKeyDirection.isKeyWordPicked(_T("X")))
                bIsYAxis = Adesk::kFalse;

        AcDbExtents exTotal;
        std::map<AcDbObjectId, AcDbExtents> layerToExtentToSort;
        layerToExtentToSort = layerToExtent;
        AcDbObjectIdArray sortedLayers;
        while (layerToExtentToSort.size() > 0)
        {
                if (layerToExtentToSort.size() == 1)
                {
                        sortedLayers.append(layerToExtentToSort.begin()->first);
                        break;
                }
                std::map<AcDbObjectId, AcDbExtents>::iterator it = layerToExtentToSort.begin();
                AcDbExtents exMin = it->second;
                AcDbObjectId idMin = it->first;
                it++;
                for (; it != layerToExtentToSort.end(); it++)
                {
                        AcDbExtents exCur = it->second;
                        if (bIsYAxis)
                        {
                                if (exMin.minPoint().y - exCur.minPoint().y > -1e-6)
                                {
                                        exMin = exCur;
                                        idMin = it->first;
                                }
                        }
                        else
                        {
                                if (exMin.minPoint().x - exCur.minPoint().x > -1e-6)
                                {
                                        exMin = exCur;
                                        idMin = it->first;
                                }
                        }
                }
                sortedLayers.append(idMin);
                layerToExtentToSort.erase(idMin);
                exTotal.addExt(exMin);
        }

        ArxDbgUiPrPoint prInsert(_T("\n指定布局插入点"), NULL);
        if (prInsert.go() != ArxDbgUiPrBase::kOk)
        {
                return;
        }
        CString str;
        if (bIsYAxis)
        {
                str.Format(_T("\n指定Y轴间距"));
        }
        else
        {
                str.Format(_T("\n指定X轴间距"));
        }
        double dOffset = 0.0;
        ArxDbgUiPrDistDef prDist(_T("\n指定偏移距离"), NULL, ArxDbgUiPrDist::kNoNeg, prInsert.value(), 0.0);
        prDist.setAllowNone(true);
        ArxDbgUiPrBase::Status st = prDist.go();
        if (st == ArxDbgUiPrBase::kNone)
        {
                dOffset = 0.0;
        }
        else if (st == ArxDbgUiPrBase::kOk)
        {
                dOffset = prDist.value();
        }
        else
        {
                return;
        }

        AcGePoint3d ptInsert = prInsert.value();
        AcGeVector3d offVec = AcGeVector3d::kYAxis * dOffset;
        if (!bIsYAxis)
        {
                offVec = AcGeVector3d::kXAxis * dOffset;
        }

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

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

                //For Test
//                 AcDbExtents extmp = ex;
//                 extmp.transformBy(matrix);
//                 drawExtent(extmp);

                if (bCreateLayerName)
                {
                        AcGePoint3d ptLeftBottom = ex.minPoint();
                        ptLeftBottom.transformBy(matrix);

                        AcDbLayerTableRecordPointer pLayerTblRec(sortedLayers, AcDb::kForRead);
                        if (pLayerTblRec.openStatus() == Acad::eOk)
                        {
                                AcString strName;
                                pLayerTblRec->getName(strName);
                                if (!strName.isEmpty())
                                {
                                        AcDbMText* pNewText = new AcDbMText;
                                        pNewText->setLocation(ptLeftBottom); // set to be just to the right of the logo
                                        double dHeight = (ex.maxPoint() - ex.minPoint()).dotProduct(AcGeVector3d::kYAxis);
                                        pNewText->setTextHeight(dHeight * 0.05);
                                        //pNewText->setWidth(0.0);
                                        pNewText->setContents(strName);
                                        pNewText->setAttachment(AcDbMText::kBottomLeft);
                                        ArxDbgUtils::addToCurrentSpaceAndClose(pNewText);
                                }
                        }
                }

                const AcDbObjectIdArray& entIds = layerToObjIds];
                for (int j = 0; j < entIds.logicalLength(); j++)
                {
                        AcDbEntityPointer pEnt(entIds, AcDb::kForWrite);
                        if (pEnt.openStatus() == Acad::eOk)
                        {
                                pEnt->transformBy(matrix);
                        }
                }

                if (bIsYAxis)
                {
                        ptInsert += AcGeVector3d(0, ex.maxPoint().y - ex.minPoint().y, 0);
                }
                else
                {
                        ptInsert += AcGeVector3d(ex.maxPoint().x - ex.minPoint().x, 0, 0);
                }
                ptInsert += offVec;
        }

}

p-3-ianlcc 发表于 2024-6-2 10:43:49

SdlFreeCAD 发表于 2024-5-31 12:42


您好,请问这是arx的源码吗?
页: [1] 2
查看完整版本: 根据图层分离实体(有源码)