C# Autocad API检测图层内的形状

C# Autocad API检测图层内的形状,c#,autocad,autodesk,autocad-plugin,objectarx,C#,Autocad,Autodesk,Autocad Plugin,Objectarx,我正在使用Autocad 2012和提供的API。我在c 我试图做的是选择一个特定的层,并检测该层中的所有矩形/正方形。Ultimateley,我希望能够在我用坐标检测到的所有矩形的内部绘制 到目前为止,我正在使用LayerTable类和GetObjects将层与对象关联,如下所示: LayerTable layers; layers = acTrans.GetObject(acCurDb.LayerTableId, OpenMode.ForRead) as LayerTable; Strin

我正在使用Autocad 2012和提供的API。我在c

我试图做的是选择一个特定的层,并检测该层中的所有矩形/正方形。Ultimateley,我希望能够在我用坐标检测到的所有矩形的内部绘制

到目前为止,我正在使用LayerTable类和GetObjects将层与对象关联,如下所示:

LayerTable layers;
layers = acTrans.GetObject(acCurDb.LayerTableId, OpenMode.ForRead) as LayerTable;

String layerNames = "";

foreach (ObjectId layer in layers)
{
    LayerTableRecord layerTableRec;
    layerTableRec = acTrans.GetObject(layer, OpenMode.ForRead) as LayerTableRecord;
    layerNames += layerTableRec.Name+"\n";
}

不过,我似乎不知道该从这里走到哪里。如何只选择一层,然后检测其中的形状。有人能给我指出正确的方向吗,关于要研究哪些类/方法?谢谢。

最后,您需要再次查看AutoCAD对象模型。BlockTableRecord模型空间将包含所有具有图层指定的AutoCAD图元*。打开BlockTableRecord进行读取后,您可以向下过滤到与您感兴趣的任何层匹配的实体。林克在这里可以派上用场

在本例中,您实际上并不关心层的objectID,只关心名称。只有在需要更改图层时,才真正打开LayerTableRecord。如果要更改实体属性,您确实需要熟悉事务类。通过利用RXObject.GetClass,还有一种比在AutoCAD中使用“As”更快的替代方法

*实体也可以存在于其他BlockTableRecords中,例如任何其他布局,但现在您可能只需要使用modelspace即可

下面是一个小片段,让您开始学习:

var acDoc = Application.DocumentManager.MdiActiveDocument;
var acDb = acDoc.Database;

using (var tr = database.TransactionManager.StartTransaction())
{
    try
    {
        var entClass = RXObject.GetClass(typeof(Entity));
        var modelSpaceId = SymbolUtilityServices.GetBlockModelSpaceId(acDb);
        var modelSpace = (BlockTableRecord)tr.GetObject(modelSpaceId, OpenMode.ForRead);

        foreach (ObjectId id in modelSpace)
        {
            if (!id.ObjectClass.IsDerivedFrom(entClass)) // For entity this is a little redundant, but it works well with derived classes
                continue;

            var ent = (Entity)tr.GetObject(id, OpenMode.ForRead)

            // Check for the entity's layer
            // You'll need to upgrade the entity to OpenMode.ForWrite if you want to change anything
        }

        tr.Commit();
    }
    catch (Autodesk.AutoCAD.Runtime.Exception ex)
    {
        acDoc.Editor.WriteMessage(ex.Message);
    }
}

如果您使用的是“as LayerTableRecord”,请确保检查layerTableRec是否为空。