Autocad API检测图层内部的形状

时间:2014-06-17 16:24:43

标签: c# autocad autodesk autocad-plugin objectarx

我在使用提供的API时使用Autocad 2012。我正在开发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";
}

我似乎无法弄清楚从哪里开始。如何只选择一个图层,然后检测其中的形状。根据要研究的类别/方法,有人能指出我正确的方向吗?感谢。

1 个答案:

答案 0 :(得分:1)

最终,您需要再次查看AutoCAD对象模型。 BlockTableRecord" ModelSpace"是包含所有具有图层分配的AutoCAD实体的内容。一旦你打开BlockTableRecord进行阅读,你就可以过滤到与你感兴趣的任何层匹配的实体.LINQ在这里可以派上用场。

在这个实例中,您实际上并不关心图层的objectID,只是名称。您只想在更改图层时打开LayerTableRecord。如果您要更改实体属性,您确实需要熟悉Transaction类。除了使用' As'之外,还有更快的替代方案。在AutoCAD中利用RXObject.GetClass()。

*实体也可以存在于其他BlockTableRecords(例如任何其他布局)中,但现在你可能只使用模型空间。

这是一个让你开始的小片段:

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);
    }
}