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

ADN Club => AutoCAD .NET API => Тема начата: Lemieux от 04-09-2020, 10:42:39

Название: EndPoint и Curve(Polyline2d)
Отправлено: Lemieux от 04-09-2020, 10:42:39
Всех приветствую. Кто-то может подсказать, почему мне выдаёт исключение "The method or operation is not implemented", когда я пытаюсь провернуть вот такую операцию с Polyline2d?

Код - C# [Выбрать]
  1. curve.EndPoint = new Point3d(curve.EndPoint.X - range, curve.EndPoint.Y, 0);

У меня в коде используются 2 типа линий: Line и Polyline2d, чтобы не париться с преобразованием типов я использую Curve. И укорачивание/удлинение с Line происходит нормально, а с Polyline2d выдаёт ошибку. И даже если использовать явное преобразование, то так же выдаёт ошибку.

UPD
Использование метода Extend, тоже не помогает, выдаёт ошибку "eInvalidInput"

Код - C# [Выбрать]
  1. curve.Extend(false, new Point3d(curve.EndPoint.X - range, curve.EndPoint.Y, 0));

Хотя вот в этой теме всё работает
https://forums.autodesk.com/t5/net/curve-extend/td-p/6589653
Название: Re: EndPoint и Curve(Polyline2d)
Отправлено: avc от 04-09-2020, 10:58:42
Раз написано, что метод не реализован, значит он не реализован :) Возможно вы используете старый Автокад, а в новом уже реализован. Но я думаю, методы Polyline2d уже никто никогда не будет реализовывать, так как это старье сохраняется только для совместимости. Соответственно возникает вопрос, а почему собственно не нормальный Polyline ?
Название: Re: EndPoint и Curve(Polyline2d)
Отправлено: Александр Ривилис от 04-09-2020, 11:01:02
Хотя вот в этой теме всё работает
https://forums.autodesk.com/t5/net/curve-extend/td-p/6589653
Код из этой темы у тебя работает нормально с Polyline2d?
Название: Re: EndPoint и Curve(Polyline2d)
Отправлено: Lemieux от 04-09-2020, 11:09:36
Раз написано, что метод не реализован, значит он не реализован  Возможно вы используете старый Автокад, а в новом уже реализован. Но я думаю, методы Polyline2d уже никто никогда не будет реализовывать, так как это старье сохраняется только для совместимости. Соответственно возникает вопрос, а почему собственно не нормальный Polyline ?
Я тестирую на 2020. Polyline2d идёт из того, что первый вариант моего САПРа был написан на LISPe, и LISP строит вот такие полилинии. Новая версия версия САПРа строит уже Polyline, но она только разрабатывается и полных чертежей, сделанных в новой версии, нет, поэтому отрабатываю на старой.

Код из этой темы у тебя работает нормально с Polyline2d?
Сейчас сделаю тестовый проект и скажу результаты.
Название: Re: EndPoint и Curve(Polyline2d)
Отправлено: Александр Ривилис от 04-09-2020, 11:12:43
и LISP строит вот такие полилинии.
Lisp строит и работает с Polyline2d/Polyline3d и с Polyline. Так что это не причина.
Название: Re: EndPoint и Curve(Polyline2d)
Отправлено: Александр Ривилис от 04-09-2020, 11:13:05
Только сейчас сообразил, что ты пытаешься изменить curve.EndPoint. Далеко не для всех наследников Curve это допустимая операция. В твоём же случае нужно найти последнюю вершину  Polyline2d и изменить её координату.
Название: Re: EndPoint и Curve(Polyline2d)
Отправлено: Lemieux от 04-09-2020, 11:25:14
Lisp строит и работает с Polyline2d/Polyline3d и с Polyline. Так что это не причина.
Ну, у меня строил в Polyline2d  :)

Только сейчас сообразил, что ты пытаешься изменить curve.EndPoint. Далеко не для всех наследников Curve это допустимая операция. В твоём же случае нужно найти последнюю вершину  Polyline2d и изменить её координату.
Интересная фича :)

Если сделать вот такой код, то метод Extend работает
Код - C# [Выбрать]
  1. curve.Extend(false, new Point3d(curve.EndPoint.X + range, curve.EndPoint.Y, 0));

UPD
Что интересно "-" с линиями работает.

В твоём же случае нужно найти последнюю вершину  Polyline2d и изменить её координату.
Я так и думал, но надеялся, что можно сделать более изящно.
Название: Re: EndPoint и Curve(Polyline2d)
Отправлено: Александр Ривилис от 04-09-2020, 11:35:32
Интересная фича
Это не фича. Это основной способ для изменения положения последней вершины для Polyline2d/Polyline3d.
Кстати, использование Polyline2d - достаточно опасная вещь. Обрати внимание на системную переменную PLINETYPE (https://knowledge.autodesk.com/ru/support/autocad/learn-explore/caas/CloudHelp/cloudhelp/2021/RUS/AutoCAD-Core/files/GUID-F6027128-2707-4BBE-A0A4-C757435D4874-htm.html). Если значение 2, то в старых чертежах (или сохраненных в формате старых версий) при их открытии происходит конвертация из Polyline2d в Polyline и похоже весь код у тебя работать не будет.
Название: Re: EndPoint и Curve(Polyline2d)
Отправлено: Александр Ривилис от 04-09-2020, 11:42:33
Что интересно "-" с линиями работает.
А с Polyline2d после "-" вершина остаётся в пределах между последней и предпоследней вершиной? В противном случае AutoCAD не сможет понять что ему делать. Не убирать же вершину (или несколько вершин) - это отдельный примитив...
Название: Re: EndPoint и Curve(Polyline2d)
Отправлено: Lemieux от 04-09-2020, 11:45:19
А с Polyline2d после "-" вершина остаётся в пределах между последней и предпоследней вершиной? В противном случае AutoCAD не сможет понять что ему делать. Не убирать же вершину (или несколько вершин) - это отдельный примитив...
Неа, какое бы число после "-" не стояло, не работает. Но это не работает и с Polyline, а не только с Polyline2d.
Название: Re: EndPoint и Curve(Polyline2d)
Отправлено: Александр Ривилис от 04-09-2020, 11:48:51
Но это не работает и с Polyline, а не только с Polyline2d.
Тут можешь попробовать Curve.GetSplitCurves.
Название: Re: EndPoint и Curve(Polyline2d)
Отправлено: Lemieux от 04-09-2020, 12:06:38
Вот это засада. Polyline2d реализует метод GetEnumerator, но не имеет свойства, которое отображает количество вершин, а Polyline наоборот  ;D Спасибо всем за помощь!
Название: Re: EndPoint и Curve(Polyline2d)
Отправлено: Дмитрий Загорулькин от 04-09-2020, 13:20:56
Кто-то может подсказать, почему мне выдаёт исключение "The method or operation is not implemented", когда я пытаюсь провернуть вот такую операцию с Polyline2d?
Потому что AutoCAD API разрабатывалось с грубейшими нарушениями одного из SOLID-принципов (https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8_%D0%91%D0%B0%D1%80%D0%B1%D0%B0%D1%80%D1%8B_%D0%9B%D0%B8%D1%81%D0%BA%D0%BE%D0%B2).
Название: Re: EndPoint и Curve(Polyline2d)
Отправлено: Александр Ривилис от 04-09-2020, 13:28:32
Кто-то может подсказать, почему мне выдаёт исключение "The method or operation is not implemented", когда я пытаюсь провернуть вот такую операцию с Polyline2d?
Потому что AutoCAD API разрабатывалось с грубейшими нарушениями одного из SOLID-принципов (https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8_%D0%91%D0%B0%D1%80%D0%B1%D0%B0%D1%80%D1%8B_%D0%9B%D0%B8%D1%81%D0%BA%D0%BE%D0%B2).
Когда разрабатывались примитивы AutoCAD - тогда про наследование в программировании только начинали задумываться и про абстрактный класс, производными от которого будут линии/полилинии/окружности/эллипсы/дуги и т.д. никто не думал. Тогда еще С/C++ использовались без классов (ADS/ARX), а про появление .NET никто и думать не мог...
Название: Re: EndPoint и Curve(Polyline2d)
Отправлено: Дмитрий Загорулькин от 04-09-2020, 13:40:39
Это не "наезд", это просто констатация факта  :)
Да, раньше не подумали. Сейчас уже некогда-затратно-неохота что-то изменять в устоявшемся API.
Название: Re: EndPoint и Curve(Polyline2d)
Отправлено: Александр Ривилис от 04-09-2020, 14:05:59
Сейчас уже некогда-затратно-неохота что-то изменять в устоявшемся API.
Не столько "неохота", сколько "чревато" последствиями и несовместимостью с предыдущими версиями.
Название: Re: EndPoint и Curve(Polyline2d)
Отправлено: Привалов Дмитрий от 04-09-2020, 14:13:50
Когда разрабатывались примитивы AutoCAD - тогда про наследование в программировании только начинали задумываться и про абстрактный класс, производными от которого будут линии/полилинии/окружности/эллипсы/дуги и т.д. никто не думал. Тогда еще С/C++ использовались без классов (ADS/ARX), а про появление .NET никто и думать не мог...

Начиналось все до С. И С вроде наследование тоже не поддерживал?

Изначально система была написана с помощью самописного компилятора SPL и запускалась на компьютере M9900, было решено ее переписать на языках C и PL/1 под разные платформы. Так появилось два варианта: MicroCAD-80 (версия для процессора 8080 на языке PL/1 для CP/M-86) и MicroCAD-86 (версия для процессора 8086 на языке C для IBM PC)

версия AutoCAD-86 вышла чуть позже - 15 января 1983
Принцип подстановки Барбары Лисков, предложенным Барбарой Лисков в 1987.

Очень интересная история развития AutoCAD.
https://mikhailov-andrey-s.blogspot.com/2017/05/istoriya-autocad.html
Название: Re: EndPoint и Curve(Polyline2d)
Отправлено: Александр Ривилис от 04-09-2020, 14:19:37
И С вроде наследование тоже не поддерживал?
Не поддерживал и не поддерживает. Поддерживает только C++. Но для компиляции AutoCAD и для создания его приложений он стал использоваться только начиная с AutoCAD R13C4.
Название: Re: EndPoint и Curve(Polyline2d)
Отправлено: Дмитрий Загорулькин от 04-09-2020, 15:22:05
Очень интересная история развития AutoCAD.
https://mikhailov-andrey-s.blogspot.com/2017/05/istoriya-autocad.html
Да, действительно, очень интересно!