我在使用提供的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";
}
我似乎无法弄清楚从哪里开始。如何只选择一个图层,然后检测其中的形状。根据要研究的类别/方法,有人能指出我正确的方向吗?感谢。
答案 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);
}
}