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

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

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

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

Данный набор программ является коллективным продуктом участников форумов 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
Просмотров: 16794
Размер:	30.3 Кб
ID:	21079  


Последний раз редактировалось VVA, 08.09.2023 в 13:25. Причина: ссылка на иконки для темной темы
Просмотров: 379035
 
Непрочитано 28.04.2010, 11:09
#261
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,917
<phrase 1=


KickeR, сказал ведь справку по команде почитать
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon на форуме  
 
Непрочитано 28.04.2010, 14:22
#262
KickeR


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


УДАЛИТЕ

Последний раз редактировалось KickeR, 28.04.2010 в 14:39. Причина: нашел нужную инфу
KickeR вне форума  
 
Непрочитано 28.04.2010, 14:54
1 | #263
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,917
<phrase 1=


Нашел кажись, говорил ведь справку читать
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon на форуме  
 
Непрочитано 20.05.2010, 11:36
#264
sdv79

Инженер ЭОМ
 
Регистрация: 05.03.2009
Москва
Сообщений: 215
Отправить сообщение для sdv79 с помощью Skype™


Для нужд коллег сделал надстройку из модуля pltools которая переворачивает все линии нарисованные справа-налево
Код:
[Выделить все]
(vl-load-com)
 (setq     entire_premetiv (ssget "X" '((0 . "*LINE,*POINT")))
    counter     0)
 (while (and entire_premetiv
         (setq e1 (ssname entire_premetiv counter))
    );/ and
  (setq    counter        (1+ counter)
      ed        (entget e1))
  (cond
   ((= (cdr(assoc 0 ed)) "LINE")
    (setq delta        (safearray-value(vlax-variant-value(vla-Get-Delta (vlax-ename->vla-object e1)))))
    (cond
     ((and  (minusp(car delta)) (minusp(cadr delta)) )    ; 1 и 3 квадрант
      (setq e1        (vlax-ename->vla-object e1)
            list_pt    (mapcar '(lambda (x) (vlax-get e1 x))'(StartPoint EndPoint))
        list_pt    (reverse list_pt))
      (vla-put-StartPoint e1 (vlax-3d-point (car  list_pt)))
      (vla-put-EndPoint      e1 (vlax-3d-point (cadr list_pt))) )
      
     ((minusp(car delta))                ; 2 и 4 квадрант
      (setq e1        (vlax-ename->vla-object e1)
            list_pt    (mapcar '(lambda (x) (vlax-get e1 x))'(StartPoint EndPoint))
        list_pt    (reverse list_pt))
      (vla-put-StartPoint e1 (vlax-3d-point (car  list_pt)))
      (vla-put-EndPoint      e1 (vlax-3d-point (cadr list_pt))) )
    ) ;/ cond
   )) ;/ cond "LINE"
  ) ;/ while
 (command "draworder" entire_premetiv "" "_b")        ;отправляет entire_premetiv на задний план
Подскажите, как определить полилиния нарисована слева-направо, или наоборот не зависимо от квадранта.
sdv79 вне форума  
 
Непрочитано 23.07.2010, 19:49
#265
sasha_lif

Дизайнер-конструктор
 
Регистрация: 29.05.2004
Kiev
Сообщений: 1,179
<phrase 1=


Подскажите, как объединить в одно целое комманды:
PL-JOIN и PL-VxRdc
Объединение полилиний чохом и Удаление вершин полилиний, которые лежат на одной прямой

т.е. есть ,например, несколько половинок симметричной детали. я их mirror- ом каждую половинку.
Затем PL-JOIN объединяет их в одно целое, а затем, чтобы не вызывать комманду PL-VxRdc и заново не указывать эти же объекты, хотелось бы автоматически "прополоть" эти линии
__________________
Kiev, Ukraine
sasha_lif вне форума  
 
Непрочитано 23.07.2010, 23:20
#266
SpillOver

Комплексные системы безопасности
 
Регистрация: 05.01.2010
Санкт-Петербург
Сообщений: 14


Здравствуйте!
Помогите,пожалуйста,решить задачу...
Не осилил всей переписки данной темы, но думаю, что мой вопрос будет интересен и все еще актуален!

В процессе рисования пожарного шлейфа полилиниями(кусками), в некоторых местах полилинии пересекаются , где-то не доходят друг до друга,где-то соединяются в вершинах(рисунок ниже) и т. п.

ВОПРОС
Как будет выглядеть код на ЛИСП, который помог бы реализовать следующее:

чтобы при выделении левой кнопкой мышки всех кусков полилиний они объединялись в одну полилинию, отсекались все ненужные кусочки(на рисунке выделено красным цветом), происходило соединение полилиний в местах с зазорамим.
На рисунке показан желаемый резельтат.
Спасибо, жду скорейшего комментария.

Рисунок:
Миниатюры
Нажмите на изображение для увеличения
Название: Полилинии.jpg
Просмотров: 130
Размер:	14.0 Кб
ID:	42731  
__________________
Скупой платит дважды! Пойду работать к скупому! :D
SpillOver вне форума  
 
Непрочитано 24.07.2010, 01:08
#267
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


>SpillOver: Пользуйся снэпом и такие вопросы возникать не будут...
gomer вне форума  
 
Непрочитано 24.07.2010, 01:46
#268
SpillOver

Комплексные системы безопасности
 
Регистрация: 05.01.2010
Санкт-Петербург
Сообщений: 14


Цитата:
Сообщение от gomer Посмотреть сообщение
>SpillOver: Пользуйся снэпом и такие вопросы возникать не будут...
Да не скажи, не все так просто...

Привязки мешают так же очень хорошо , как и помогают

Мне,например,приходится часто отключать некоторые привязки.

После того как шлейф(полилиния)нарисован единым куском, регулярно вносятся изменения:
где-то обрезается,добавляется и в спешке появляются вышеописанные косяки.
ПОЭТОМУ необходимо одним махом все подправить
__________________
Скупой платит дважды! Пойду работать к скупому! :D
SpillOver вне форума  
 
Непрочитано 26.07.2010, 11:25
#269
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


sasha_lif, сначала вызвать PL-JOIN, объединить полилинии, затем вызвать PL-VxRdc и указать "_last" (в опциях функции есть), выберется последняя созданная полилиния.
alex8888 вне форума  
 
Непрочитано 26.07.2010, 12:22
#270
sasha_lif

Дизайнер-конструктор
 
Регистрация: 29.05.2004
Kiev
Сообщений: 1,179
<phrase 1=


alex8888, в том то и дело, что выбереться только ОДНА ЛИНИЯ
А если я спаивал PL-JOIN нескеолько полилиний, то результат , как ты советуешь, не подходит
Хотелось бы , чтобы "пропалывалось" PL-VxRdc все полилинии
__________________
Kiev, Ukraine
sasha_lif вне форума  
 
Непрочитано 26.07.2010, 12:45
#271
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,917
<phrase 1=


VVA, еще раз повторю свой вопрос
http://forum.dwg.ru/showpost.php?p=519747&postcount=256
много раз нужно было узнать общую длину разбросанных линий.
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon на форуме  
 
Непрочитано 26.07.2010, 18:53
1 | #272
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


SpillOver, используй команду PL-CSE с опцией "допуск"
[IMG]http://s60.***********/i170/1007/e8/b6b7ea3984db.gif[/IMG]
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Автор темы   Непрочитано 27.07.2010, 11:59
#273
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от sasha_lif Посмотреть сообщение
alex8888, в том то и дело, что выбереться только ОДНА ЛИНИЯ
А если я спаивал PL-JOIN нескеолько полилиний, то результат , как ты советуешь, не подходит
Хотелось бы , чтобы "пропалывалось" PL-VxRdc все полилинии
Код:
[Выделить все]
(defun C:PL-JOIN ( / ssnab count en *error* ss)
  (setq *error* pltool-err)
  (or *pl-activedoc* (setq *pl-activedoc* (vla-get-activedocument (vlax-get-acad-object))))
  (vla-StartUndoMark *pl-activedoc*)
  (pl:error-save-sysvar '(("PEDITACCEPT" 1)("CMDECHO" 0)))
  (setq ssnab (ssget "_I"))
  (while (not ssnab)(setq ssnab (ssget)))
  ;;;И 3d полилинии
  ;(setq ssnab(3dpljn ssnab 1e-6 "AcDb3dPolyline"))
  (setq count 0)
  (while (setq en (ssname ssnab count))
    (if (member '(100 . "AcDb3dPolyline")(entget en))
      (ssdel en ssnab)
      (setq count (1+ count))
    )
    )
  (setq en (entlast) count 0 ss (ssadd))
  (if (> (sslength ssnab) 1)
  (if (and (getvar "PEDITACCEPT") (= (getvar "PEDITACCEPT") 1))
    (vl-cmdf "_pedit" "_Multiple" ssnab "" "_Join" 0 "")
    (vl-cmdf "_pedit" "_Multiple" ssnab "" "_Y" "_Join" 0 ""))
  )
  (while (and (setq en (entnext en))
	      (= (cdr(assoc 0 (entget en))) "LWPOLYLINE"))
    (setq count (1+ count))(ssadd en ss)
    )
(if (> count 0)
(if (= (getvar "SysCodePage") "ANSI_1251")
    (princ (strcat "\nСоздано " (itoa count) " простых полилиний"))
    (princ (strcat "\nСreated "(itoa count)" LW polylines"))
    ))
  (if (> (sslength ss) 0)(vl-cmdf "_.SELECT" ss ""))
  (setq ssnab nil ss nil)
  (pl:error-restore-sysvar)
  (vla-EndUndoMark *pl-activedoc*)
  (princ))

сначала вызвать PL-JOIN, объединить полилинии, затем вызвать PL-VxRdc и указать "_p"
Disney, Симпатичная иконка для PL-CSE. Поделишься?
Цитата:
Сообщение от zenon Посмотреть сообщение
много раз нужно было узнать общую длину разбросанных линий.
Если узнать длину, то зачем объединять в полилиню?
Я пользуюсь этими двумя замечатьльными программами Александра Ривилиса
ObjectARX. GeomProps - площадь, длина, объем выбранных примитивов
ObjectARX. SelSim - выбор по образцу
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 27.07.2010, 12:08
#274
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,917
<phrase 1=


Цитата:
Сообщение от VVA Посмотреть сообщение
Если узнать длину, то зачем объединять в полилиню?
Ээ... это конечно хорошо вот только:
1 это дополнительная программа. (у меня и так перегружен CAD)
2 и результат нужно бывает сохранить в виде примитива.
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon на форуме  
 
Непрочитано 27.07.2010, 14:29
#275
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


VVA, что дает "_p" в PL-VxRdc?
Я попробовал ввести, выбрались все полилинии на чертеже.
В справке PL-Tools про этот ключ не нашел.
alex8888 вне форума  
 
Непрочитано 27.07.2010, 14:39 Вопросы по полилиниям
#276
ng-share


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


Не имею опыта работы с лисп, приходится использовать программы SURPAC, MICROMINE и т.д., а исходнаЯ информация готовится часто в автокаде, поэтому возникает небходимость дополнительной обработки данных перед использованирем в вышеуказанных пакетах.
Вопрос первый:Посмотрела лисп ZTXT очень полезная штука, но как бы ее использовать не только для point но и для вершин 3d polyline, очень часто чертежи делались только для того чтобы напечатать, поэтому высотная отметка в подлилинии отсутствует, а может еще и по причине работы с двумерными полилиниями.
Вопрос второй:присвоить обекту техт Z ,ближайшей Point
Вопрос третий:Сохранить объекты MTEXT в файл EXCEL или таблицу автокад.

Последний раз редактировалось ng-share, 27.07.2010 в 17:07.
ng-share вне форума  
 
Непрочитано 27.07.2010, 15:12
#277
sasha_lif

Дизайнер-конструктор
 
Регистрация: 29.05.2004
Kiev
Сообщений: 1,179
<phrase 1=


VVA, присоединяюсь к вопросу №275, что дает ключ _p в комманде PL-VxRdc?

По идее он должен выбрать предыдущий набор.
Но в Вашем случае, действительно происходит выделение всех полилиний на чертеже (Акад 2004).

И все равно хотелось бы совместить работу комманд PL-JOIN и PL-VxRdc в один лисп.
__________________
Kiev, Ukraine
sasha_lif вне форума  
 
Автор темы   Непрочитано 27.07.2010, 16:16
#278
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от sasha_lif Посмотреть сообщение
VVA, присоединяюсь к вопросу №275, что дает ключ _p в комманде PL-VxRdc?
По идее он должен выбрать предыдущий набор.
Так и есть. В PL-JOIN добавлено сохранение обработанных полилиний в текущий набор. Если просто выхвать PL-VxRdc и указать _p, то все будет зависеть от того, сформирован ли текущий набор какой-либо командой или нет. Я имел ввиду связку PL-JOIN, потом PL-VxRdc с опцией _p
Цитата:
Сообщение от sasha_lif Посмотреть сообщение
И все равно хотелось бы совместить работу комманд PL-JOIN и PL-VxRdc в один лисп
Код:
[Выделить все]
(defun C:TEST ()
  (C:PL-JOIN)
  (SSSETFIRST nil (ssget "_p"))
  (C:PL-VxRdc)
  )
*** Добавлено
Вариант 2
Код:
[Выделить все]
(defun C:TEST1 ()
  (vl-load-com)
  (C:PL-JOIN)
  (vla-sendcommand (vla-get-activedocument (vlax-get-acad-object))
    "PL-VxRdc\n_p\n\n0.15\n")
  )
0.15 - отклонение
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 27.07.2010 в 16:21.
VVA вне форума  
 
Непрочитано 27.07.2010, 17:14
#279
sasha_lif

Дизайнер-конструктор
 
Регистрация: 29.05.2004
Kiev
Сообщений: 1,179
<phrase 1=


VVA, на лисп из №273 выдает:
Цитата:
Command: (LOAD "D:/Documents and Settings/Admin/Рабочий стол/PL-JOIN.lsp")
C:PL-JOIN

Command: pl-join ERRNO # 93: no function definition: PL:ERROR-SAVE-SYSVAR
_.redrawall
Command:
Command: pl-join
ERRNO # 2: no function definition: PL:ERROR-SAVE-SYSVAR
_.redrawall
Command
Так, наверно должно быть так:
PL-ERROR-SAVE-SYSVAR

но дальше все равно не работает test1:

Цитата:
Command: test1
Select objects: Specify opposite corner: 8 found

Select objects:
nil

Command: PL-VxRdc

Select objects: _p
41 found
22 were filtered out.

Select objects:

Command:
Введите max отклонение от прямой (H) [угловой допуск A/отклонение H] <0.15>:
0.15
ERRNO # 5: bad argument type: 2D/3D point: nil
_.redrawall
Command:
но, зато test работает.правда нестабильно: иногда спаивает, но не попалывает. Останавливается на select object, ты жмешь ентер, еще раз ентер (где спрашивается отклонение) и говорит , что ничего не выбрано!

а иногда работает нормально: останов на допуске, жмешь ентер, и все пропалывает.

Не уверен, но вроде работает если test идет на взорванные объекты (т.е. Line),
а если объекты Pline- то не работает
__________________
Kiev, Ukraine

Последний раз редактировалось sasha_lif, 27.07.2010 в 18:04.
sasha_lif вне форума  
 
Автор темы   Непрочитано 27.07.2010, 18:04
#280
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


PL-JOIN эта немного измененная команда pltools. Она использует определенные там ф-ции, в том числе и PL-ERROR-SAVE-SYSVAR. Открой pltools.lsp и добавь или вместо PL-JOIN (найди поиском) или переименуй в PL-JOIN1 и добавь в конец. Если переименуешь в PL-JOIN1, то в команде TEST1 и ТЕST так же не забудь переименовать
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Новые команды для работы с полилинией