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

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

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

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

  • 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
  • *****
  • Сообщений: 13829
  • Карма: 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
  • *****
  • Сообщений: 13829
  • Карма: 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)

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