Множественное копирование

Автор Тема: Множественное копирование  (Прочитано 2717 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн JudasАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: 0
День добрый всем.
В рамках решаемой задачи требуется обеспечит копирование объекта по точкам с полилинии.
Копирование выполняется, но только одного экземпляра и каждый раз расстояние от исходника до экземпляра растет за счет координаты.

Понимаю, что это одна и таже копия только смещается, не могу понять как сделать, что бы копия создавалась и смещалась, далее следующая копия от исходника и так далее.


Код - C# [Выбрать]
  1. [CommandMethod("GetPolyline", CommandFlags.UsePickSet)]
  2. public static void GetPolyline()
  3. {
  4.     //экземпляр класса доступа к чертежу
  5.     AccessToDocument accessToDocument = new ();
  6.     //Получаем ссылкe на документ
  7.     Document ad = accessToDocument.Doc;
  8.     // получаем ссылкe на БД
  9.     Database db = accessToDocument.DBase;
  10.  
  11.     #region Выбор сечения траншеи
  12.     //Переменная получаемая из командной строки
  13.     PromptEntityOptions EntityOption = new ("\n Выберите сечение траншеи");
  14.     //Запрос в командную строку на указание полилинии
  15.     EntityOption.SetRejectMessage("");
  16.     //проверка типа выбранного объекта
  17.     EntityOption.AddAllowedClass(typeof(Polyline), true);
  18.     //Запрос выбора объектов в области чертежа
  19.     PromptEntityResult EntityResult = ad.Editor.GetEntity(EntityOption);
  20.     //Id сечения
  21.     ObjectId crossId = ObjectId.Null;
  22.     //проверка статуса правильности выбора
  23.     if (EntityResult.Status == PromptStatus.OK)
  24.     {
  25.         crossId = EntityResult.ObjectId;
  26.     }
  27.     #endregion
  28.  
  29.     #region Линии дна траншеи
  30.     //Переменная получаемая из командной строки
  31.     EntityOption = new PromptEntityOptions("\n Выберите линию дна траншеи");
  32.     //Запрос в командную строку на указание полилинии
  33.     EntityOption.SetRejectMessage("");
  34.     //проверка типа выбранного объекта
  35.     EntityOption.AddAllowedClass(typeof(Polyline), true);
  36.     //Запрос выбора объектов в области чертежа
  37.     EntityResult = ad.Editor.GetEntity(EntityOption);
  38.     //Id линии дна
  39.     ObjectId trassId = ObjectId.Null;
  40.     //проверка статуса правильности выбора
  41.     if (EntityResult.Status == PromptStatus.OK)
  42.     {
  43.         trassId = EntityResult.ObjectId;
  44.     }
  45.     #endregion
  46.  
  47.     ObjectIdCollection collection = new() { crossId };
  48.     ObjectId ModelSpaceId = SymbolUtilityServices.GetBlockModelSpaceId(db);
  49.     IdMapping mapping = new();
  50.  
  51.  
  52.     using (Transaction tr = db.TransactionManager.StartTransaction())
  53.     {
  54.         BlockTableRecord blocktablerecord = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  55.  
  56.         //Получаем полилинию (точки) для копирования
  57.         Polyline polyTrassa = tr.GetObject(trassId, OpenMode.ForRead) as Polyline;
  58.         //Первая расчетная точка полилинии
  59.         Point3d startPoint = polyTrassa.GetPoint3dAt(0);
  60.        
  61.         //Перебор всех точек, кроме 1-ой: считается что сечение стоит там
  62.         for (int i = 0; i <= (polyTrassa.NumberOfVertices-1); i++)
  63.         {
  64.             /*
  65.             ObjectIdCollection collection = new() { crossId };
  66.             ObjectId ModelSpaceId = SymbolUtilityServices.GetBlockModelSpaceId(db);
  67.             IdMapping mapping = new();
  68.             */
  69.  
  70.             //Начальная и конечная точка отрезка на полилинии
  71.             Point3d insPoint = polyTrassa.GetPoint3dAt(i);
  72.  
  73.             db.DeepCloneObjects(collection, ModelSpaceId, mapping, false);
  74.             IdPair pair1 = mapping[crossId];
  75.  
  76.             //Открываем копию
  77.             Polyline cross = tr.GetObject(pair1.Value, OpenMode.ForWrite) as Polyline;
  78.  
  79.             //Перемещение копии
  80.             cross.TransformBy(Matrix3d.Displacement(insPoint - startPoint));
  81.         }
  82.         tr.Commit();
  83.     }
  84. }
  85.  

Оффлайн JudasАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: 0
Re: Множественное копирование
« Ответ #1 : 10-05-2024, 13:11:00 »
Получилось так
Код - C# [Выбрать]
  1. using (Teigha.DatabaseServices.Transaction tr = db.TransactionManager.StartTransaction())
  2. {
  3.     BlockTableRecord blocktableRecord = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  4.  
  5.     //Получаем полилинию (точки) для копирования
  6.     Polyline trassa = tr.GetObject(trassId, OpenMode.ForRead) as Polyline;
  7.     //Первая расчетная точка полилинии
  8.     Point3d startPoint = trassa.GetPoint3dAt(0);
  9.  
  10.     //Перебор всех точек, кроме 1-ой: считается что сечение стоит там
  11.     for (int i = 1; i <= (trassa.NumberOfVertices - 1); i++)
  12.     {
  13.         //Начальная и конечная точка отрезка на полилинии
  14.         Point3d insPoint = trassa.GetPoint3dAt(i);
  15.  
  16.         Polyline cross = tr.GetObject(crossId, OpenMode.ForRead) as Polyline;
  17.  
  18.         Polyline crossClone = cross.Clone() as Polyline;
  19.         //Перемещение копии
  20.         crossClone.TransformBy(Matrix3d.Displacement(insPoint - startPoint));
  21.  
  22.         blocktableRecord.AppendEntity(crossClone);
  23.         tr.AddNewlyCreatedDBObject(crossClone, true);
  24.  
  25.     }
  26.     tr.Commit();
  27. }
  28.  
  29.