【高阶CAD二次开发】在ARX或.Net中使用AssocPersSubentityIdPE访问子实体

发布于:2024-04-23 ⋅ 阅读:(21) ⋅ 点赞:(0)

标题如何在ObjectARX或。net中访问AutoCAD实体的子实体?

下面是c++和c#中的两个示例,它们演示了如何访问AssocPersSubentityIdPE并使用它遍历所选实体的顶点和边缘。

void ArxSubEntityPE()

{

        Acad::ErrorStatus err;

 

        ads_name name;

        ads_point pt;

 

        if(acedEntSel(L"\nSelect an Entity: ", name, pt) != RTNORM)

                return;

 

        AcDbObjectId id;

        acdbGetObjectId(id, name);

 

        AcDbObjectPointer <AcDbEntity> pEntity(id, AcDb::kForRead);

 

        // Get the Protocol extension associated with the entity

        AcDbAssocPersSubentIdPE* const pAssocPersSubentIdPE =

                AcDbAssocPersSubentIdPE::cast(

                        pEntity->queryX(AcDbAssocPersSubentIdPE::desc()));

 

        if( pAssocPersSubentIdPE == NULL)

                return;

 

        AcArray <AcDbSubentId> vertexIds;

        pAssocPersSubentIdPE->getAllSubentities(

                pEntity,

                AcDb::kVertexSubentType,

                vertexIds);

 

        acutPrintf(L"\n- Vertex Subentities: ");

 

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

        {

                AcDbFullSubentPath path(id, vertexIds[i]);

 

                AcDbPoint* pPoint = AcDbPoint::cast(pEntity->subentPtr(path));

       

                if (pPoint != NULL)

                {

                   AcGePoint3d pos = pPoint->position();

                   acutPrintf(L"\n . Vertex: [%.2f, %.2f, %.2f]",

                       pos.x, pos.y, pos.z);


                        delete pPoint;

                }

        }

 

        AcArray <AcDbSubentId> edgeIds;

        pAssocPersSubentIdPE->getAllSubentities(

                pEntity,

                AcDb::kEdgeSubentType,

                edgeIds);

       

        acutPrintf(L"\n- Edge Subentities: ");

 

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

        {

                AcDbFullSubentPath path(id, edgeIds[i]);

 

                AcDbEntity* pSubEntity = pEntity->subentPtr(path);

       

                if (pSubEntity != NULL)

                {

                        acutPrintf(L"\n . %s (Id = %d)",

                                pSubEntity->isA()->name(),

                                edgeIds[i].index());

 

                        delete pSubEntity;

                }

        }

}

 
[CommandMethod("SubEntityPE")]

public void SubEntityPE()

{

    Document doc = Application.DocumentManager.MdiActiveDocument;

    Database db = doc.Database;

    Editor ed = doc.Editor;

 

    PromptEntityOptions peo = new PromptEntityOptions(

        "\nSelect an Entity: ");

 

    PromptEntityResult per = ed.GetEntity(peo);

 

    if (per.Status != PromptStatus.OK)

        return; 

 

    using (Transaction Tx = db.TransactionManager.StartTransaction())

    {

        Entity entity = Tx.GetObject(per.ObjectId, OpenMode.ForRead)

            as Entity;

 

        ObjectId[] entId = new ObjectId[] { entity.ObjectId };

 

        IntPtr pSubentityIdPE = entity.QueryX(

            AssocPersSubentityIdPE.GetClass(

            typeof(AssocPersSubentityIdPE)));

 

        if (pSubentityIdPE == IntPtr.Zero)

            //Entity doesn't support the subentityPE

            return;

 

        AssocPersSubentityIdPE subentityIdPE =

            AssocPersSubentityIdPE.Create(pSubentityIdPE, false)

                as AssocPersSubentityIdPE;

 

        SubentityId[] vertexIds = subentityIdPE.GetAllSubentities(

            entity,

            SubentityType.Vertex);

 

        ed.WriteMessage("\n- Vertex Subentities: ");

 

        foreach (SubentityId subentId in vertexIds)

        {

            FullSubentityPath path = new FullSubentityPath(entId, subentId);

 

            DBPoint vertex = entity.GetSubentity(path) as DBPoint;

 

            if (vertex != null)

            {

                ed.WriteMessage(

                    "\n . Vertex: [{0}, {1}, {2}]",

                    vertex.Position.X,

                    vertex.Position.Y,

                    vertex.Position.Z);

 

                vertex.Dispose();

            }

        }

 

        SubentityId[] edgeIds = subentityIdPE.GetAllSubentities(

            entity,

            SubentityType.Edge);

 

        ed.WriteMessage("\n- Edge Subentities: ");

 

        foreach (SubentityId subentId in edgeIds)

        {

            FullSubentityPath path = new FullSubentityPath(entId, subentId);

 

            Entity edgeEntity = entity.GetSubentity(path);

 

            if (edgeEntity != null)

            {

                ed.WriteMessage("\n . " + edgeEntity.ToString());

                edgeEntity.Dispose();

            }

        }

 

 

        SubentityId[] faceIds = subentityIdPE.GetAllSubentities(

            entity,

            SubentityType.Face);

 

        ed.WriteMessage("\n- Face Subentities: ");

 

        foreach (SubentityId subentId in faceIds)

        {

            FullSubentityPath path = new FullSubentityPath(entId, subentId);

 

            Entity faceEntity = entity.GetSubentity(path);

 

            if (faceEntity != null)

            {

                ed.WriteMessage("\n . " + faceEntity.ToString());

                faceEntity.Dispose();

            }

        }

    }

}