[CommandMethod("GetPolyline", CommandFlags.UsePickSet)]
public static void GetPolyline()
{
//экземпляр класса доступа к чертежу
AccessToDocument accessToDocument = new ();
//Получаем ссылкe на документ
Document ad = accessToDocument.Doc;
// получаем ссылкe на БД
Database db = accessToDocument.DBase;
#region Выбор сечения траншеи
//Переменная получаемая из командной строки
PromptEntityOptions EntityOption = new ("\n Выберите сечение траншеи");
//Запрос в командную строку на указание полилинии
EntityOption.SetRejectMessage("");
//проверка типа выбранного объекта
EntityOption.AddAllowedClass(typeof(Polyline), true);
//Запрос выбора объектов в области чертежа
PromptEntityResult EntityResult = ad.Editor.GetEntity(EntityOption);
//Id сечения
ObjectId crossId = ObjectId.Null;
//проверка статуса правильности выбора
if (EntityResult.Status == PromptStatus.OK)
{
crossId = EntityResult.ObjectId;
}
#endregion
#region Линии дна траншеи
//Переменная получаемая из командной строки
EntityOption = new PromptEntityOptions("\n Выберите линию дна траншеи");
//Запрос в командную строку на указание полилинии
EntityOption.SetRejectMessage("");
//проверка типа выбранного объекта
EntityOption.AddAllowedClass(typeof(Polyline), true);
//Запрос выбора объектов в области чертежа
EntityResult = ad.Editor.GetEntity(EntityOption);
//Id линии дна
ObjectId trassId = ObjectId.Null;
//проверка статуса правильности выбора
if (EntityResult.Status == PromptStatus.OK)
{
trassId = EntityResult.ObjectId;
}
#endregion
ObjectIdCollection collection = new() { crossId };
ObjectId ModelSpaceId = SymbolUtilityServices.GetBlockModelSpaceId(db);
IdMapping mapping = new();
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTableRecord blocktablerecord = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
//Получаем полилинию (точки) для копирования
Polyline polyTrassa = tr.GetObject(trassId, OpenMode.ForRead) as Polyline;
//Первая расчетная точка полилинии
Point3d startPoint = polyTrassa.GetPoint3dAt(0);
//Перебор всех точек, кроме 1-ой: считается что сечение стоит там
for (int i = 0; i <= (polyTrassa.NumberOfVertices-1); i++)
{
/*
ObjectIdCollection collection = new() { crossId };
ObjectId ModelSpaceId = SymbolUtilityServices.GetBlockModelSpaceId(db);
IdMapping mapping = new();
*/
//Начальная и конечная точка отрезка на полилинии
Point3d insPoint = polyTrassa.GetPoint3dAt(i);
db.DeepCloneObjects(collection, ModelSpaceId, mapping, false);
IdPair pair1 = mapping[crossId];
//Открываем копию
Polyline cross = tr.GetObject(pair1.Value, OpenMode.ForWrite) as Polyline;
//Перемещение копии
cross.TransformBy(Matrix3d.Displacement(insPoint - startPoint));
}
tr.Commit();
}
}