Autocad API检测内层形状

本文关键字:API 检测 Autocad | 更新日期: 2023-09-27 18:08:56

我使用Autocad 2012提供的API。我正在用c#开发。

我要做的是选择一个特定的图层,并"检测"该图层中的所有矩形/正方形。最后,我希望能够绘制所有我已经"检测"到的矩形的内部(使用它们的坐标)。

到目前为止,我使用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 API检测内层形状

最后,您需要再看一下AutoCAD对象模型。BlockTableRecord"ModelSpace"将包含所有具有图层分配的AutoCAD实体。一旦打开BlockTableRecord供读取,就可以过滤到与感兴趣的任何层匹配的实体。LINQ在这里会派上用场。

在这个实例中你并不关心层的objectID,只关心它的名字。只有当你想要改变一个层的时候你才会打开LayerTableRecord。如果您要更改实体属性,那么您确实需要熟悉Transaction类。通过利用RXObject.GetClass(),还有一种更快的替代方法可以在AutoCAD中使用"As"。

*实体也可以生活在其他blocktablerrecords中(例如任何额外的布局),但现在你可能只需要模型空间就可以了。

这里有一小段代码供您入门:

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);
    }
}
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)
        {
            Entity acEnt = (Entity)tr.GetObject(id, OpenMode.ForRead);
string layerName = acEnt.Name;       
        }
        tr.Commit();
    }
    catch (Autodesk.AutoCAD.Runtime.Exception ex)
    {
        acDoc.Editor.WriteMessage(ex.Message);
    }
}