找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 306|回复: 0

获取AcDb3dSolid的在平面上的2D投影

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-2-12 22:28:15 | 显示全部楼层 |阅读模式

#include "DbSection.h"


static Acad::ErrorStatus appendWithColor(AcArray<AcDbEntity *> Ents, AcDbBlockTableRecord *btr, Adesk::UInt16 col)

        {

                Acad::ErrorStatus esBad = Acad::eOk, es;

                for(int i=0;i<Ents.length();++i)

                {

                        AcDbEntity *ent = Ents.at(i);

                        es = btr->appendAcDbEntity(ent);

                        if (es)

                        {

                                delete ent;

                                ent = nullptr;

                        }

                        else

                        {

                                esBad = es;

                                ent->setColorIndex(col);

                                ent->close();

                        }

                }

                return esBad;

        }


        static void ClearCollection(AcArray<AcDbEntity *> &Ents)

        {

                for(int i=0;i<Ents.length();++i)

                {

                        AcDbEntity *ent = Ents.at(i);

                        if (ent)

                        {

                                if (ent->database())

                                {

                                        if (ent->isReadEnabled())

                                                ent->close();

                                }

                                else

                                        delete ent;

                        }

                }

                Ents.setLogicalLength(0);

        }


        static Acad::ErrorStatus drawSilhouette(AcArray<AcDbEntity *> objIds)

        {

                Acad::ErrorStatus es;

                AcDbDatabase *db = acdbHostApplicationServices()->workingDatabase();

                AcDbObjectId entId;


                //TB: You must NOT append the entities to the modelspace! So the follwing isn't required.

                //AcDbBlockTable *pBlkTbl = NULL;

                //db->getBlockTable(pBlkTbl, AcDb::kForRead);

                //AcDbBlockTableRecord *pBlkTblRcd = NULL;

                //pBlkTbl->getAt(ACDB采用MODEL采用SPACE, pBlkTblRcd, AcDb::kForWrite);

                //pBlkTbl->close();

                //AcTransaction *pTrans = actrTransactionManager->startTransaction(); //TB: Not required

                AcDbExtents exts;

                int len = objIds.length();

                for (int i = 0; i < len; i++)

                {

                        AcDbExtents extents;

                        if (Acad::eOk != objIds.at(i)->getGeomExtents(extents)) continue;

                        exts.addPoint(extents.minPoint());

                        exts.addPoint(extents.maxPoint());

                        //pBlkTblRcd->appendAcDbEntity(entId, objIds.at(i)); //TB NO! These entities are already in the modelspace!

                }

                //actrTransactionManager->endTransaction(); //TB: not required

                //pBlkTblRcd->close();


                AcDbExtents extents;

                extents = exts;

                auto minX = extents.minPoint().x;

                auto minY = extents.minPoint().y;

                auto z = extents.maxPoint().z;

                auto maxX = extents.maxPoint().x;

                auto maxY = extents.maxPoint().y;

                //DbSection.h

                AcDbSection *pSection = new AcDbSection;

                pSection->setDatabaseDefaults(db);

                AcDbSection &section = *pSection;

                section.setState(AcDbSection::kPlane);

                section.addVertex(0, AcGePoint3d(minX, minY, z));

                section.addVertex(1, AcGePoint3d(maxX, minY, z));

                section.setViewingDirection(AcGeVector3d::kZAxis);

                section.setVerticalDirection(AcGeVector3d::kYAxis);


                AcArray<AcDbEntity *> intBoundaryEnts;

                AcArray<AcDbEntity *> intFillEnts;

                AcArray<AcDbEntity *> backgroundEnts;

                AcArray<AcDbEntity *> foregroundEnts;

                AcArray<AcDbEntity *> curveTangencyEnts;


                es = section.generateSectionGeometry(objIds, intBoundaryEnts, intFillEnts, backgroundEnts, foregroundEnts, curveTangencyEnts);

                if (es == Acad::eOk)

                {

                        AcGeMatrix3d mat;

                        mat.setToTranslation(AcGeVector3d(1000, 0, 0));


                        AcDbObjectId idModelSpace = acdbSymUtil()->blockModelSpaceId(db);

                        AcDbBlockTableRecord *modelspace;

                        es = acdbOpenObject(modelspace, idModelSpace, AcDb::kForWrite);

                        if (!es)

                        {

                                es = modelspace->appendAcDbEntity(pSection);

                                if (!es)

                                        pSection->close();

                                else

                                        delete pSection;

                                appendWithColor(intBoundaryEnts, modelspace, 1);

                                appendWithColor(intFillEnts, modelspace, 2);

                                appendWithColor(backgroundEnts, modelspace, 3);

                                appendWithColor(foregroundEnts, modelspace, 4);

                                appendWithColor(curveTangencyEnts, modelspace, 5);

                                modelspace->close();

                        }

                }


                ClearCollection(intBoundaryEnts);

                ClearCollection(intFillEnts);

                ClearCollection(backgroundEnts);

                ClearCollection(foregroundEnts);

                ClearCollection(curveTangencyEnts);


                return es;

        }


        // static void  AddIdsToSelection(AcDbObjectIdArray &ids, AcArray<AcDbEntity *> entset)

        //TB

        // 1.) AcDbObjectIdArray &ids is unused

        // 2.) You must pass entset as reference (&entset) to return the selected entities to the caller!

        static void  AddIdsToSelection(AcArray<AcDbEntity *> &entset)

        {

                Acad::ErrorStatus es;

                ads采用name selectSet;

                AcDbObjectId idSolid;

                acedSSGet(NULL, NULL, NULL, NULL, selectSet);


                Adesk::Int32 len = 0; //TB type changed from long

                acedSSLength(selectSet, &len);


                for (int i = 0; i < len; ++i)

                {

                        ads采用name en采用SS;

                        acedSSName(selectSet, i, en采用SS);

                        AcDb3dSolid *solid = nullptr;

                        es = acdbGetObjectId(idSolid, en采用SS);

                        if (!es) {

                                es = acdbOpenObject(solid, idSolid, AcDb::kForRead); //TB kForRead es enough

                                if (!es) {

                                        entset.append(solid);

                                        //solid->close(); //TB No! keep it open

                                }

                        }

                }

                acedSSFree(selectSet);

        }


        //Registered as command SOSI/SS

        void MyGroupMyCommand2() {

                AcDb3dSolid *solid = nullptr;

                AcArray<AcDbEntity *> entset;

                //AcDbObjectIdArray ids; // unused

                AddIdsToSelection(/*ids, unused*/ entset);

                drawSilhouette(entset);

        }

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-28 14:31 , Processed in 0.106693 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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