Клонирование FeatureLine

Автор Тема: Клонирование FeatureLine  (Прочитано 19310 раз)

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

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

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Re: Клонирование FeatureLine
« Ответ #15 : 04-06-2019, 11:17:51 »
я сейчас уже не вспомню, но это было очень давно
Получается, что данная проблема никуда не исчезла - актуально и для Civil 3D 2019

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Клонирование FeatureLine
« Ответ #16 : 04-06-2019, 11:21:52 »
Sergey Makarov,
Кстати, а команда _COPY позволяет получить копию FeatureLine? И если да, то возникает ли потом проблема с _UNDO до конца стека?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Клонирование FeatureLine
« Ответ #17 : 04-06-2019, 11:38:54 »
Дмитрий, мне понятен ваш сарказм на тему сложностей
Сергей, Вы сами задали такой тон обсуждению - чего же теперь удивляетесь?
Если без сарказма, то описанные манипуляции по созданию характерки - это далеко не самое сложное, что приходится иногда делать при работе с Civil 3D API. В Civil 3D API есть много огрехов, кто же спорит. Но по крайней мере, в данном случае всё прозрачно и понятно, и нужный результат достижим. Можно, в конце-концов, написать собственный библиотечный метод создания характерки, который будет принимать нужные параметры и прятать в себе всю относительную сложность этого процесса.

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

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Re: Клонирование FeatureLine
« Ответ #18 : 04-06-2019, 12:06:21 »
Кстати, а команда _COPY позволяет получить копию FeatureLine?
С командой _COPY никаких проблем нет.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Клонирование FeatureLine
« Ответ #19 : 04-06-2019, 12:57:39 »
С командой _COPY никаких проблем нет.
Ну тогда (теоретически) ты можешь использовать её у себя в коде, для получения копии.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Re: Клонирование FeatureLine
« Ответ #20 : 04-06-2019, 13:36:42 »
Ну тогда (теоретически) ты можешь использовать её у себя в коде, для получения копии.
У вас найдётся готовый код? а то как-то с практическим решения у меня в голове пусто ))
С Database.DeepCloneObjects тот же результат - при полном UNDO характерная линия исчезает.
Использовал код по ссылке: https://forums.autodesk.com/t5/net/entity-deepclone-vs-database-deepcloneobjects/td-p/7525517

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Клонирование FeatureLine
« Ответ #21 : 04-06-2019, 13:41:32 »
У вас найдётся готовый код? а то как-то с практическим решения у меня в голове пусто ))
Первое, что нашёл у нас на форуме: http://adn-cis.org/forum/index.php?topic=9180.msg37749#msg37749
ed это экземпляр класса Editor.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Клонирование FeatureLine
« Ответ #22 : 04-06-2019, 16:27:59 »
Накидал по-быстрому, сильно не тестировал:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.Colors;
  3. using Autodesk.AutoCAD.DatabaseServices;
  4. using Autodesk.AutoCAD.EditorInput;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.Runtime;
  7. using Autodesk.Civil;
  8. using Autodesk.Civil.DatabaseServices;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11.  
  12. namespace C3dTest
  13. {
  14.     public class FeatureLineTest
  15.     {
  16.         [CommandMethod("CopyFeatureLine")]
  17.         public void CopyFeatureLineCmd()
  18.         {
  19.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  20.            
  21.             PromptEntityOptions entOpt
  22.                 = new PromptEntityOptions("\nSelect a feature line:");
  23.             entOpt.SetRejectMessage("\nIt is not a feature line!");
  24.             entOpt.AddAllowedClass(typeof(FeatureLine), false);
  25.  
  26.             PromptEntityResult entRes = ed.GetEntity(entOpt);
  27.             if (entRes.Status != PromptStatus.OK) return;
  28.  
  29.             CreateFeatureLineCopy(entRes.ObjectId);
  30.  
  31.             Application.ShowAlertDialog("A copy of the feature line is created!");
  32.         }
  33.  
  34.         public static ObjectId CreateFeatureLineCopy(ObjectId sourceFLineId)
  35.         {
  36.             Database db = sourceFLineId.Database;
  37.             ObjectId newFeatureLineId;
  38.             Plane xy = new Plane(Point3d.Origin, Vector3d.ZAxis);
  39.             List<VertexData> vertices = new List<VertexData>();
  40.             ObjectId plineId, siteId, styleId, layerId, lTypeId;
  41.             double ltScale;
  42.             LineWeight lineWeight;
  43.             Color color;
  44.            
  45.             using (Transaction tr = db.TransactionManager.StartTransaction())
  46.             {
  47.                 FeatureLine sourceFeatureLine = tr.GetObject
  48.                     (sourceFLineId, OpenMode.ForRead) as FeatureLine;
  49.  
  50.                 siteId = sourceFeatureLine.SiteId;
  51.                 styleId = sourceFeatureLine.StyleId;
  52.                 layerId = sourceFeatureLine.LayerId;
  53.                 lTypeId = sourceFeatureLine.LinetypeId;
  54.                 ltScale = sourceFeatureLine.LinetypeScale;
  55.                 lineWeight = sourceFeatureLine.LineWeight;
  56.                 color = sourceFeatureLine.Color;
  57.  
  58.                 Point3dCollection points = sourceFeatureLine
  59.                     .GetPoints(FeatureLinePointType.PIPoint);
  60.  
  61.                 for (int i = 0; i < points.Count - 1; i++)
  62.                 {
  63.                     vertices.Add(new VertexData
  64.                     {
  65.                         Point = points[i],
  66.                         Bulge = sourceFeatureLine.GetBulge(i)
  67.                     });
  68.                 }
  69.                 vertices.Add(new VertexData
  70.                 {
  71.                     Point = points[points.Count - 1],
  72.                     Bulge = 0
  73.                 });
  74.                
  75.                 BlockTableRecord btr = tr.GetObject
  76.                     (sourceFeatureLine.BlockId, OpenMode.ForWrite)
  77.                     as BlockTableRecord;
  78.  
  79.                 Polyline polyline = new Polyline(points.Count);
  80.                 for (int i = 0; i < vertices.Count; i++)
  81.                 {
  82.                     var data = vertices[i];
  83.                     polyline.AddVertexAt(i, data.Point.Convert2d(xy), data.Bulge, 0, 0);
  84.                 }
  85.                 plineId = btr.AppendEntity(polyline);
  86.                 tr.AddNewlyCreatedDBObject(polyline, true);
  87.  
  88.                 tr.Commit();
  89.             }
  90.  
  91.             newFeatureLineId = siteId.IsValid
  92.                     ? FeatureLine.Create(string.Empty, plineId, siteId)
  93.                     : FeatureLine.Create(string.Empty, plineId);
  94.  
  95.             using (Transaction tr = db.TransactionManager.StartTransaction())
  96.             {
  97.                 FeatureLine newFeatureLine
  98.                     = tr.GetObject(newFeatureLineId, OpenMode.ForWrite) as FeatureLine;
  99.                
  100.                 for (int i = 0; i < vertices.Count; i++)
  101.                 {
  102.                     newFeatureLine.SetPointElevation(i, vertices[i].Point.Z);                    
  103.                 }
  104.  
  105.                 newFeatureLine.StyleId = styleId;
  106.                 newFeatureLine.LayerId = layerId;
  107.                 newFeatureLine.LinetypeId = lTypeId;
  108.                 newFeatureLine.LinetypeScale = ltScale;
  109.                 newFeatureLine.LineWeight = lineWeight;
  110.                 newFeatureLine.Color = color;
  111.  
  112.                 var pline = tr.GetObject(plineId, OpenMode.ForWrite);
  113.                 pline.Erase(true);
  114.  
  115.                 tr.Commit();
  116.             }            
  117.  
  118.             return newFeatureLineId;
  119.         }
  120.  
  121.         struct VertexData
  122.         {
  123.             public Point3d Point;
  124.             public double Bulge;
  125.         }
  126.     }
  127. }
  128.  

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

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Re: Клонирование FeatureLine
« Ответ #23 : 04-06-2019, 22:58:48 »
Дмитрий, зачем такие жертвы??? Сами говорили, что с временем напряг … тем более, что я сам подобный код уже написал перед тем как связаться с клонированием … помучился немного, но справился. Может кому-то ваш и пригодиться, конечно. Моего мнения по поводу Civil 3D это всё равно не изменит хотя бы потому, что данный код я начал ваять потыкавшись в стандартный функционал разбиения характерной линии … Могу себе представить количество ненормативной лексики было озвучено пользователями (инженерами) в адрес этого чуда-инструмента. Хотел быстренько написать адекватный аналог, но … наткнулся на не менее неадекватную реализацию .NET API для работы с теми же характерками ))). Когда-то поляки написали Softdesk.  Динамики не было, но работало лихо и умещалось на одном CD вместе с операционкой, автокадом, офисом и прочими необходимостями … Потом его купили вместе с документацией и командой Autodesk. Прошло 20 лет, допилили динамику до размера DVD двойной плотности на один Civil 3D, а пользователи и программисты до сих пор костыли выдумывают.
Как говорится, всем спасибо, коллеги!!!

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Клонирование FeatureLine
« Ответ #24 : 04-06-2019, 23:06:14 »
Дмитрий, зачем такие жертвы??? Сами говорили, что с временем напряг …
Захотелось проверить себя - вдруг я чего-то не учитываю. Времени это заняло не особо много и оно того стоило.
Может кому-то ваш и пригодиться, конечно.
Да, именно с этой целью и выложил. Эту болванку допилить под нужды гораздо проще, чем с нуля писать.

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

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Re: Клонирование FeatureLine
« Ответ #25 : 06-06-2019, 18:01:06 »
Попробовал метод SetBulge(int index, double bulge) для уже созданного объекта FeatureLine - результат exception  >:(
Метод SetBulgeAt(int index, double bulge) для объекта Polyline прекрасно работает. Печально, что даже такая элементарная операция потребует тех же танцев с бубнами, что и копирование характерной линии …

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Клонирование FeatureLine
« Ответ #26 : 06-06-2019, 20:03:41 »
Попробовал метод SetBulge(int index, double bulge) для уже созданного объекта FeatureLine - результат exception  >:(
Интересно какой именно exception?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Клонирование FeatureLine
« Ответ #27 : 06-06-2019, 23:48:47 »
Попробовал метод SetBulge(int index, double bulge) для уже созданного объекта FeatureLine - результат exception 
А "index" случайно не индекс последней вершины при возникновении ошибки? GetBulge тоже на последней вершине спотыкается. Пришлось последнюю вершину обрабатывать отдельно - строчки 61-73 в моём коде.

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

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Re: Клонирование FeatureLine
« Ответ #28 : 07-06-2019, 09:14:12 »
А "index" случайно не индекс последней вершины при возникновении ошибки?
Да нет … первой ))) oFeatureLine.SetBulge(0, 0.1); и любой другой тоже.
Civil 3d 2019

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

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Re: Клонирование FeatureLine
« Ответ #29 : 07-06-2019, 09:22:01 »
Интересно какой именно exception?
Необрабатываемое исключение в компоненте приложения на oFeatureLine.SetBulge(0, 0.1);
The index is not the arc segment.
На кривой работает без проблем, а на прямом участке исключение. У Polyline нет никаких проблем в любой точке добавить Bulge (ну может кроме последней).