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

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

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 видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение