2014-06-17 43 views
1

我正在使用提供的API使用Autocad 2012。我正在用C#开发。Autocad API检测图层内的形状

我想要做的是选择某个图层,并“检测”该图层中的所有矩形/方块。 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"; 
} 

我似乎无法找出从这里到,虽然走。如何只选择一个图层,然后检测其内部的形状。有人能指出我正确的方向,根据什么类/方法进行研究?谢谢。

+0

如果你使用“作为LayerTableRecord”确保检查layerTableRec为空的习惯。 –

回答

1

最终,您需要再看看AutoCAD对象模型。 BlockTableRecord“ModelSpace”包含所有具有图层分配的AutoCAD实体。一旦你打开BlockTableRecord进行阅读,你可以筛选出与你感兴趣的任何图层匹配的实体.LINQ可以在这里派上用场。

在这个例子中,你并不关心图层的objectID,只是名字。当你想改变图层时,你只能真正打开LayerTableRecord。如果您要更改实体属性,则需要熟悉Transaction类。通过利用RXObject.GetClass(),在AutoCAD中使用“As”也有更快的选择。

*实体也可以存在于其他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); 
    } 
}