[CommandMethod("CreateSLTest")]
public void CreateSampleLinesMy()
{
// Получаем ссылки на активный документ AutoCAD ...
Document adoc = Application.DocumentManager.MdiActiveDocument;
// базу данных ...
Database db = adoc.Database;
// редактор ...
Editor ed = adoc.Editor;
// и документ Civil
CivilDocument civilDoc = CivilDocument.GetCivilDocument(db);
// Выбираем трассу на чертеже
PromptEntityOptions alignSelOpt = new PromptEntityOptions("\nВыберите трассу: ");
alignSelOpt.SetRejectMessage("\nЭто не трасса!");
alignSelOpt.AddAllowedClass(typeof(Alignment), true);
PromptEntityResult alignSelRes = ed.GetEntity(alignSelOpt);
if (alignSelRes.Status != PromptStatus.OK) return;
// Указываем точку вставки оси сечения
PromptPointResult ptRes = ed.GetPoint("\nТочка для вставки оси сечения на трассе: ");
if (ptRes.Status != PromptStatus.OK) return;
// Задаем ширины полос захвата
PromptDoubleResult leftSwL = ed.GetDistance("\nЛевая ширина полосы захвата: ");
if (leftSwL.Status != PromptStatus.OK) return;
PromptDoubleResult rightSwL = ed.GetDistance("\nПравая ширина полосы захвата: ");
if (rightSwL.Status != PromptStatus.OK) return;
// Запускаем транзакцию
using (Transaction trans = db.TransactionManager.StartTransaction())
{
// Получаем объект трассы
Alignment alignment = trans.GetObject(alignSelRes.ObjectId, OpenMode.ForRead) as Alignment;
// Вычисляем пикетаж указанной точки на трассе
double station = 0.0, offset = 0.0;
alignment.StationOffset(ptRes.Value.X, ptRes.Value.Y, ref station, ref offset);
// Id для группы осей сечений
ObjectId slgId;
// Получаем коллекцию Id групп осей сечений трассы
using (ObjectIdCollection slGroupsIds = alignment.GetSampleLineGroupIds())
{
// Если коллекция не пустая
if (slGroupsIds.Count != 0)
{
// берем Id первой группы
slgId = slGroupsIds[0];
}
// иначе
else
{
// Создаем новую группу с гарантированно уникальным названием
string sLineGrUniqueName = "SLG-" + Guid.NewGuid().ToString();
slgId = SampleLineGroup.Create(sLineGrUniqueName, alignment.ObjectId);
}
}
// Получаем объект для группы осей сечений
SampleLineGroup sampleLineGroup = trans.GetObject(slgId, OpenMode.ForWrite) as SampleLineGroup;
// Формируем уникальное название для новой оси сечения
string slUniqueName = "SL-" + Guid.NewGuid().ToString();
// Получаем COM-объект для группы осей сечений
dynamic sLgCOM = sampleLineGroup.AcadObject;
// Создаем новую ось сечения через COM, сохраняем ее COM-идентификатор
long newSlOldId = sLgCOM.SampleLines.AddByStation
(slUniqueName, station, leftSwL.Value, rightSwL.Value).ObjectID;
// Конвертируем COM-идентификатор в ObjectId
ObjectId slId = new ObjectId(new IntPtr(newSlOldId));
// Получаем объект .NET созданной оси сечения
SampleLine sampleLine = trans.GetObject(slId, OpenMode.ForWrite) as SampleLine;
// Назначаем ей первый из списка стиль
sampleLine.StyleId = civilDoc.Styles.SampleLineStyles[0];
trans.Commit();
}
}