Здравствуйте!
Я пишу программу, которая разбивает объекты Civil 3D. В том случае, если эти объекты разбиваются в обычном AutoCAD (при наличии Object Enabler), то все работает с помощью стандартной функции Explode.
DBObjectCollection objs = new DBObjectCollection();
ent.Explode(objs);
foreach (DBObject item in objs)
{
Entity explEnt = item as Entity;
ObjectId explId = modelBtr.AppendEntity(explEnt);
tr.AddNewlyCreatedDBObject(explEnt, true);
}
Но, когда я запускаю свою программу в Civil 3D, при разбиении некоторых объектов, в выходную коллекцию objs тянутся лишние объекты. Например, для объектов типа Autodesk.Civil.DatabaseServices.Alignment (ось) тянутся виды продольных профилей, а для объектов Autodesk.Civil.DatabaseServices.SampleLine (ось сечения) - виды поперечных профилей.
Частично я нашел решение - для Alignment можно использовать метод GetPolyline, но как решить эту же проблему для SampleLine я пока не понял. Привожу код тестовой команды (основную суть смотри со строки 40):
using System;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
// This line is not mandatory, but improves loading performances
[assembly: CommandClass(typeof(CivilObjExplodeTest.MyCommands))]
namespace CivilObjExplodeTest
{
public class MyCommands
{
// Modal Command with localized name
[CommandMethod("MyGroup", "MyCommand", "MyCommandLocal", CommandFlags.Modal)]
public void MyCommand() // This method can have any name
{
Document adoc = Application.DocumentManager.MdiActiveDocument;
if (adoc == null) return;
Database db = adoc.Database;
Editor ed = adoc.Editor;
PromptEntityOptions peo = new PromptEntityOptions("\nУкажите объекты:");
PromptEntityResult per = ed.GetEntity(peo);
if (per.Status == PromptStatus.OK)
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTableRecord modelBtr = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForWrite);
Entity ent = tr.GetObject(per.ObjectId, OpenMode.ForRead) as Entity;
Type t = ent.GetType();
ed.WriteMessage(t.ToString());
if (t.ToString().Equals("Autodesk.Civil.DatabaseServices.Alignment"))
{
ObjectId idPoly = (ObjectId)t.GetMethod("GetPolyline").Invoke(ent, null);
Entity entPoly = tr.GetObject(idPoly, OpenMode.ForRead) as Entity;
Entity copy = entPoly.Clone() as Entity;
modelBtr.AppendEntity(copy);
tr.AddNewlyCreatedDBObject(copy, true); }
else if (t.ToString().Equals("Autodesk.Civil.DatabaseServices.SampleLine"))
{
//???????
}
tr.Commit();
}
}
}
}
}
Подскажите, пожалуйста, как решить эту проблему для объекта SampleLine и какие еще типы объектов при разбиении могут тянуть за собой что-то лишнее?