Сообщество программистов Autodesk в СНГ

ADN Club => Civil 3D API => Тема начата: Sergey Makarov от 03-06-2019, 15:24:24

Название: Клонирование FeatureLine
Отправлено: Sergey Makarov от 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. }

/* Напоминаю про правило форматирования кода на форуме! Александр Ривилис */
Название: Re: Клонирование FeatureLine
Отправлено: Дмитрий Загорулькин от 03-06-2019, 15:33:19
На первый взгляд, вроде всё правильно. Возможно, что метод Clone реализован криво для характерной линии. Вообще, продвинутые "автокадовские" методы работы с объектами на "сивильных" объектах часто работают неадекватно.
Я бы проверил у себя, но мне надо уже собранную dll с этой командой. Собирать самому пока что сильно некогда.
Кстати, какая версия Civil 3D?
Код в сообщении лучше форматировать как код C#, читается гораздо лучше.
Название: Re: Клонирование FeatureLine
Отправлено: Александр Ривилис от 03-06-2019, 16:54:34
Sergey Makarov,
Попробуй клонирование при помощи Database.DeepCloneObjects
Название: Re: Клонирование FeatureLine
Отправлено: Алексей Терно от 03-06-2019, 16:55:34
Это функция клонирования для характерных линий кривая. У меня с клонированной характеркой вообще ничего сделать нельзя - при попытке сдвинуть (MOVE) сивил вылетает. Если переделать твой код для работы с трассами, то он работает корректно.
Как вариант - клонируй в ручную.
Название: Re: Клонирование FeatureLine
Отправлено: Sergey Makarov от 03-06-2019, 16:57:19
2019 учебная со всеми SP … после загрузки чертежа, в котором уже есть характерная линия в UNDO появляется каких-то две группы команд и если их предварительно откатить, то последующее выполнение команды и откат работают нормально. А если сразу выполнить команду, а потом откатить всё - то только по ВЫБРАТЬ можно найти характерную линию и ещё УЧАСТОК!!! )) но характерной линии не видно )))
Проверил в 2018-й, тоже учебной, вроде бы всё ОК … аннннет ))) после полного отката команда работает но визуально ничего не происходит … только по команде ВЫБРАТЬ ВСЁ, можно наблюдать в окне свойств, как прибавляется счётчик для характерных линий ))
Хоть бы что-нибудь прямо работало у Autodesk …

Александр, сейчас попробую.
Название: Re: Клонирование FeatureLine
Отправлено: Sergey Makarov от 03-06-2019, 17:59:18
Как вариант - клонируй в ручную.

Если бы Autodesk предоставили CivilRX C++ SDK - не было бы этих дурацких проблем … Но где ж наберёшь столько квалифицированных С++ программеров …
VBA и .NET решили проблему с дефицитом кадров …
Название: Re: Клонирование FeatureLine
Отправлено: Дмитрий Загорулькин от 03-06-2019, 18:42:09
Если бы Autodesk
Если бы у бабки был... ну и т.д. Что дали - тем и пользуемся...
По моей практике, как я уже писал выше, сивильные объекты не любят автокадовские методы клонирования, смены Id и Handle и т.п. Если нужен железобетонно работающий способ, то следует методами Civil 3D API получить все геометрические данные из исходной характерки и, опять же, методами Civil 3D API создать новую но этим данным. Потом, если необходимо, задать параметры из исходной характерки: цвет, слой и т.п.
Любой другой способ (не из Civil 3D API) может содержать неприятные сюрпризы. В том числе и Database.DeepCloneObjects.
Название: Re: Клонирование FeatureLine
Отправлено: Sergey Makarov от 03-06-2019, 22:56:21
Если бы у бабки был
Даже у бабки больше чем у Autodesk ...
В Civil 3D для FeatureLine нет статического метода Create(), нет ни конструктора, ни конструктора копирования ... есть метод создания из объекта (исключительно AutoCAD), который сначала из этой самой характерной линии нужно получить, причём плоский (для сохранения радиусов), добавить его в базу (иначе при создании необработанное исключение), а потом из него создать новую характерную линию ))) а на десерт отредактировать вершины характерной линии, которые предварительно "запомнили" ... Да, не забываем удалить полилинию из базы, из которой создали характерную линию ))) Я ничего не забыл? Это ваш стандартный способ, который вырастает в полноценный код, вместо одного статического метода Create(). Ручное управление указателями по сравнению с этим простите извратом - незначительное недоразумение )))))
Название: Re: Клонирование FeatureLine
Отправлено: Дмитрий Загорулькин от 03-06-2019, 23:30:21
Ох ужас! Прямо непреодолимые сложности! Кошмар-кошмар  :D Ну чтож, раз всё так плохо, придётся отказаться от идеи создания характерки и подождать, пока Автодеск реализует для неё нужные методы...
Название: Re: Клонирование FeatureLine
Отправлено: Александр Ривилис от 03-06-2019, 23:35:31
В Civil 3D для FeatureLine нет статического метода Create()
Есть: http://docs.autodesk.com/CIV3D/2016/ENU/API_Reference_Guide/html/2bfc99d1-18e6-0209-e350-e565e9c763b2.htm
Название: Re: Клонирование FeatureLine
Отправлено: Sergey Makarov от 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. )
Название: Re: Клонирование FeatureLine
Отправлено: Sergey Makarov от 04-06-2019, 09:43:49
Ох ужас! Прямо непреодолимые сложности! Кошмар-кошмар

Дмитрий, мне понятен ваш сарказм на тему сложностей, но я потратил немало времени на то, чтобы самостоятельно произвести все манипуляции и разобраться со всеми тонкостями, приводящими к необработанным исключениям. Учитывая то, что в отличие от ARX невозможно просто выгрузить загруженную по NETLOAD сборку .NET, процесс разработки и тестирования становится раздражающим. Вообще, .NET программирование мне очень сильно напоминает мой поход на OpenGL C++, где даже при наличие документации не всегда понятно чем думали разработчики, ваяя сей шедевр )))
Результатом того похода стал демонстрационным модуль собственного изготовления:
Название: Re: Клонирование FeatureLine
Отправлено: Александр Ривилис от 04-06-2019, 10:13:10
Цитата: Александр Ривилис от 03-06-2019, 23:35:31

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

Это не моя цитата.
В указанной вами ссылке приводится объявление метода, который правильнее было бы назвать CreateFrom(...) или CreateFromSpecifiedObject(…):
Значит говоря, что нет метода Create, вы были не точны. Метод есть, но он вас не устраивает. Кстати, метод DeepCloneObjects не помог?
Название: Re: Клонирование FeatureLine
Отправлено: Sergey Makarov от 04-06-2019, 10:47:36
Александр, извините за путаницу.
Нет, пока не пробовал. Как проверю, обязательно отпишусь.
Название: Re: Клонирование FeatureLine
Отправлено: Александр Ривилис от 04-06-2019, 10:50:29
Александр, извините за путаницу.
Нет, пока не пробовал. Как проверю, обязательно отпишусь.
Вообще я сталкивался с ситуацией, когда и в чистом AutoCAD при _UNDO до конца стека команд стиралось что-то, что не должно было стираться. И это просто баг AutoCAD. Впрочем в какой версии и при какой ситуации это происходило я сейчас уже не вспомню, но это было очень давно.
Название: Re: Клонирование FeatureLine
Отправлено: Sergey Makarov от 04-06-2019, 11:17:51
я сейчас уже не вспомню, но это было очень давно
Получается, что данная проблема никуда не исчезла - актуально и для Civil 3D 2019
Название: Re: Клонирование FeatureLine
Отправлено: Александр Ривилис от 04-06-2019, 11:21:52
Sergey Makarov,
Кстати, а команда _COPY позволяет получить копию FeatureLine? И если да, то возникает ли потом проблема с _UNDO до конца стека?
Название: Re: Клонирование FeatureLine
Отправлено: Дмитрий Загорулькин от 04-06-2019, 11:38:54
Дмитрий, мне понятен ваш сарказм на тему сложностей
Сергей, Вы сами задали такой тон обсуждению - чего же теперь удивляетесь?
Если без сарказма, то описанные манипуляции по созданию характерки - это далеко не самое сложное, что приходится иногда делать при работе с Civil 3D API. В Civil 3D API есть много огрехов, кто же спорит. Но по крайней мере, в данном случае всё прозрачно и понятно, и нужный результат достижим. Можно, в конце-концов, написать собственный библиотечный метод создания характерки, который будет принимать нужные параметры и прятать в себе всю относительную сложность этого процесса.
Название: Re: Клонирование FeatureLine
Отправлено: Sergey Makarov от 04-06-2019, 12:06:21
Кстати, а команда _COPY позволяет получить копию FeatureLine?
С командой _COPY никаких проблем нет.
Название: Re: Клонирование FeatureLine
Отправлено: Александр Ривилис от 04-06-2019, 12:57:39
С командой _COPY никаких проблем нет.
Ну тогда (теоретически) ты можешь использовать её у себя в коде, для получения копии.
Название: Re: Клонирование FeatureLine
Отправлено: Sergey Makarov от 04-06-2019, 13:36:42
Ну тогда (теоретически) ты можешь использовать её у себя в коде, для получения копии.
У вас найдётся готовый код? а то как-то с практическим решения у меня в голове пусто ))
С Database.DeepCloneObjects тот же результат - при полном UNDO характерная линия исчезает.
Использовал код по ссылке: https://forums.autodesk.com/t5/net/entity-deepclone-vs-database-deepcloneobjects/td-p/7525517
Название: Re: Клонирование FeatureLine
Отправлено: Александр Ривилис от 04-06-2019, 13:41:32
У вас найдётся готовый код? а то как-то с практическим решения у меня в голове пусто ))
Первое, что нашёл у нас на форуме: http://adn-cis.org/forum/index.php?topic=9180.msg37749#msg37749
ed это экземпляр класса Editor.
Название: Re: Клонирование FeatureLine
Отправлено: Дмитрий Загорулькин от 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.  
Название: Re: Клонирование FeatureLine
Отправлено: Sergey Makarov от 04-06-2019, 22:58:48
Дмитрий, зачем такие жертвы??? Сами говорили, что с временем напряг … тем более, что я сам подобный код уже написал перед тем как связаться с клонированием … помучился немного, но справился. Может кому-то ваш и пригодиться, конечно. Моего мнения по поводу Civil 3D это всё равно не изменит хотя бы потому, что данный код я начал ваять потыкавшись в стандартный функционал разбиения характерной линии … Могу себе представить количество ненормативной лексики было озвучено пользователями (инженерами) в адрес этого чуда-инструмента. Хотел быстренько написать адекватный аналог, но … наткнулся на не менее неадекватную реализацию .NET API для работы с теми же характерками ))). Когда-то поляки написали Softdesk.  Динамики не было, но работало лихо и умещалось на одном CD вместе с операционкой, автокадом, офисом и прочими необходимостями … Потом его купили вместе с документацией и командой Autodesk. Прошло 20 лет, допилили динамику до размера DVD двойной плотности на один Civil 3D, а пользователи и программисты до сих пор костыли выдумывают.
Как говорится, всем спасибо, коллеги!!!
Название: Re: Клонирование FeatureLine
Отправлено: Дмитрий Загорулькин от 04-06-2019, 23:06:14
Дмитрий, зачем такие жертвы??? Сами говорили, что с временем напряг …
Захотелось проверить себя - вдруг я чего-то не учитываю. Времени это заняло не особо много и оно того стоило.
Может кому-то ваш и пригодиться, конечно.
Да, именно с этой целью и выложил. Эту болванку допилить под нужды гораздо проще, чем с нуля писать.
Название: Re: Клонирование FeatureLine
Отправлено: Sergey Makarov от 06-06-2019, 18:01:06
Попробовал метод SetBulge(int index, double bulge) для уже созданного объекта FeatureLine - результат exception  >:(
Метод SetBulgeAt(int index, double bulge) для объекта Polyline прекрасно работает. Печально, что даже такая элементарная операция потребует тех же танцев с бубнами, что и копирование характерной линии …
Название: Re: Клонирование FeatureLine
Отправлено: Александр Ривилис от 06-06-2019, 20:03:41
Попробовал метод SetBulge(int index, double bulge) для уже созданного объекта FeatureLine - результат exception  >:(
Интересно какой именно exception?
Название: Re: Клонирование FeatureLine
Отправлено: Дмитрий Загорулькин от 06-06-2019, 23:48:47
Попробовал метод SetBulge(int index, double bulge) для уже созданного объекта FeatureLine - результат exception 
А "index" случайно не индекс последней вершины при возникновении ошибки? GetBulge тоже на последней вершине спотыкается. Пришлось последнюю вершину обрабатывать отдельно - строчки 61-73 в моём коде.
Название: Re: Клонирование FeatureLine
Отправлено: Sergey Makarov от 07-06-2019, 09:14:12
А "index" случайно не индекс последней вершины при возникновении ошибки?
Да нет … первой ))) oFeatureLine.SetBulge(0, 0.1); и любой другой тоже.
Civil 3d 2019
Название: Re: Клонирование FeatureLine
Отправлено: Sergey Makarov от 07-06-2019, 09:22:01
Интересно какой именно exception?
Необрабатываемое исключение в компоненте приложения на oFeatureLine.SetBulge(0, 0.1);
The index is not the arc segment.
На кривой работает без проблем, а на прямом участке исключение. У Polyline нет никаких проблем в любой точке добавить Bulge (ну может кроме последней).
Название: Re: Клонирование FeatureLine
Отправлено: Дмитрий Загорулькин от 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 вроде как никто не обещал...
Название: Re: Клонирование FeatureLine
Отправлено: Sergey Makarov от 07-06-2019, 12:24:36
А то что поведение FeatureLine будет аналогичным Polyline вроде как никто не обещал...
Точно )) Никто не обещал, что Civil 3D вообще будет работать … ведь для этого существуют лицензионные соглашения.
Название: Re: Клонирование FeatureLine
Отправлено: Дмитрий Загорулькин от 07-06-2019, 12:48:35
Никто не обещал, что Civil 3D вообще будет работать … ведь для этого существуют лицензионные соглашения.
Вообще не понял о чём это.
Характерка и полилиния - два совершенно разных объекта. У них только один далёкий общий предок - Curve. Ждать от них одинакового поведения - слегка наивно.
Ещё раз повторю - .NET API Civil 3D далёк от идеала. Не всегда он логичен, не всегда всё работает как надо. Развивается тоже не ахти как быстро. К примеру, по той же характерной линии ещё в версии 2015 в .NET API не было практически ничего, приходилось пользоваться COM API. С некоторыми объектами до сих пор дела обстоят ещё хуже. Высказывать здесь своё "фи" по этому поводу можно, но глупо, т.к. никто из участников нашего сообщества не может оказать существенного влияния на его развитие. Мы такие же простые "пользователи" этого API.
Название: Re: Клонирование FeatureLine
Отправлено: Александр Ривилис от 07-06-2019, 13:09:34
К примеру, по той же характерной линии ещё в версии 2015 в .NET API не было практически ничего, приходилось пользоваться COM API.
Кстати, а может быть задача решается на уровне COM API?
Название: Re: Клонирование FeatureLine
Отправлено: Дмитрий Загорулькин от 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. }
Похоже, что это ограничение объекта, заложенное в его модель.
Название: Re: Клонирование FeatureLine
Отправлено: Sergey Makarov от 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. }
Название: Re: Клонирование FeatureLine
Отправлено: Дмитрий Загорулькин от 07-06-2019, 15:05:01
Я высказал "фэ" или "фу", но никак ни "фи" )) и не вам, Дмитрий, а Autodesk.
Суть в том, что кроме меня и таких же программеров как я никто здесь это не прочитает. Не знаю как у других, а у меня лично весь этот поток негатива вызывает только неприязнь и раздражение. Поэтому, если есть какие-то вопросы по реализации задач - давайте обсуждать. Если есть только желание облить грязью продукт, его API, его разработчиков, погнуть пальцы и т.п. - я в дальнейшей беседе не участвую.
Название: Re: Клонирование FeatureLine
Отправлено: Александр Ривилис от 07-06-2019, 15:25:03
Sergey Makarov,
Присоединяюсь к мнению Дмитрий Загорулькин. Одно дело конструктивная критика, другое дел - слив негатива. С негативом пожалуйста в другие места...
Название: Re: Клонирование FeatureLine
Отправлено: Sergey Makarov от 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)

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