标题如何在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(); } } } }

(图片来源网络,侵删)