Каталог программ для проектирования
dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Изменение/доработка макроса отрисовки охранных зон

Изменение/доработка макроса отрисовки охранных зон

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 18.08.2017, 00:41 #1
Изменение/доработка макроса отрисовки охранных зон
MrBrown
 
Регистрация: 26.06.2009
Сообщений: 198

MrBrown вне форума Вставить имя

Здравствуйте!
Есть макрос для отрисовки охранных зон сетей (в приложении).
Он работает как показано на левом рисунке (см. чертеж в приложении)
Пытаюсь на его основе сделать два новых макроса, работающих несколько иначе (см. в том же чертеже).
В первом варианте торцы зоны отступают от концов трассы на указанное расстояние.
Во втором варианте торцы зоны и внешние углы границы превращаются в дуги (указано зелеными кружками).

Насколько хватает знаний автолиспа, я понял, что сами границы зоны отрисовываются строками макроса:
Код:
[Выделить все]
 (setq obj1 (car (vl-catch-all-apply 'vlax-invoke (list obj 'offset ofdist))))
       (setq obj2 (car (vl-catch-all-apply 'vlax-invoke (list obj 'offset (* -1. ofdist)))))
      
       (setq line1 (vlax-invoke acsp 'addline (vlax-curve-getstartpoint obj1)(vlax-curve-getstartpoint obj2)) )
       (setq line2 (vlax-invoke acsp 'addline (vlax-curve-getendpoint obj1)(vlax-curve-getendpoint obj2)) )
      (setq ssunion (ssadd))
с последующим объединением в одну полилинию.

Прошу, помогите:
для первого варианта удлинить в оба конца линии obj1, obj2 на величину offcet, указанную пользователем;
для второго варианта вместо line1, line2 отрисовать дуги с центрами на концах исходной полилинии, а для внешних углов границы применить FILLET с радиусом, равным offcet.

Спасибо.

----- добавлено через ~6 ч. -----
Полночи проискал аналоги нужных мне макросов (частей макросов), пока нашел "изменение длины отрезка в обе стороны": http://forum.dwg.ru/showthread.php?t...=break&page=12, пост #227.
Попытался применить к макросу ZZ:
Код:
[Выделить все]
        (setq obj1 (car (vl-catch-all-apply 'vlax-invoke (list obj 'offset ofdist))))

 (progn
                  (setq tn (cdr (assoc 10 obj1)))
                  (setq tk (cdr (assoc 11 obj1)))
                  (command "_LENGTHEN" ofdist tn tk "")
                  ); progn

       (setq obj2 (car (vl-catch-all-apply 'vlax-invoke (list obj 'offset (* -1. ofdist)))))

 (progn
                  (setq tn (cdr (assoc 10 obj2)))
                  (setq tk (cdr (assoc 11 obj2)))
                  (command "_LENGTHEN" ofdist tn tk "")
                  ); progn
Не работает. Не удлиняет . Как правильно? Логику кода интуитивно чувствую, а грамотно реализовать не умею - ни первый, ни второй варианты.
Прошу помощи.

Вложения
Тип файла: dwg
DWG 2010
Варианты охранных зон.dwg (66.0 Кб, 7 просмотров)
Тип файла: lsp ZZ.lsp (2.0 Кб, 3 просмотров)


Последний раз редактировалось MrBrown, 18.08.2017 в 07:53. Причина: Приведение темы в соответствие с правилами форума
Просмотров: 855
 
Непрочитано 18.08.2017, 07:40
#2
trir


 
Регистрация: 18.12.2010
Сообщений: 2,372


такое лучше делать в ГИС...
trir вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 18.08.2017, 08:01
#3
MrBrown


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


trir, спасибо за ссылку. Посмотрел. Картинки красивые и такие, как мне нужно.
Но как это применить, загрузить, пользоваться? У нас AutoCAD 2014 и 2013.
MrBrown вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 18.08.2017, 08:13
#4
trir


 
Регистрация: 18.12.2010
Сообщений: 2,372


Использовать ГИС - QGIS, AutoCAD Civil 3D
AutoCAD Civil 3D + PostGIS
QGIS + PostGIS
trir вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 18.08.2017, 15:39
#5
MrBrown


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


trir, ГИС мы не используем. У нас только автокад. Спасибо за инфу про ГИС.
Где бы мне найти инфу про команду LENGTHEN? Какие она имеет параметры? Мне хочется "докрутить" макрос до ума, хотя бы первый вариант.
Там, по логике, всего ничего - удлинить каждую полилинию (obj1 и obj2), возникшую после оффсета, на величину, равную тому же оффсету.
У меня пока не получается: "грамоте (автолиспа) не обучен"
Прошу помощи.
__________________
p.s. Вопрос: почему макрос ZZ.lsp "не берёт" эту линию (файл приложен)? Что нужно сделать?
Спасибо.
Вложения
Тип файла: dwg
DWG 2010
Линия для форума.dwg (150.6 Кб, 3 просмотров)

Последний раз редактировалось MrBrown, 18.08.2017 в 15:49.
MrBrown вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 18.08.2017, 19:55
#6
trir


 
Регистрация: 18.12.2010
Сообщений: 2,372


недавно подобное реализовывал на HLSL
https://ru.wikipedia.org/wiki/%D0%90...BD%D0%B8%D0%B5
http://jcgt.org/published/0002/02/08/paper.pdf
http://www.danielkoitzsch.de/blog/20...nes-in-opengl/
trir вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 19.08.2017, 09:53
#7
MrBrown


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


Добавил четыре строки (в центре кода):
Код:
[Выделить все]
        (setq obj1 (car (vl-catch-all-apply 'vlax-invoke (list obj 'offset ofdist))))
       (setq obj2 (car (vl-catch-all-apply 'vlax-invoke (list obj 'offset (* -1. ofdist)))))


(command "_LENGTHEN" ofdist (vlax-curve-getstartpoint obj1) "") ;удлинить начало полилинии obj1 на величину ofdist
(command "_LENGTHEN" ofdist (vlax-curve-getendpoint obj1) "")   ;удлинить конец полилинии obj1 на величину ofdist
(command "_LENGTHEN" ofdist (vlax-curve-getstartpoint obj2) "") ;удлинить начало полилинии obj2 на величину ofdist
(command "_LENGTHEN" ofdist (vlax-curve-getendpoint obj2) "")   ;удлинить конец полилинии obj2 на величину ofdist

      
       (setq line1 (vlax-invoke acsp 'addline (vlax-curve-getstartpoint obj1)(vlax-curve-getstartpoint obj2)) )
       (setq line2 (vlax-invoke acsp 'addline (vlax-curve-getendpoint obj1)(vlax-curve-getendpoint obj2)) )
Не работает. Не удлиняет. В чём ошибка?

----- добавлено через ~37 мин. -----
Код:
[Выделить все]
 
(command "_LENGTHEN" "_DE" ofdist (vlax-curve-getstartpoint obj1) "") ;удлинить начало полилинии obj1 на величину ofdist
(command "_LENGTHEN" "_DE" ofdist (vlax-curve-getendpoint obj1) "")   ;удлинить конец полилинии obj1 на величину ofdist
(command "_LENGTHEN" "_DE" ofdist (vlax-curve-getstartpoint obj2) "") ;удлинить начало полилинии obj2 на величину ofdist
(command "_LENGTHEN" "_DE" ofdist (vlax-curve-getendpoint obj2) "")   ;удлинить конец полилинии obj2 на величину ofdist
Получилось! Работает!
MrBrown вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 19.08.2017, 10:38
#8
trir


 
Регистрация: 18.12.2010
Сообщений: 2,372


command вообще не стоит использовать, рассчитай контур и сделай его через entmake

в системе координат сегмента координаты буфера постоянны: смещение, 0; смещение, длина; -смещение, длина; -смещение, 0;
нужно только перевести эти координаты в МСК и мы получим буферы для каждого сегмента. А вот как состыковать эти сегменты - отдельная интересная тема

Последний раз редактировалось trir, 19.08.2017 в 10:44.
trir вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 19.08.2017, 10:45
#9
MrBrown


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


trir, о, если б я умел!
Сижу часами, анализирую код, ищу по инету аналоги. Вот "догнал" своим мозгом то, что выложил.
Теперь буду пытаться сделать второй вариант охранной зоны - с закруглениями.
p.s. совет типа "учи основы автолиспа" не проходит: уже пытался, увы.
p.p.s кстати, гляну, что же такое "entmake", авось пригодится когда.

----- добавлено через ~22 мин. -----
trir, функция entmake создаёт новый примитив. А мне-то зачем? Ведь нужные примитивы уже созданы. Их надо было только растянуть, что я и сделал.
MrBrown вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 19.08.2017, 12:03
#10
MrBrown


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


Вопрос к мастерам автолиспа: почему приложенный макрос ZZM.lsp не отрисовывает охранную зону вокруг этой полилинии (файл приложен)?
Ком. строка сообщает, что примитив не выбран. Как доработать макрос?
Спасибо.
Вложения
Тип файла: lsp ZZM.LSP (3.0 Кб, 2 просмотров)
Тип файла: dwg
DWG 2010
Сделать охранную зону макросом ZZM.lsp.dwg (148.3 Кб, 0 просмотров)

Последний раз редактировалось MrBrown, 19.08.2017 в 12:17.
MrBrown вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 19.08.2017, 12:23
#11
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 34,661


Цитата:
Сообщение от MrBrown Посмотреть сообщение
Их надо было только растянуть, что я и сделал.
Тогда entmod

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от MrBrown Посмотреть сообщение
Ком. строка сообщает, что примитив не выбран.
См. DXF Reference и параметры ssget. Ты зачем требуешь, что полилиния должна быть незамкнутой?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 19.08.2017, 15:02
#12
MrBrown


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


Кулик Алексей aka kpblc, Почитал про entmod. Делает то же, что и entmake, кроме того модифицирует.
Но почему эта функция лучше command? Где кроется подвох в моём коде? Это первое.

А второе я совсем не понял, прошу извинить.
"Ты зачем требуешь, что полилиния должна быть незамкнутой?" - я ничего не требую. То есть, даже не подозреваю, что в коде макроса что-то там требуется.
Объясни, пожалуйста, какую строчку нужно исправить. Или подбрось мне ссылку, чтобы я мог сам разобраться.
Желательно на русском.

----- добавлено через ~6 мин. -----
Кажется, нашел строчку:
Код:
[Выделить все]
 (setq sset (ssget  '((0 . "lwpolyline")(70 . 0))))
В ней нужно что-то поменять...

----- добавлено через ~13 мин. -----
Так работает:
Код:
[Выделить все]
  (setq sset (ssget  '((0 . "lwpolyline"))))
Посмотрел про выбор полилинии и удалил (70 . 0).
И заработало.
Признаюсь: удалил интуитивно, по образу и подобию другого макроса.
Буду разбираться.

Последний раз редактировалось MrBrown, 19.08.2017 в 15:15.
MrBrown вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 19.08.2017, 15:28
#13
trir


 
Регистрация: 18.12.2010
Сообщений: 2,372


Цитата:
Посмотрел про выбор полилинии и удалил (70 . 0).
И заработало.
Признаюсь: удалил интуитивно, по образу и подобию другого макроса.
Буду разбираться.
Цитата:
70 - Polyline flag (bit-coded); default is 0: 1 = Closed; 128 = Plinegen
https://www.autodesk.com/techpubs/au...ine_dxf_06.htm

Цитата:
совет типа "учи основы автолиспа" не проходит: уже пытался, увы.
SICP
trir вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 19.08.2017, 15:54
#14
MrBrown


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


trir, Кулик Алексей aka kpblc, благодарю за помощь.
MrBrown вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 19.08.2017, 23:39
#15
VVA

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


Цитата:
Сообщение от MrBrown Посмотреть сообщение
Там, по логике, всего ничего - удлинить каждую полилинию (obj1 и obj2), возникшую после оффсета, на величину, равную тому же оффсету.
может лучше объединить в полилинию перед оффсетом
, офсет, взорвать
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 20.08.2017, 20:53
#16
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 34,661


Цитата:
Сообщение от MrBrown Посмотреть сообщение
Делает то же, что и entmake, кроме того модифицирует.
По-моему, entmod только модифицирует, создать она не в силах. Но, может быть, и ошибаюсь.
Цитата:
Сообщение от MrBrown Посмотреть сообщение
Но почему эта функция лучше command?
Потому что, во-первых, грабли. А, во-вторых, без некоторых танцев с бубном ты не можешь отследить, корректно у тебя отработала command или нет. Один из альтернативных вариантов я расписывал здесь: http://autolisp.ru/2017/07/22/vl-cmd...ye-znacheniya/
Цитата:
Сообщение от MrBrown Посмотреть сообщение
удалил интуитивно, по образу и подобию другого макроса.
А лучше всего прочитать, что такое фильтры ssget, и посмотреть DXF-коды полилиний в DXF Reference.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Изменение/доработка макроса отрисовки охранных зон

Инженерные консультации
Опции темы Поиск в этой теме
Поиск в этой теме:

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Варианты планировок жилых высотных зданий Fear888 Поиск литературы, чертежей, моделей и прочих материалов 0 22.03.2013 08:53
варианты конструкции противопожарного перекрытия 1-го типа REI150 Stierlitz Прочее. Архитектура и строительство 20 17.09.2012 17:28
Варианты фундаментов Ивасик Основания и фундаменты 4 11.05.2010 14:55
Варианты проектов подстанций FRAER Поиск литературы, чертежей, моделей и прочих материалов 0 23.12.2009 11:02
Эстакада - варианты изготовления опор Xenser2 Конструкции зданий и сооружений 9 01.05.2009 14:40

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||


Размещение рекламы