| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Новые команды для работы с полилинией

Новые команды для работы с полилинией

Ответ
Поиск в этой теме
Непрочитано 14.09.2006, 13:30 4 |
Новые команды для работы с полилинией
VVA
 
Инженер LISP
 
Минск
Регистрация: 11.05.2005
Сообщений: 6,990

Данный набор программ является коллективным продуктом участников форумов autocad.ru и dwg.ru с моими доработками.
Захотелось собрать все программы для работы с полилиниями воедино и оформить как полагается.

=========== Доступные команды PLTOOLS=================
Редакция 17.06.2014
PL-JOIN -Объединение выбранных полилиний
PL-VFI -вставка вершин в выбранной полилинии в местах пересечения с
указанными полилиниями, линиями, дугами
PL-JOIN3D -Объединение 3D полилиний
PL-L2A -Замена линейного сегмента в полилинии дуговым сегментом.
PL-A2L -Замена дугового сегмента в полилинии линейным сегментом.
PL-DIV -Разбивает выбранный сегмент полилинии на указанное количество
сегментов или через указанное расстояние
PL-DIVAll -Разбивает все сегменты полилинии на указанное количество
сегментов или через указанное расстояние
PL-VxAdd -Добавляет новую вершину к полилинии
ENTREVS -Реверс объекта
ENTREV -Реверс объектов (множественный выбор)
PL-CW -Реверс выбранных полилиний по часовой стрелке
PL-CCW -Реверс выбранных полилиний против часовой стрелки
PL-VxRdc -Удаление вершин полилиний, которые лежат на одной прямой
PL-VxDel -Удаление выбранной вершины
pl-VxOpt -Удаление совпадающих вершин из полилинии
PL-NoArc -Аппроксимация дуговых сегментов полилинии
PL-Clone -Построение полилинии путем копирования ее сегментов
PL-VxMove -Перемещение вершин полилинии
PL-Vx1 -Изменение начала полилинии
ConvTo2d -Преобразование линейных объектов в 2D полилинии
ConvTo3d -Преобразование линейных объектов в 3D полилинии
MPL -Построение средней линии Более продвинутая версия Rollin_Ball.lsp Find MidBoundary between two polylines.
R3P -Прямоугольгик по 3-м точкам
PL-P90 -Рисование перпендикулярных друг к другу сегментов полилинии
PL-CSE -Объединение 2d полилиний по примитиву
PL-SgWidth -Изменить ширину сегмента полилинии

Реверс дуговых сегментов полилинии из #79
На дуговых сегментах полилинии тип линий может быть "вверх тормашками", причем реверс не помогает. Этот артефакт можно побороть, если в полилинии включить "генерацию типа линий".

Панели, лисп и инструкции здесь http://dwg.ru/dnl/607
Иконки для темной темы здесь
Обсуждаем, критикуем, предлагаем

Миниатюры
Нажмите на изображение для увеличения
Название: plrevers.jpg
Просмотров: 15347
Размер:	30.3 Кб
ID:	21079  


Последний раз редактировалось VVA, 08.09.2023 в 13:25. Причина: ссылка на иконки для темной темы
Просмотров: 367889
 
Непрочитано 20.12.2010, 14:24
#341
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 980


Цитата:
Сообщение от evg76 Посмотреть сообщение
растояния в 50 метров особую радость на листе формата А4 не будет
Радости - не будет. А вот точность вычислений может пострадать запросто.
Цитата:
Сообщение от evg76 Посмотреть сообщение
почему обязательно надо что то доказывать
Потому что надо полностью и сразу ставить задачу. Потому что слова "все посчитать на чертеже" после разбора запросто могут стать 20-страничным описанием задачи. Потому что просьба "сделать перенумерацию" может потребовать около 2 недель работы.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 20.12.2010, 14:36
#342
evg76


 
Регистрация: 25.02.2009
Сообщений: 82


полностью согласен,
я вижу вы уже пороху то понюхали , между прочим "PL-VxRdc -Удаление вершин полилиний, которые лежат на одной прямой" даная команда почти этим же занимается, и никто о точности не заикается здесь только критерии другие.
И все же аналог граблей мона сотворить?

Последний раз редактировалось evg76, 20.12.2010 в 14:55.
evg76 вне форума  
 
Непрочитано 20.12.2010, 14:51
#343
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 980


Наверное, можно. Если задание будет, к примеру, таким: "Все дуговые сегменты аппроксимируются не менее чем 2 дополнительными вершинами с шагом центрального угла не более 10°. В прямолинейном сегменте вершина удаляется, если площадь треугольника, образованного ею и двумя соседними, менее 20 ед.чертежа либо угол между двумя соседними сегментами более 170°".
Фантазии место есть. Правда, меня на подобную математику вряд ли хватит...
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 22.12.2010, 09:38
#344
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


VVA, есть ли возможность объединения в полилинию группы последовательных отрезков, у части из которых перепутаны местами начало и конец? Без изменения их начала/конца.
То есть, имеется несимметричный тип линии __*__*__*__, но при построении отрезка справа налево линия "переворачивается", и чтобы этого не произошло, приходится для некоторых углов (типа pi) менять направление построения (т.е. менять конец и начало). И в результате получается группа последовательных отрезков вида: (Начало-Конец)-(Начало-Конец)-(Конец-Начало)-(Начало-Конец)-(Конец-Начало).
PEDIT у меня почему-то то объединяет эти отрезки, меняя им направления, то нормально объединяет, но очень редко. Закономерности не увидел.

Так вот, Вы как эксперт по полилиниям можете подсказать, что делать для правильного объединения таких отрезков в полилинию? Может, одна из Ваших программ для работы с полилиниями это делает хорошо?
Tonic вне форума  
 
Автор темы   Непрочитано 22.12.2010, 10:02
#345
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Tonic, У меня глубоко внутри так же используется pedit. Здесь дело, скорее всего, в порядке следования. Когда выбираешь рамкой или секрамкой, то первый выбранный (т.е последний отрисованный) и задает тон полилинии. Никаких проблем не вижу реверсировать полилинии (см команды ENTREV или ENTREVS). Или непосредственным указанием выбери нужный отрезок, а затем остальные рамкой/секрамкой.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 22.12.2010, 11:42
#346
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


VVA, их как раз не нужно реверсировать! Приведу пример для наглядности.



На картинке слева нарисованы 4 последовательных сегмента линии нестандартного типа (с кружком), построенные по часовой стрелке. Но так как чертёж читается не вверх ногами, я программно меняю направления некоторых отрезков (как на рисунке справа). И вот теперь нужно правый рисунок в неизменном виде преобразовать в полилинию. В этом проблема.
Tonic вне форума  
 
Автор темы   Непрочитано 22.12.2010, 12:10
#347
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Делай 2 полилинии. Так в одной полилинии быть не может.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 03.03.2011, 12:21
#348
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,989


Уважаемые знатоки полилиний и гуру программирования на LISP!
Помогите реализовать пару функций для работы с полилиниями:

1) Часто при работе с полилинией приходится делать фаску (_chamfer) с заранее заданными параметрами.
Для этого, как известно, нужно последовательно двумя кликами указать смежные сегменты полилинии.
А можно ли программно свести эту операцию до одного клика у вершины смежных сегментов?

[IMG]http://s45.***********/i108/1103/b1/d42f3db0bbe7.jpg[/IMG]

2) Немного обратная операция - удаление сегмента-фаски полилинии, как это происходит при той же команде "фаска" с нулевыми параметрами, то есть удаление сегмента-фаски кликом по этому сегменту.

[IMG]http://s39.***********/i084/1103/00/e94f78f38944.jpg[/IMG]

Возможно ли реализовать эти функции?

VVA, спасибо за PL-Tools!
Nike вне форума  
 
Автор темы   Непрочитано 03.03.2011, 15:55
#349
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Пробуй команды CF2 и CF3. CF1 похожа на CF2, только на 1 запрос больше
Код:
[Выделить все]
(defun C:CF1 ()
  (vl-load-com)
  (and (setq ss (ssget "_:S:E:L" '((0 . "LWPOLYLINE"))))
       (setq pl (ssname ss 0))
       (setq pt (getpoint "\nУкажите ближайшую вершину для CHAMFER : "))
       (setq pt (vlax-curve-getclosestpointto pl (trans pt 1 0)))
       (setq vx (vlax-curve-getparamatpoint pl pt))
       (setq vx (round vx 1))
       (setq pt1 (vlax-curve-getpointatparam
                   pl
                   (if (< (- vx 0.4) (vlax-curve-getstartparam pl))
                     (- (vlax-curve-getendparam pl) 0.4)
                     (- vx 0.4)
                   ) ;_ end of if
                 ) ;_ end of vlax-curve-getPointAtParam
       ) ;_ end of setq
       (setq pt2 (vlax-curve-getpointatparam
                   pl
                   (if (> (+ vx 0.4) (vlax-curve-getendparam pl))
                     0.4
                     (+ vx 0.4)
                   ) ;_ end of if
                 ) ;_ end of vlax-curve-getPointAtParam
       ) ;_ end of setq
       (vl-cmdf "_.CHAMFER"
                (trans pt1 0 1)
                (trans pt2 0 1)
       ) ;_ end of vl-cmdf
  ) ;_ end of and
) ;_ end of defun
(defun C:CF2 ()
  (vl-load-com)
  (and
    (princ "\nВыберите полилинию в районе вершины для CHAMFER ")
    (setq ss (ssget "_:S:E:L" '((0 . "LWPOLYLINE"))))
    (setq pl (car (ssnamex ss 0)))
    (setq pt (cadr (last pl)))
    (setq pl (cadr pl))
    (setq pt (vlax-curve-getclosestpointto pl (trans pt 1 0)))
    (setq vx (vlax-curve-getparamatpoint pl pt))
    (setq vx (round vx 1))
    (setq pt1 (vlax-curve-getpointatparam
                pl
                (if (< (- vx 0.4) (vlax-curve-getstartparam pl))
                  (- (vlax-curve-getendparam pl) 0.4)
                  (- vx 0.4)
                ) ;_ end of if
              ) ;_ end of vlax-curve-getPointAtParam
    ) ;_ end of setq
    (setq pt2 (vlax-curve-getpointatparam
                pl
                (if (> (+ vx 0.4) (vlax-curve-getendparam pl))
                  0.4
                  (+ vx 0.4)
                ) ;_ end of if
              ) ;_ end of vlax-curve-getPointAtParam
    ) ;_ end of setq
    (vl-cmdf "_.CHAMFER"
             (trans pt1 0 1)
             (trans pt2 0 1)
    ) ;_ end of vl-cmdf
  ) ;_ end of and
) ;_ end of defun
(defun C:CF3 ()
  (vl-load-com)
  (setvar "CHAMFERA" 0)
  (setvar "CHAMFERB" 0)
  (setvar "CHAMMODE" 0)
  (and
    (princ "\nВыберите удаляемый сегмент CHAMFER ")
    (setq ss (ssget "_:S:E:L" '((0 . "LWPOLYLINE"))))
    (setq pl (car (ssnamex ss 0)))
    (setq pt (cadr (last pl)))
    (setq pl (cadr pl))
    (setq pt (vlax-curve-getclosestpointto pl pt))
    (setq vx (vlax-curve-getparamatpoint pl pt))
    (setq pt1 (vlax-curve-getpointatparam
                pl
                (if (< (- vx 1) (vlax-curve-getstartparam pl))
                  (- (vlax-curve-getendparam pl) 1.4)
                  (- vx 1)
                ) ;_ end of if
              ) ;_ end of vlax-curve-getPointAtParam
    ) ;_ end of setq
    (setq pt2 (vlax-curve-getpointatparam
                pl
                (if (> (+ vx 1) (vlax-curve-getendparam pl))
                  0.4
                  (+ vx 1)
                ) ;_ end of if
              ) ;_ end of vlax-curve-getPointAtParam
    ) ;_ end of setq
    (vl-cmdf "_.CHAMFER"
             (trans pt1 0 1)
             (trans pt2 0 1)
    ) ;_ end of vl-cmdf
  ) ;_ end of and
) ;_ end of defun
;;; Doug Broad
;;; additional credits Joe Burke, Peter Toby
(defun round (value to)
  (setq to (abs to))
  (* to
     (fix (/ ((if (minusp value)
                -
                +
              ) ;_ end of if
               value
               (* to 0.5)
             )
             to
          ) ;_ end of /
     ) ;_ end of fix
  ) ;_ end of *
) ;_ end of defun
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 03.03.2011, 16:33
#350
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,989


VVA, Большое спасибо!!
CF1 и CF2 работают, но если я имею несколько наложенных друг на друга полилиний (это у меня "кабельные трассы"), то операция выполняется только с той что наверху, на нижележащие команда уже не действует. Это поправимо?
CF3 работатет как-то не устойчиво - иногда выполняется, иногда нет, возвращая то Т, то nil и периодически запрашивает второй отрезок.
Кажется это как-то может зависит от зума в окне - приблизишь, не выполняется, отдалишь - работает
Nike вне форума  
 
Непрочитано 16.03.2011, 16:21
#351
MeshIN

Изыскания и САПР
 
Регистрация: 05.07.2008
Ижевск
Сообщений: 297


Цитата:
Сообщение от MeshIN Посмотреть сообщение
Попробовал установить на Bricscad V10 работает примерно 30% комманд, после обновления до V11 стало работать 90% , из наиболее используемых мной не работает объединение полилиний
Цитата:
Сообщение от VVA Посмотреть сообщение
В команде _pedit BricsCAd нет опции _multiple
Дождался Bricscad 11.2.9 PL-JOIN так и не работает, нашел интересный способ объединения 2D полилиний скопом - с помощью Pltools преобразуем их в 3D полилинии и командой PL-JOIN3D объединяем и снова делаем ее 2D полилинией.
Можно ли эту последовательность команд сделать макросом на кнопку? Как он должен выглядеть?

Добавлю
В _pedit (Bricscad) есть опция объединить, через нее тоже можно объединить скопом (видно опция _multiple заработала), но сначала надо запустить команду _pedit, затем _join и тогда полилинии объединяться.
Может подскажете макрос на кнопку?

Последний раз редактировалось MeshIN, 16.03.2011 в 16:36.
MeshIN вне форума  
 
Непрочитано 16.09.2011, 14:12
#352
wepp

Инжиниринг
 
Регистрация: 16.09.2011
Тюмень
Сообщений: 224


Пытаюсь воспользоваться командами ConvTo2d и ConvTo3d. Объект - прямоугольник из 4-х 3d-полилиний. Когда запускаю, происходит объединений, но одна сторона прямоугольника пропадает. Почему это может происходить? Заранее спасибо за ответ..
wepp вне форума  
 
Автор темы   Непрочитано 16.09.2011, 14:14
#353
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


wepp, Выложи файлик посмотреть
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 16.09.2011, 14:26
#354
wepp

Инжиниринг
 
Регистрация: 16.09.2011
Тюмень
Сообщений: 224


Цитата:
Сообщение от VVA Посмотреть сообщение
wepp, Выложи файлик посмотреть
Каюсь, в Автокаде новичок. Исходные полилинии были не замкнуты, поменял на "замкнуто: да" и всё получилось.
wepp вне форума  
 
Непрочитано 18.10.2011, 20:32
#355
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,030


Пара противоречий в работе PL-JOIN.
См. пример в приложенном файлике.
1. При сшивании двух полилиний, образующих замкнутый контур (белая и синяя), у сшитой будет признак Closed==Yes. Если сшивать и эти две полилинии, и полилинию желтую, то у синей будет признак Closed==Yes, а у желтой Closed==No. Если же сшивать желтую и белую полилинию сверху, то у желтой возникнет Closed==Yes. Если сшивать две желтые, то у первой останется Closed==No, а у второй возникнет Closed==Yes. И т.п.
Т.е. непредсказуемо. Лучше бы что-то одно всегда у всех полилиний, образующих замкнутые контуры. В данный момент логичным кажется Closed==Yes
2. Если установить допуск на сшивание, то зеленая линия не сошьется (не замкнется) даже при достаточном допуске.
Вложения
Тип файла: dwg
DWG 2004
Пример_для_сшивания_2.dwg (34.1 Кб, 4003 просмотров)
АлексЮстасу вне форума  
 
Непрочитано 24.10.2011, 22:49 А как на счет ZW?
#356
flareon

техник-геолог
 
Регистрация: 26.12.2009
Kenigsberg
Сообщений: 79


Всем здоровья! Вот уже четыре года с большим воодушевлением пользуюсь Вашим приложением, но вот сейчас столкнулся с проблемкой...На моей нынешней работе стоит ZW 2008 и ничего толком туда не пихнуть, разве что GeoBL (и то, только потому что прописан был специально). Сам в lispе не силен...Уважаемый VVA, если есть такая возможность, помогите пожалуйста! У меня уже полгода проблема с утиллитами, программками, приложениями, со всем к чему так привык! надоело уже брать работу на дом. Заранее благодарен, всего доброго!!!
flareon вне форума  
 
Непрочитано 08.12.2011, 14:23
#357
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Интересная особенность работы команды PL-VxDel - изменяет толщину сегментов полилинии. Подробнее - во вложении.
Вложения
Тип файла: dwg
DWG 2004
PL-VxDel.dwg (35.9 Кб, 4006 просмотров)
Do$ вне форума  
 
Непрочитано 19.01.2012, 22:55
#358
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,030


О ConvTo2d. Использую ее для преобразовании сплайнов - иногда преобразует только поштучно. Т.е. если выделено несколько, то не преобразует.
Пишет:
Команда: ConvTo2d
найдено: 356
; ошибка: функция для аргумента не задана: -4.44089e-016

Автокад 2012 рус.
В чем может быть дело?

Или я совсем был неправ? Преобразование сплайнов в полилинии делает PL-JOIN? Но PL-JOIN ведь может посшивать при этом ненужное?

Последний раз редактировалось АлексЮстасу, 19.01.2012 в 23:45.
АлексЮстасу вне форума  
 
Автор темы   Непрочитано 20.01.2012, 10:27
#359
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


АлексЮстасу, Сплайны вообще вещь не благодарная. Выложи или пришли по почте файл. Гляну. Но с большой уверенностью могу сказать, что ошибку вызывает попытка через vlax-curve-* получить точку на сплайне. С 2010 Автокада в команде _splineedit появилась опция _polyline. Для внутренних нужд у меня есть еще и такой лисп (Преобразовать СПЛАЙНЫ в ПОЛИЛИНИИ)
Код:
[Выделить все]
(defun C:SC ( / i ss)
  ;;;Spline convert
  ;;;Convert spline to polyline
  ;;; Преобразование (конвертирование) сплайнов в полилинию
  ;;; Преобразовать СПЛАЙНЫ в ПОЛИЛИНИИ
  ;;; Точность задается цифрой "6" в команде _splinedit
  ;;; http://forum.dwg.ru/showpost.php?p=864224&postcount=359
  (setvar "PLINECONVERTMODE" 0) ;_ 0 - линейные сегменты
                                ;_ 1 - линии и дуги
(if (< (atoi (substr (ver) 13)) 2010)
(alert "Для Автокада не ниже 2010 версии")
(progn
(setq ss nil ss (ssget "_:L" '((0 . "SPLINE"))))
(setq i '-1)
(setvar "CMDECHO" 0)
(repeat (sslength ss)
  (if command-s
    (command-s "_splinedit"(ssname ss (setq i (1+ i))) "_p" "6")
    (command "_splinedit"(ssname ss (setq i (1+ i))) "_p" "6")
    )
    (grtext -2 (strcat "Inspecting : "(itoa i)))
  )
(if command-s (command-s "_regenall")(command "_regenall"))
  )
  )
  )
(princ "\nНабери SC (лат) в команде\ной строке")(princ)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 22.10.2017 в 08:17. Причина: добавил command-s
VVA вне форума  
 
Непрочитано 22.01.2012, 01:35
#360
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,030


Цитата:
Сообщение от VVA Посмотреть сообщение
АлексЮстасу, Сплайны вообще вещь не благодарная. Выложи или пришли по почте файл. Гляну. Но с большой уверенностью могу сказать, что ошибку вызывает попытка через vlax-curve-* получить точку на сплайне. С 2010 Автокада в команде _splineedit появилась опция _polyline.
_splineedit у меня получилось запустить только для одного сплайна. А если их множество, то ненатыкаешься.
Дело, похоже, не в самих сплайнах, а в версиях Автокада. Сейчас я начал все делать в 2012 - и налетел... Т.е. в 2006-2008 именно ConvTo2d нормально преобразовывала сплайны в полилинии. И поштучно, и большие выборки. А в 2012 ConvTo2d преобразует только поштучно. А PL-JOIN преобразует, но с большими потерями геометрии.
Файл с реальными линиями-сплайнами прикладываю.

Но ConvTo2d преобразует в любой версии тоже не все сплайны почему-то.

А программа SC преобразует сплайны вполне хорошо.
Вложения
Тип файла: dwg
DWG 2004
сплайны.dwg (213.8 Кб, 4039 просмотров)

Последний раз редактировалось АлексЮстасу, 22.01.2012 в 02:20.
АлексЮстасу вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Новые команды для работы с полилинией

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск