Autocad API обнаруживает фигуры внутри слоя
Я использую 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";
}
Я не могу понять, куда идти отсюда, хотя. Как выбрать только один слой, а затем определить формы внутри него. Может ли кто-нибудь указать мне правильное направление, с точки зрения того, какие классы / методы следует изучать? Благодарю.
2 ответа
В конечном счете, вам нужно еще раз взглянуть на объектную модель AutoCAD. BlockTableRecord "ModelSpace" - это то, что будет содержать все * объекты AutoCAD, которые имеют назначения слоев. После того, как вы откроете BlockTableRecord для чтения, вы можете отфильтровать объекты, соответствующие интересующим вас слоям. LINQ может пригодиться здесь.
Вы на самом деле не заботитесь об objectID слоя в этом случае, только о имени. Вы действительно открываете LayerTableRecord только тогда, когда хотите изменить слой. Если вы будете изменять свойства сущности, вам действительно необходимо ознакомиться с классом Transaction. Существует также более быстрая альтернатива использованию "как" в 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);
}
}
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);
}
}