天气与日历 切换到窄版

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

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

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

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
    发表于 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);

            }

     

     

     

     

    获取AcDb3dSolid的在平面上的2D投影
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-11-1 11:40 , Processed in 0.163531 second(s), 26 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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