|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
LISP.Стрелки направления на концах полилиний .Не могу написать код
Баку, Азербайджан
Регистрация: 13.09.2011
Сообщений: 114
|
||
Просмотров: 14196
|
|
||||
CAD Регистрация: 28.08.2003
Киев
Сообщений: 1,834
![]() |
Цитата:
Была прекрасная по моему мнению тема http://forum.dwg.ru/showthread.php?t=22894 Почитай её с самого начала, а изучай примерно с того места, где начинают рассматривать построение колонны п.25: ввод данных и т.д.
__________________
По теории майский жук летать не может. Но он этого не знает. И летает... |
|||
![]() |
|
||||
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114
|
Спасибо за ссылку!Сейчас буду разбирать.Если продвинусь,код кину сюда.
----- добавлено через ~2 мин. ----- Цитата:
----- добавлено через ~4 мин. ----- Спасибо,возьму на заметку. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Особо думать лень:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114
|
Алексей,спасибо огромное!
Я написал так: (defun c:fd () (setq ans "Yes") (setq l 5) (while (= ans "Yes") (setq pt1 (getpoint "Pick arrow end point:")) (setq pt2 (polar pt1 (/(* pi 5) 6) l)) (setq pt3 (polar pt2 (/(* pi 3) 2) l)) (command "pline" pt1 pt2 pt3 pt1 "") (initget "Yes No") (command "_rotate" "_L" "" pt1 pause) ) ) но получаются непредсказуемые результаты - когда указываю точку на пустом пространстве,всё нормально.Но когда ставлю на конце полилинии,привязываясь к её концу - треугольник меняет свою форму и не соответствует введенным размерам. Еще хочу подумать,чтоб "резинка" rotate тянулась в противоположную сторону от направления стрелки....Щас полопачу ещё форум.Ещё раз спасибо! |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
http://autolisp.ru/2013/12/19/comman...utre-troubles/
----- добавлено через ~10 мин. ----- Дополнительно: см. функции grread, grdraw и им подобные
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114
|
Код:
----- добавлено через ~9 мин. ----- В коде сделал замену (command "pline" "_non" pt1 pt2 pt3 "_c" "") на (command "pline" "_non" pt1 "_non" pt2 "_non" pt3 "_c" "") Код:
----- добавлено через ~51 мин. ----- Вроде как разобрался с привязкой к Endpoint : "_non" перед pause убрал,и всё получилось: Код:
Последний раз редактировалось Raznouh, 03.01.2014 в 00:33. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Сначала получай точки (анализируй мой код + http://autolisp.ru/2009/09/13/error-catch/ ), а потом уже выполняй отрисовку. Ну и за компанию перечитай #7
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114
|
Цитата:
И ещё честно говоря,лично по мне - увлекательно это написать в первый раз,пусть корявый,но код. ![]() ----- добавлено через ~45 мин. ----- Цитата:
(setq pt1 (getpoint "Pick arrow end point:")) (setq pt2 (polar pt1 (/ pi 6) l)) (setq pt3 (polar pt2 (/(* pi 3) 2) l)) затем выполнил отрисовку (command "pline" "_non" pt1 "_non" pt2 "_non" pt3 "_c" "") Код твой проанализировал:он написан на диалекте программиста,как и должно быть , тогда как у меня он больше работает с командами acad.Признаться честно,не совсем понял как реализовать выход Esc из команды на любом этапе,оставляя при этом чертеж в "первозданном" виде,однако на практике вижу что в твоем коде эта возможность реализована так как нужно.Интуиция мне подсказывает,что секрет во многочисленных _end of...,которых совсем нет в моем коде. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Цитата:
Цитата:
Идем далее. Представляем ситуацию, что все или некоторые трубопроводы поменяли свое положение на чертеже, например, заказчик передумал. Что тогда? Вертеть каждый треугольник? Или удалять его и штамповать все по новой? Можно, конечно, и реакторы прикрутить на событие "редактирование полилинии", но это уже темный лес и на мой взгляд, - неразумное использование инструментария... В случае с выноской, например, или с типом линий, тут проблем не будет: перенес линии, а стрелочки уже по местам. При правильной организации работы с динамическими блоками я почти уверен, что тоже будет все просто. Поэтому прежде чем изобретать новый велосипед, надо бы посмотреть то, что уже изобретено. Это-то как раз с самого твоего первого сообщения всем ясно ![]() |
|||
![]() |
|
||||
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114
|
skkkk,конечно же я понимаю - существуют вертикальные решения на базе акада,которые значительно упрощают поставленую задачу в комплексе.Взять,например, тот же Civil .Помимо этого ,есть специализированный софт для работы с водяными сетями:начиная от их моделирования и заканчивая симуляцией подачи воды в сеть и анализом выходных параметров,таких как расход, давление,гид.потери и другие.Эти проги(имею в виду WaterCAD и Epanet) поддерживают импорт-экспорт в dxf и глупо было бы предполагать,что направление потока воды по ним не узнать))Но понимаешь,в моем случае заказчик хочет видить так,как он считает красивым,а не так как правильно, удобно,эргономично и целесообразно - такое в наше время ,увы, случается часто))Вот программа рисует стрелку направления потока в районе середины длины трубы,а ему нравится,чтоб стрелка была замкнутой и не на середине ,а в конце трубы у распределительного узла))Идиотизм,понимаю...но реалии такие,что особо не поспоришь)
![]() |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Специализированный софт в ряде случаев не совсем удовлетворяет, а порой и совсем не удовлетворяет конкретным поставленным задачам и не соответствует нормам. Я о нем и не говорил. Я перечислял возможности голого Автокада, подразумевая, что нужно добиться одинакового результата на бумаге при наименьших кликозатратах. Как насчет отрисовки треугольника одним кликом по выбору полилинии. Не хороша ли идея?
|
|||
![]() |
|
||||
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114
|
skkkk,идея хороша,не поспоришь...но применима если все полилинии,а их примерно 2 сотни км труб,построены правильно в соответствии с направлением потока воды)Ведь направление стрелки,проставленной в сегмент одним кликом,зависит от этого...я правильно понимаю?)
----- добавлено через ~3 мин. ----- ...мне кажется,по-любому,приходим к 2 кликам...меньше не получается,так как то условие построения полилиний,о котором я выше писал,не соблюдается. |
|||
![]() |
|
||||
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114
|
skkk,и тогда в среднем получается полтора клика на трубу,учитывая то,что вероятно ,половина труб всё таки случайным образом построена в соответствии с направлением потока
![]() ----- добавлено через ~7 мин. ----- skkkk , есть еще один немаловажный момент:геометрия полилинии не должна меняться .Это для того,чтоб в любой момент можно было извлечь длину любой трубы.Или просто скрыть слой стрелок,чтоб не отвлекали внимание,если,скажем, нужно посмотреть общую картину трубопровода на данном участке. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Цитата:
Raznouh, я тут сообразил (туговато с этим делом в начале января на Руси ![]() ![]() План "Б" Зацикливаем запрос полилиний, а правой кнопкой либо Enter'ом (пустой ввод, в зависимости от настроек правой кнопки мыши) реверсируем только что оСТРЕЛенную полилинию и перерисовываем стрелку, удалив старую (всё программно, разумеется). Но тогда выход возможен только по Esc, что тоже не есть хорошо... Но в полтора клика в среднем укладываемся. Можно добавить по правой кнопке выпадающее меню, например (скопируй в командную строку, перед этим включив Динамический ввод, кнопка внизу экрана): Код:
Однако, пожалуй, самым правильным будет такой подход: 1. Временно назначаем нужным полилиниям-трубопроводам (надеюсь, они хотя бы на одном слое или, на худой конец отличаются от остальных цветом/типом линий/весом, чтоб их можно было программно выбрать)...так вот: назначаем им временно тип линий в виде стрелок, например, такой. 2. Командой ENTREV из набора PL-Tools реверсируем неправильно ориентированные полилинии. 3. Рисуем ВСЕ (!) стрелки одним махом. При таком подходе среднее количество кликов стремится к 0.5 на полилинию. Цитата:
Цитата:
Последний раз редактировалось skkkk, 04.01.2014 в 11:20. |
|||
![]() |
|
||||
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114
|
Цитата:
ща загрузил этот тип линий ,он выглядит примерно так: ----->----->----->----->-----> Скорее всего,нарисую свой.Но опять таки выходит одно но :если я соберусь вскормить сеть нарисованную такими линиями ,предварительно переведя чертеж в dxf,программе Epanet для гидравлического анализа ...я не знаю,сможет ли он корректно считать длину каждой трубы,в связи со спецификой стиля полилиний,которыми она построена.Так что воспользоваться им стоит на финальном этапе разработки,когда все расчитанно ,пересчитано,исправлено и снова пересчитанно. Но по-любому - способ четкий:пакетный.Попытаюсь им воспользоваться.Спасибо за подсказку. ![]() Цитата:
![]() ----- добавлено через ~10 ч. ----- Пока читал тему Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу), привел свой код в более "благопристойный" вид: Код:
![]() ----- добавлено через ~3 ч. ----- Оказывается...нужно сделать блок из моей стрелки,чтоб проблемы решились:отрисовать полилинию с началом в точке 0.0,потом сделать из нее блок,потом указать ему нужную точку вставки,а вот когда запросит угол поворота,вот только тогда можно нажать Esc и всё исчезнет))) ![]() Последний раз редактировалось Raznouh, 05.01.2014 в 02:23. |
|||
![]() |
|
||||
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114
|
Выглядит всё это примерно так:
Код:
![]() ЗЫ: если в коде есть косяки ,которые могут помешать длительной работе с ним,подскажите пожалуйста. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
1. Нет меток отмены
2. Обработчик ошибок переопределяется глобально, что не есть гуд: http://autolisp.ru/2009/09/20/howto_undo/ + http://autolisp.ru/2009/09/22/programming-style/ + http://autolisp.ru/2009/09/13/error-catch/
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Нужно чтобы после нажатия _.undo (Ctrl+Z) в файле не оставалось лишнего мусора.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Вопрос не в том, каким методом будет реализовываться отмена, а в том, где и когда будут ставиться метки.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Raznouh, так уже как минимум намного изящней, чем вращение предварительно отрисованной и ориентированной горизонтально стрелки, как в первой версии.
А нельзя ли избавиться от запроса угла поворота блока при вставке? Для этого надо понять, всегда ли стрелка ставится в конце (или начале) полилинии, или она также может вставать и между сегментами, или на стыке двух полилиний? |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Через угол от начальной/конечной вершины полилинии до следующей/предпоследней. И не забыть про дуговые сегменты... И не забыть про вариант с ненулевой шириной сегмента
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
В ответ на запрос угла поворота команды _-insert можно указать точку, а можно ввести угол.
Нужно также, чтобы программно можно было определить, где начало, а где конец. Если одна из точек уже известна (точка вставки блока), и если это крайняя точка линии и она не совпадает с крайней точкой другой линии, то я вижу как минимум два варианта: Вариант 1: вычислить любую точку, принадлежащую данной линии, отличную от конечной точки и подставить ее на запрос угла. Тут я бы использовал функцию vlax-curve-getPointAtParam. Вариант 2: вычислить угол по двум точкам (начала и конца линии) функцией angle и тоже скормить инсерту. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Raznouh, что будет, если в ответ на запрос pol я введу Esc? А что будет, если выберу отрезок, а следующий созданный мною примитив был, например, окружностью?
Цитата:
Код:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Так на конце полилинии, на начале полилинии или еще на какой-то точке?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114
|
kpblc,ни там ,ни там пока не смог.Я хочу разобраться в этом:хотя бы на элементарном уровне с ошибками недочетами и косяками - лишь бы построилось то,что хочу увидеть,а о том,что останется в системе после этого,что будет если указать не то что надо и что будет если выйти из команды не завершив ее - для меня это на первом этапе не важно:как я могу правильно выйти из кода,если не могу в него нормально зайти?))
![]() ----- добавлено через ~19 ч. ----- kpblk,я вот сейчас читал про функции из твоего первого кода(пост №34). Я его немного пообрубал,и сделал чтоб мне более понятно было: Код:
|
|||
![]() |
|
||||
Цитата:
1. применив функцию massoc из этого сообщения: http://forum.dwg.ru/showpost.php?p=64365&postcount=4 получим список из вершин. 2. применив стандартную функцию nth извлекаем любую вершину из этого списка. Это один из многих возможных вариантов, может быть, не самый оптимальный.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic) |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,411
|
Еще один вариант получения координат вершин в мировой системе координат независимо ни от чего:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114
|
kpblc,Do$ Спасибо!Сейчас начну ковырять.
----- добавлено через ~17 ч. ----- Написал чуть по-другому теперь. Люди,подскажите:почему не получается _rotate? Код:
Представления функции angtof проверил все от 1 до 4х,ни на одном не вращает. |
|||
![]() |
|
||||
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114
|
skkkk,приблизился к тому,о чем мы говорили неск.дней назад:
Цитата:
Код:
Осталось теперь только придумать как сделать реверс полилинии по наименее кликозатратному условию ![]() ----- добавлено через ~13 мин. ----- сделать после выполнения этого кода запрос типа "Reverse ?<No>",(пикбоксом указать полилайн,если да),а если нет - выход по энтер и снова начало верхнего кода. |
|||
![]() |
|
||||
как вариант отрисовки стрелки
Код:
вот и некрасиво работает с замкнутыми полилиниями.
__________________
Знание лисп: со справочником Н. Полещука Последний раз редактировалось nolte, 08.01.2014 в 01:12. |
||||
![]() |
|
||||
попытаюсь помочь тебе
строка 3 указатель vla-object 4- сoor - список координат объекта, если введешь в ком строку (vlax-dump-object <vla-object> T) получишь описание свойств и методов объекта полезная штука постоянно пользуюсь. 5- цикл, повторяющийся (длина coor деленное на 2), со списком lst_p (список точек вершин полилинии) 6- count_ver - максимальный номер вершины (счет вершин начинается с 0) 7- ver_new - координаты точки новой вершины, находящийся от конца полилинии на расстоянии 20 ед. 8- добавление новой вершины. В хвосте строчки (reverse (cdr (reverse ver_new)))- убрал координату z из ver_new. 9- и последнее отредактировал начальную толщину сегмента (10) и конечную (0). Удачи тебе в нелегком, но увлекательном, не прибыльном, но греющем душу и дающем зарядку для серого вещества, деле изучения лисп.
__________________
Знание лисп: со справочником Н. Полещука |
||||
![]() |
|
||||
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114
|
skkkk,за месяц понахватался немного знаний и всё таки сделал в 1 клик
![]() Код:
----- добавлено через ~2 мин. ----- Спасибо форуму и всем форумчанам! |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Raznouh, сейчас нет возможности погонять код, и вникать не хочется, просто интересно: как определяется направление стрелки? Или порядок с направлениями линий в чертеже все же пришлось навести?
![]() ----- добавлено через ~17 мин. ----- Я что-то не в теме или почему вместо нельзя написать просто Код:
![]() |
|||
![]() |
|
||||
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114
|
skkkk,может быть и можно,но я так понял (и проверил на практике с помощью entget),что dxf код 10 lwpolyline - это точечная пара координат x и y,без z:
Цитата:
![]() Цитата:
![]() |
|||
![]() |
|
||||
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114
|
Цитата:
Цитата:
|
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Какой язык перспективен для инженера-конструктора с условием | The_Mercy_Seat | Программирование | 705 | 17.03.2021 14:19 |
Помогите написать макрос для разрыва отрезков и полилиний в AutoCad | Green4x | Программирование | 2 | 01.12.2013 21:03 |
Не могу написать примитивную LISP программу | PolBlack | LISP | 2 | 07.11.2010 18:08 |
Word не могу над таблицей заголовк написать улетает вниз | dextron3 | Прочее. Программное обеспечение | 8 | 08.12.2008 11:03 |
Не могу написать мультитекст в 2008 автокаде. | Мельхиор | AutoCAD | 7 | 08.10.2008 08:08 |