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

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

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

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

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Клонирование FeatureLine
« : 03-06-2019, 15:24:24 »
Здравствуйте коллеги!

При клонировании характерной линии Civil 3D через FeatureLine fl = oFeatureline1.Clone() as FeatureLine; и добавлении в базу клонируемого объекта acBlkTblRec.AppendEntity(fl); ts.AddNewlyCreatedDBObject(fl, true); все прекрасно добавляется, но в при использование автокадовского Undo до самого конца списка команд удаляется не только клон характерной линии но и исходная характерная линия. Что я делаю не так и как справиться с данной проблемой?

Код - C# [Выбрать]
  1. [CommandMethod("MyGroup", "MyTest", "MyTestLocal", CommandFlags.Modal)]
  2. public void MyTest()
  3. {
  4.     var doc = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument;
  5.     Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  6.  
  7.     // Ask the user to select target feature line
  8.     PromptEntityOptions opt1 = new PromptEntityOptions("\nВыберите целевую характерную линию:");
  9.     opt1.SetRejectMessage("\nВыбранный объект должен быть характерная линия Civil 3D ...\n");
  10.     opt1.AddAllowedClass(typeof(FeatureLine), false);
  11.  
  12.     PromptEntityResult ent1 = ed.GetEntity(opt1);
  13.     if (ent1.Status != PromptStatus.OK)
  14.         return;
  15.  
  16.         FeatureLine oFeatureline1 = null;
  17.  
  18.         using (Transaction ts = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
  19.         {
  20.             oFeatureline1 = ts.GetObject(ent1.ObjectId, OpenMode.ForRead) as FeatureLine;
  21.             if (null != oFeatureline1)
  22.             {
  23.                 FeatureLine fl = oFeatureline1.Clone() as FeatureLine;
  24.                 BlockTable acBlkTbl;
  25.                 acBlkTbl = ts.GetObject(Application.DocumentManager.MdiActiveDocument.Database.BlockTableId,
  26.                                                     OpenMode.ForRead) as BlockTable;
  27.  
  28.                 // Open the Block table record Model space for write
  29.                 BlockTableRecord acBlkTblRec;
  30.                 acBlkTblRec = ts.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
  31.                                                     OpenMode.ForWrite) as BlockTableRecord;
  32.  
  33.                 acBlkTblRec.AppendEntity(fl);
  34.                 ts.AddNewlyCreatedDBObject(fl, true);
  35.             }
  36.             ts.Commit();
  37.         }
  38. }

/* Напоминаю про правило форматирования кода на форуме! Александр Ривилис */
« Последнее редактирование: 03-06-2019, 16:29:05 от Александр Ривилис »

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Клонирование FeatureLine
« Ответ #1 : 03-06-2019, 15:33:19 »
На первый взгляд, вроде всё правильно. Возможно, что метод Clone реализован криво для характерной линии. Вообще, продвинутые "автокадовские" методы работы с объектами на "сивильных" объектах часто работают неадекватно.
Я бы проверил у себя, но мне надо уже собранную dll с этой командой. Собирать самому пока что сильно некогда.
Кстати, какая версия Civil 3D?
Код в сообщении лучше форматировать как код C#, читается гораздо лучше.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Клонирование FeatureLine
« Ответ #2 : 03-06-2019, 16:54:34 »
Sergey Makarov,
Попробуй клонирование при помощи Database.DeepCloneObjects
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Онлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Клонирование FeatureLine
« Ответ #3 : 03-06-2019, 16:55:34 »
Это функция клонирования для характерных линий кривая. У меня с клонированной характеркой вообще ничего сделать нельзя - при попытке сдвинуть (MOVE) сивил вылетает. Если переделать твой код для работы с трассами, то он работает корректно.
Как вариант - клонируй в ручную.

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

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Re: Клонирование FeatureLine
« Ответ #4 : 03-06-2019, 16:57:19 »
2019 учебная со всеми SP … после загрузки чертежа, в котором уже есть характерная линия в UNDO появляется каких-то две группы команд и если их предварительно откатить, то последующее выполнение команды и откат работают нормально. А если сразу выполнить команду, а потом откатить всё - то только по ВЫБРАТЬ можно найти характерную линию и ещё УЧАСТОК!!! )) но характерной линии не видно )))
Проверил в 2018-й, тоже учебной, вроде бы всё ОК … аннннет ))) после полного отката команда работает но визуально ничего не происходит … только по команде ВЫБРАТЬ ВСЁ, можно наблюдать в окне свойств, как прибавляется счётчик для характерных линий ))
Хоть бы что-нибудь прямо работало у Autodesk …

Александр, сейчас попробую.

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

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Re: Клонирование FeatureLine
« Ответ #5 : 03-06-2019, 17:59:18 »
Как вариант - клонируй в ручную.

Если бы Autodesk предоставили CivilRX C++ SDK - не было бы этих дурацких проблем … Но где ж наберёшь столько квалифицированных С++ программеров …
VBA и .NET решили проблему с дефицитом кадров …

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Клонирование FeatureLine
« Ответ #6 : 03-06-2019, 18:42:09 »
Если бы Autodesk
Если бы у бабки был... ну и т.д. Что дали - тем и пользуемся...
По моей практике, как я уже писал выше, сивильные объекты не любят автокадовские методы клонирования, смены Id и Handle и т.п. Если нужен железобетонно работающий способ, то следует методами Civil 3D API получить все геометрические данные из исходной характерки и, опять же, методами Civil 3D API создать новую но этим данным. Потом, если необходимо, задать параметры из исходной характерки: цвет, слой и т.п.
Любой другой способ (не из Civil 3D API) может содержать неприятные сюрпризы. В том числе и Database.DeepCloneObjects.

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

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Re: Клонирование FeatureLine
« Ответ #7 : 03-06-2019, 22:56:21 »
Если бы у бабки был
Даже у бабки больше чем у Autodesk ...
В Civil 3D для FeatureLine нет статического метода Create(), нет ни конструктора, ни конструктора копирования ... есть метод создания из объекта (исключительно AutoCAD), который сначала из этой самой характерной линии нужно получить, причём плоский (для сохранения радиусов), добавить его в базу (иначе при создании необработанное исключение), а потом из него создать новую характерную линию ))) а на десерт отредактировать вершины характерной линии, которые предварительно "запомнили" ... Да, не забываем удалить полилинию из базы, из которой создали характерную линию ))) Я ничего не забыл? Это ваш стандартный способ, который вырастает в полноценный код, вместо одного статического метода Create(). Ручное управление указателями по сравнению с этим простите извратом - незначительное недоразумение )))))

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Клонирование FeatureLine
« Ответ #8 : 03-06-2019, 23:30:21 »
Ох ужас! Прямо непреодолимые сложности! Кошмар-кошмар  :D Ну чтож, раз всё так плохо, придётся отказаться от идеи создания характерки и подождать, пока Автодеск реализует для неё нужные методы...

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Клонирование FeatureLine
« Ответ #9 : 03-06-2019, 23:35:31 »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Re: Клонирование FeatureLine
« Ответ #10 : 04-06-2019, 09:31:48 »
Александр, здравствуйте!

В указанной вами ссылке приводится объявление метода, который правильнее было бы назвать CreateFrom(...) или CreateFromSpecifiedObject(…):

Код - C# [Выбрать]
  1. public static ObjectId Create(
  2.         string featurelineName,
  3.         ObjectId idCreatedFrom,
  4.         ObjectId siteId
  5. )

Ключевым параметром является ObjectId idCreatedFrom, который принимает Id объектов следующих классов: Line, Arc, Polyline, Polyline2d or Polyline3d, что в свою очередь требует "чесания левого уха исключительно правой пяткой", чем я и занимался до того, как мне пришла мысль клонировать объект.

Для осевых или трасс (кому как привычнее) есть нормальная реализация метода Create(...), каким и должен быть данный метод:

Код - C# [Выбрать]
  1. public static ObjectId Create(
  2.         CivilDocument document,
  3.         string alignmentName,
  4.         ObjectId siteId,
  5.         ObjectId layerId,
  6.         ObjectId styleId,
  7.         ObjectId labelSetId
  8. )
  9. )

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

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Re: Клонирование FeatureLine
« Ответ #11 : 04-06-2019, 09:43:49 »
Ох ужас! Прямо непреодолимые сложности! Кошмар-кошмар

Дмитрий, мне понятен ваш сарказм на тему сложностей, но я потратил немало времени на то, чтобы самостоятельно произвести все манипуляции и разобраться со всеми тонкостями, приводящими к необработанным исключениям. Учитывая то, что в отличие от ARX невозможно просто выгрузить загруженную по NETLOAD сборку .NET, процесс разработки и тестирования становится раздражающим. Вообще, .NET программирование мне очень сильно напоминает мой поход на OpenGL C++, где даже при наличие документации не всегда понятно чем думали разработчики, ваяя сей шедевр )))
Результатом того похода стал демонстрационным модуль собственного изготовления:

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Клонирование FeatureLine
« Ответ #12 : 04-06-2019, 10:13:10 »
Цитата: Александр Ривилис от 03-06-2019, 23:35:31

    Ох ужас! Прямо непреодолимые сложности! Кошмар-кошмар

Это не моя цитата.
В указанной вами ссылке приводится объявление метода, который правильнее было бы назвать CreateFrom(...) или CreateFromSpecifiedObject(…):
Значит говоря, что нет метода Create, вы были не точны. Метод есть, но он вас не устраивает. Кстати, метод DeepCloneObjects не помог?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Re: Клонирование FeatureLine
« Ответ #13 : 04-06-2019, 10:47:36 »
Александр, извините за путаницу.
Нет, пока не пробовал. Как проверю, обязательно отпишусь.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Клонирование FeatureLine
« Ответ #14 : 04-06-2019, 10:50:29 »
Александр, извините за путаницу.
Нет, пока не пробовал. Как проверю, обязательно отпишусь.
Вообще я сталкивался с ситуацией, когда и в чистом AutoCAD при _UNDO до конца стека команд стиралось что-то, что не должно было стираться. И это просто баг AutoCAD. Впрочем в какой версии и при какой ситуации это происходило я сейчас уже не вспомню, но это было очень давно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн 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 (ну может кроме последней).

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Клонирование FeatureLine
« Ответ #30 : 07-06-2019, 11:25:11 »
Ну тут как бы всё честно - в документации есть данные об этом: http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/0efe77dd-cceb-faaa-32d2-f91e1a9e7acb.htm
А то что поведение FeatureLine будет аналогичным Polyline вроде как никто не обещал...

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

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Re: Клонирование FeatureLine
« Ответ #31 : 07-06-2019, 12:24:36 »
А то что поведение FeatureLine будет аналогичным Polyline вроде как никто не обещал...
Точно )) Никто не обещал, что Civil 3D вообще будет работать … ведь для этого существуют лицензионные соглашения.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Клонирование FeatureLine
« Ответ #32 : 07-06-2019, 12:48:35 »
Никто не обещал, что Civil 3D вообще будет работать … ведь для этого существуют лицензионные соглашения.
Вообще не понял о чём это.
Характерка и полилиния - два совершенно разных объекта. У них только один далёкий общий предок - Curve. Ждать от них одинакового поведения - слегка наивно.
Ещё раз повторю - .NET API Civil 3D далёк от идеала. Не всегда он логичен, не всегда всё работает как надо. Развивается тоже не ахти как быстро. К примеру, по той же характерной линии ещё в версии 2015 в .NET API не было практически ничего, приходилось пользоваться COM API. С некоторыми объектами до сих пор дела обстоят ещё хуже. Высказывать здесь своё "фи" по этому поводу можно, но глупо, т.к. никто из участников нашего сообщества не может оказать существенного влияния на его развитие. Мы такие же простые "пользователи" этого API.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Клонирование FeatureLine
« Ответ #33 : 07-06-2019, 13:09:34 »
К примеру, по той же характерной линии ещё в версии 2015 в .NET API не было практически ничего, приходилось пользоваться COM API.
Кстати, а может быть задача решается на уровне COM API?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Клонирование FeatureLine
« Ответ #34 : 07-06-2019, 13:21:20 »
Проверил - нет. То же самое, только без Exception. Метод отрабатывает, но характерная линия не изменяется.
Я даже заглянул внутрь AeccDbMgd:
Код - C# [Выбрать]
  1. public unsafe void SetBulge(int index, double bugle)
  2. {
  3.         //IL_0023: Expected I, but got I8
  4.         //IL_0076: Expected I, but got I8
  5.         AeccDbFeatureLine* impObj = GetImpObj();
  6.         double num = 0.0;
  7.         /*OpCode not supported: CallIndirect*/;
  8.         byte status = (byte)((index >= 0 && index < (int)num) ? 1 : 0);
  9.         global::<Module>.Autodesk.Civil.Checker.CheckArgRange(status != 0);
  10.         AcGePoint3d acGePoint3d;
  11.         *(double*)(&acGePoint3d) = 0.0;
  12.         *(double*)(ref acGePoint3d + 8) = 0.0;
  13.         *(double*)(ref acGePoint3d + 16) = 0.0;
  14.         /*OpCode not supported: CallIndirect*/;
  15.         global::<Module>.Autodesk.Civil.Checker.Check(global::<Module>.AeccFeatureUtils.setBulgeAtPoint((AcDbCurve*)impObj, &acGePoint3d, bugle), "The index is not the arc segment.");
  16. }
Код - C# [Выбрать]
  1. internal static void Autodesk.Civil.Checker.Check(Acad.ErrorStatus es, string message)
  2. {
  3.         //IL_001b: Unknown result type (might be due to invalid IL or missing references)
  4.         if ((Acad.ErrorStatus)0 == es)
  5.         {
  6.                 return;
  7.         }
  8.         if ((string)null == message)
  9.         {
  10.                 Autodesk.Civil.Checker.Check(es);
  11.                 return;
  12.         }
  13.         if (es != (Acad.ErrorStatus)3)
  14.         {
  15.                 throw new Exception(es, message);
  16.         }
  17.         throw new ArgumentException(message);
  18. }
Похоже, что это ограничение объекта, заложенное в его модель.

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

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Re: Клонирование FeatureLine
« Ответ #35 : 07-06-2019, 14:16:39 »
Высказывать здесь своё "фи" по этому поводу можно, но глупо
Я высказал "фэ" или "фу", но никак ни "фи" )) и не вам, Дмитрий, а Autodesk. Не считаю глупостью высказывать своё мнение, хотя бы потому, что дружу с unmanaged С++, и знаю, как выглядит и работает качественный код.
Кривая реализация классов Civil 3d мне встречается не первый раз. Первый раз извинения приносил Augusto Goncalves: Unfortunately the Alignment object will not support custom grip points with overrule.
Прошу прощения, что не по теме … тогда всё упёрлось в это:
Код - C# [Выбрать]
  1. public class GripVectorOverrule : GripOverrule
  2. {
  3.     // A static pointer to our overrule instance
  4.     static public GripVectorOverrule theOverrule = new GripVectorOverrule();
  5.  
  6.     public override void GetGripPoints(Entity entity,
  7.                                        GripDataCollection grips,
  8.                                        double curViewUnitSize,
  9.                                        int gripSize,
  10.                                        Vector3d curViewDir,
  11.                                        GetGripPointsFlags bitFlags)
  12.     {
  13.         myGripData data = new myGripData();
  14.         data.GripPoint = newPoint3d(0.0, 0.0, 0.0);
  15.         grips.Add(data);
  16.     }
  17. }
  18.  
  19. public class myGripData  :  GripData
  20. {
  21.     public bool result;
  22.  
  23.     public myGripData()
  24.     {
  25.         result = false;
  26.         base.DrawAtDragImageGripPoint = true;
  27.         base.RubberBandLineDisabled = true;
  28.     }
  29.     public new bool AutoDelete
  30.     {
  31.         get { return result; }
  32.     }
  33. }
  34.  
  35. [CommandMethod("Test")]
  36. public void OverruleStart()
  37. {
  38.     ObjectOverrule.AddOverrule(RXClass.GetClass(typeof(Alignment)),
  39.         GripVectorOverrule.theOverrule, true);
  40. }

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Клонирование FeatureLine
« Ответ #36 : 07-06-2019, 15:05:01 »
Я высказал "фэ" или "фу", но никак ни "фи" )) и не вам, Дмитрий, а Autodesk.
Суть в том, что кроме меня и таких же программеров как я никто здесь это не прочитает. Не знаю как у других, а у меня лично весь этот поток негатива вызывает только неприязнь и раздражение. Поэтому, если есть какие-то вопросы по реализации задач - давайте обсуждать. Если есть только желание облить грязью продукт, его API, его разработчиков, погнуть пальцы и т.п. - я в дальнейшей беседе не участвую.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Клонирование FeatureLine
« Ответ #37 : 07-06-2019, 15:25:03 »
Sergey Makarov,
Присоединяюсь к мнению Дмитрий Загорулькин. Одно дело конструктивная критика, другое дел - слив негатива. С негативом пожалуйста в другие места...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Re: Клонирование FeatureLine
« Ответ #38 : 26-07-2022, 13:38:13 »
Bulge = sourceFeatureLine.GetBulge(i)

данный код приведёт к неправильному результату, если на характерной линии помимо FeatureLinePointType.PIPoint будут присутствовать точки с отметкой FeatureLinePointType.ElevationPoint

для правильного результата необходим код

Код - C# [Выбрать]
  1. Bulge = sourceFeatureLine.GetBulge((int)sourceFeatureLine.GetParameterAtPoint(points[i]))

вместо

Код - C# [Выбрать]
  1. Bulge = sourceFeatureLine.GetBulge(i)
(строка 66)

или по другому выполнить цикл прохода по точкам исходной характерной линии.