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

慈云数据 2024-04-23 技术支持 108 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  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  vertexIds;
        pAssocPersSubentIdPE->getAllSubentities(
                pEntity,
                AcDb::kVertexSubentType,
                vertexIds);
 
        acutPrintf(L"\n- Vertex Subentities: ");
 
        for (int i = 0; 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  edgeIds;
        pAssocPersSubentIdPE->getAllSubentities(
                pEntity,
                AcDb::kEdgeSubentType,
                edgeIds);
       
        acutPrintf(L"\n- Edge Subentities: ");
 
        for (int i = 0; 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();
            }
        }
    }
}
【高阶CAD二次开发】在ARX或.Net中使用AssocPersSubentityIdPE访问子实体
(图片来源网络,侵删)
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon