By Philippe Leefsma
Q:
How do I access the sub-entities of an AutoCAD entity in ObjectARX or .Net?
A:
Below are two samples in C++ and C# that illustrate how to access the AssocPersSubentityIdPE and use it to iterate through the vertices and edges of the selected entity.
////////////////////////////////////////////////////////////////////////////////////
//Use: Retrieves entity vertices & edges using 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;
}
}
}
////////////////////////////////////////////////////////////////////////////////
//Use: Retrieves entity vertices, edges, faces using AssocPersSubentityIdPE
//
////////////////////////////////////////////////////////////////////////////////
[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();
}
}
}
}
Recent Comments