[CDR 2024] Макрос замкнуть кривую

  • Автор темы Автор темы Verion
  • Дата начала Дата начала

Verion

Топикстартер
10 лет на форуме
Сообщения
24
Реакции
0
Доброго всем) Подскажите пожалуйста как должен выглядеть макрос, чтобы замкнуть кривую у объекта между определёнными узлами(то есть не через .closed). Чуть подробнее - есть несколько незамкнутых объединённых объектов и нужно их концевые узлы соединить сегментами в определённом порядке. Как найти нужные узлы и прочее уже разобрался, а вот как сегмент между узлами сделать никак ни найти ни понять не могу.
 
Хороший вопрос. Если мне не изменяет склероз, средствами VBA нельзя просто так взять и обьединить два SubPath в один, надо понодово добавлять.
Проверить просто - попробуйте записать в макрос действие обьединение двух нод в одну - что на выходе?
 
Хороший вопрос. Если мне не изменяет склероз, средствами VBA нельзя просто так взять и обьединить два SubPath в один, надо понодово добавлять.
Проверить просто - попробуйте записать в макрос действие обьединение двух нод в одну - что на выходе?
Да макрос вообще тупо в CorelDraw записывается - любая работа с узлами в макросе записывается как ну грубо пересоздание объекта(то бишь он типа удаляет старый и создаёт новый с внесёнными изменениями)
 
Вообще говоря, в новом API, вроде, добавили метод Curve.JoinTouchingSubpath coreldraw-object-model/differences/18-17.md at master · cdrpro-macros/coreldraw-object-model
который, вроде как, должен обьединять SubPaths с одинаковыми нодами, но лично я таким ни разу не пользовался, пробуйте
Ну это не то, это метод превращает два концевых узла в один, если они находятся в одной точке, грубо говоря это функция "Соединить два узла в один" только для целой фигуры. А мне нужна функция "Замкнуть кривую"(приложил скриншоты, соответственно первый до нажатия, второй после)
 

Вложения

  • Screenshot_1.jpg
    Screenshot_1.jpg
    22.3 КБ · Просм.: 36
  • Screenshot_2.jpg
    Screenshot_2.jpg
    15.1 КБ · Просм.: 37
Ну это не то, это метод превращает два концевых узла в один, если они находятся в одной точке, грубо говоря это функция "Соединить два узла в один" только для целой фигуры. А мне нужна функция "Замкнуть кривую"(приложил скриншоты, соответственно первый до нажатия, второй после)
Так это совсем просто - у Curve есть аттрибут Closed. Возможно, придется добавить в SubPath последний узел.
 
Так это совсем просто - у Curve есть аттрибут Closed. Возможно, придется добавить в SubPath последний узел.
Так я в самом начале написал, что .closed мне не годится, так как начальные объекты у меня скорее выглядят так(прилагаю скриншоты, снизу развёл узлы для понимания)
 

Вложения

  • Screenshot_3.jpg
    Screenshot_3.jpg
    33.7 КБ · Просм.: 35
Я написал скрипт для разъдинения узлов в нужных мне точках, теперь их нужно соединить в правильном порядке)
 

Вложения

  • Screenshot_4.jpg
    Screenshot_4.jpg
    21 КБ · Просм.: 26
Последнее редактирование:
Последнее редактирование:
Кривой непредсказуем, поэтому для себя выбрал прямой.
 
Так я в самом начале написал, что .closed мне не годится, так как начальные объекты у меня скорее выглядят так(прилагаю скриншоты, снизу развёл узлы для понимания)
Чтото я вас совсем перестаю понимать, ни так ни эдак не подходит. 'hz'
Вы разьединяете узлы - получаете несколько незамкнутых SubPath с совпадающими конечными узлами - так? Потом вы делаете JoinTouchingSubpath - она соединяет их обратно. Для того, чтобы соединить два шейпа вам надо их разомкнуть, довести крайние узлы до соседних, скомбинировать и снова JoinTouchingSubpath - в теории выглядит вполне логично, чего я недопонимаю?
 
их нужно соединить в правильном порядке
без кода - просто ход размышлений
две разорванных кривых L1 L2 - вы можете определить координаты точек старта и окончания - X1s, Y1s X1e,Y1e и X2s, Y2s X2e,Y2e
создаете две линии L3 L4 по координатам X1s, Y1s, X2e,Y2e и X1e,Y1e, X2s, Y2s - т.е. конец одной с началом другой и наоборот
у вас получается 4 поименованных объекта
"Свариваете" их через Weld - и "Ваш рататуй готов!"

... но есть Нюансы
вот в вашей иллюстрации - всё чудненько
1744199220119.png
а если будет как-то так?
1744199372073.png
 
Допустим, у меня разрыв между точками #2 и #3 в кривой и я хочу соединить из отрезком:
Код:
Sub ConnectNodes()
  ActiveShape.Curve.Nodes(2).ConnectWith ActiveShape.Curve.Nodes(3)
End Sub
В Вашем случае подставьте нужные вам точки.
 
Последнее редактирование:
Допустим, у меня разрыв между точками #2 и #3 в кривой и я хочу соединить из отрезком:
Код:
Sub ConnectNodes()
  ActiveShape.Curve.Nodes(2).ConnectWith ActiveShape.Curve.Nodes(3)
End Sub
В Вашем случае подставьте нужные вам точки.
увы, пишет что указанный узел относится к другой кривой.
 
Я когда-то похожий макрос написал
 

Вложения

  • AutoClosing.gif
    AutoClosing.gif
    108.2 КБ · Просм.: 27
без кода - просто ход размышлений
две разорванных кривых L1 L2 - вы можете определить координаты точек старта и окончания - X1s, Y1s X1e,Y1e и X2s, Y2s X2e,Y2e
создаете две линии L3 L4 по координатам X1s, Y1s, X2e,Y2e и X1e,Y1e, X2s, Y2s - т.е. конец одной с началом другой и наоборот
у вас получается 4 поименованных объекта
"Свариваете" их через Weld - и "Ваш рататуй готов!"

... но есть Нюансы
вот в вашей иллюстрации - всё чудненько
Посмотреть вложение 172434
а если будет как-то так?
Посмотреть вложение 172435
По поводу Вельда - ну объект то замкнутым не станет)
А если будет по другому - не будет, так как размыкание узлов происходит в нижних точках близко друг к другу, это часть скрипта)
 
Последнее редактирование: