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

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

LISP.Стрелки направления на концах полилиний .Не могу написать код

Ответ
Поиск в этой теме
Непрочитано 02.01.2014, 20:45 #1
LISP.Стрелки направления на концах полилиний .Не могу написать код
Raznouh
 
Баку, Азербайджан
Регистрация: 13.09.2011
Сообщений: 114

Здравствуйте!
Есть полилинии ,построенные под разными углами (условно - трубы водопроводной сети) .На конце каждой каждой с помощью треугольника-стрелки хочу указать направление (потока воды в трубе).Попытался написать лисп код. Алгоритм предполагал примерно такой : указываю первую точку (PT1),указываю вторую точку (PT2) и на второй точке строится треугольник-стрелка направления ,расположенная под тем же углом ,что и отрезок образованный двумя указанными точками (см прикрепленное фото).
Код построения стрелки-треугольника(см.вложения) я написал (не бейте сильно,писал впервые - он даже не отлажен,сбоит иногда,не могу понять закономерность - когда именно).А как ее поворачивать в соответствии с углом полилинии я найти пока не смог.
Помогите разобраться: хотя бы подскажите какими функциями пользоваться,чтоб сделать это.
Заранее спасибо всем,кто это прочел!

Изображения
Тип файла: jpg Без имени-1.jpg (308.2 Кб, 785 просмотров)

Вложения
Тип файла: lsp fd.lsp (300 байт, 135 просмотров)

Просмотров: 14196
 
Непрочитано 02.01.2014, 20:57
1 | #2
skkkk


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


Сейчас нет компьютера под рукой, но на вскидку, я бы использовал функцию polar
skkkk вне форума  
 
Непрочитано 02.01.2014, 20:58
1 | #3
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,834
<phrase 1=


Цитата:
Сообщение от Raznouh Посмотреть сообщение
Помогите разобраться: хотя бы подскажите какими функциями пользоваться,чтоб сделать это.
Ты хочешь чтобы кто-то поправил твой текст или написал свой? Это не сложно, но чтобы ТЫ сам понял как это делается начни с обычной учёбы ЛИСПу.
Была прекрасная по моему мнению тема http://forum.dwg.ru/showthread.php?t=22894
Почитай её с самого начала, а изучай примерно с того места, где начинают рассматривать построение колонны п.25: ввод данных и т.д.
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Автор темы   Непрочитано 02.01.2014, 21:58
#4
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


Спасибо за ссылку!Сейчас буду разбирать.Если продвинусь,код кину сюда.

----- добавлено через ~2 мин. -----
Цитата:
Сообщение от Alan Посмотреть сообщение
Ты хочешь чтобы кто-то поправил твой текст или написал свой? Это не сложно, но чтобы ТЫ сам понял как это делается начни с обычной учёбы ЛИСПу.
Была прекрасная по моему мнению тема http://forum.dwg.ru/showthread.php?t=22894
Почитай её с самого начала, а изучай примерно с того места, где начинают рассматривать построение колонны п.25: ввод данных и т.д.
Alan,Спасибо за ссылку!Сейчас буду разбирать.Если продвинусь,код кину сюда.

----- добавлено через ~4 мин. -----
Цитата:
Сообщение от skkkk Посмотреть сообщение
Сейчас нет компьютера под рукой, но на вскидку, я бы использовал функцию polar
Спасибо,возьму на заметку.
Raznouh вне форума  
 
Непрочитано 02.01.2014, 22:57
1 | #5
Кулик Алексей aka kpblc
Moderator

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


Особо думать лень:
Код:
[Выделить все]
 (vl-load-com)

(defun c:fd (/ start end adoc pt len)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object))
        len  5.
        ) ;_ end of setq
  (while (and (= (type (setq start (vl-catch-all-apply
                                     (function
                                       (lambda ()
                                         (getpoint "\nStart point <Cance> : ")
                                         ) ;_ end of lambda
                                       ) ;_ end of function
                                     ) ;_ end of vl-catch-all-apply
                             ) ;_ end of setq
                       ) ;_ end of type
                 'list
                 ) ;_ end of =
              (= (type
                   (setq end (vl-catch-all-apply (function (lambda () (getpoint start "\nEnd point <Cancel> : ")))))
                   ) ;_ end of type
                 'list
                 ) ;_ end of =
              ) ;_ end of and
    (vla-startundomark adoc)
    (setq pt (mapcar
               (function
                 (lambda (x)
                   (list (car x) (cadr x))
                   ) ;_ end of lambda
                 ) ;_ end of function
               (list start
                     end
                     (polar end (+ (angle start end) (/ (* pi 5.) 6.)) (min len (* (distance start end) 0.2)))
                     (polar end (+ (angle start end) (/ (* pi 7.) 6.)) (min len (* (distance start end) 0.2)))
                     end
                     ) ;_ end of list
               ) ;_ end of mapcar
          ) ;_ end of setq
    (entmakex (append '((0 . "LWPOLYLINE")
                        (100 . "AcDbEntity")
                        (100 . "AcDbPolyline")
                        (90 . 5)
                        (43 . 0.0)
                        (38 . 0.0)
                        (39 . 0.0)
                        )
                      (mapcar (function (lambda (x) (cons 10 x))) pt)
                      ) ;_ end of append
              ) ;_ end of entmakex
    (vla-endundomark adoc)
    ) ;_ end of while
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.01.2014, 23:06
#6
Raznouh


 
Регистрация: 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 тянулась в противоположную сторону от направления стрелки....Щас полопачу ещё форум.Ещё раз спасибо!
Raznouh вне форума  
 
Непрочитано 02.01.2014, 23:10
1 | #7
Кулик Алексей aka kpblc
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-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.01.2014, 00:28
#8
Raznouh


 
Регистрация: 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  6) l))
(setq pt3 (polar pt2 (/(* pi 3) 2)  l))
(command "pline" "_non" pt1 pt2 pt3 "_c" "")
(initget "Yes No")
(command "_rotate" "_non" "_L" "" "_non" pt1 "_non" pause)
)
)
"Резинку" rotate настроил как нужно, добавил "_non" в некоторых местах,но до конца от багов избавиться пока не смог: при зуммировании чертежа код лагает.Помогите поправить этот косяк в этом коде,ребята.И, если возможно, при этом оставить включенной привязку к Endpoint - она нужна,чтоб выравнивать стрелку точно по линии.

----- добавлено через ~9 мин. -----
В коде сделал замену
(command "pline" "_non" pt1 pt2 pt3 "_c" "")
на
(command "pline" "_non" pt1 "_non" pt2 "_non" pt3 "_c" "")

Код:
[Выделить все]
 (defun c:fd ()
(setq ans "Yes")
(setq l 5)

(while (= ans "Yes")
(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" "")
(initget "Yes No")
(command "_rotate" "_non" "_L" "" "_non" pt1 "_non" pause)
)
)
Баги с зуммированием исчезли.Осталось как то добавить привязку.

----- добавлено через ~51 мин. -----
Вроде как разобрался с привязкой к Endpoint : "_non" перед pause убрал,и всё получилось:
Код:
[Выделить все]
 
(defun c:fd ()

(setq ans "Yes")
(setq l 5)

(while (= ans "Yes")
(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" "")
(initget "Yes No")
(command "_rotate" "_non" "_L" "" "_non" pt1  pause)
 
)
  
)
Еще одна вещь:допустим,ошибочно указал точку и хочу выйти из команды с помощью Esc .Выхожу - остается отрисованная стрелка.Думаю дальше как от этого избавиться.

Последний раз редактировалось Raznouh, 03.01.2014 в 00:33.
Raznouh вне форума  
 
Непрочитано 03.01.2014, 10:18
#9
Кулик Алексей aka kpblc
Moderator

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


Сначала получай точки (анализируй мой код + http://autolisp.ru/2009/09/13/error-catch/ ), а потом уже выполняй отрисовку. Ну и за компанию перечитай #7
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.01.2014, 12:03
1 | #10
skkkk


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


Я, конечно, не хочу остудить пыла автора темы, но чем не подходит для отрисовки стрелок штатная командa _qleader?
skkkk вне форума  
 
Автор темы   Непрочитано 03.01.2014, 15:41
#11
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


Цитата:
Сообщение от skkkk Посмотреть сообщение
Я, конечно, не хочу остудить пыла автора темы, но чем не подходит для отрисовки стрелок штатная командa _qleader?
skkk,тоже вариант ,но в данном случае мне нужны только концы стрелок(без размерной линии) - с помощью команды _LE я этого получить не сумел.Ещё один минус - если сравнивать с кодом ,получается 2 клика мышью против 2 кликов+Esc,в пользу кода.
И ещё честно говоря,лично по мне - увлекательно это написать в первый раз,пусть корявый,но код.

----- добавлено через ~45 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Сначала получай точки (анализируй мой код + http://autolisp.ru/2009/09/13/error-catch/ ), а потом уже выполняй отрисовку. Ну и за компанию перечитай #7
Алексей,вроде у меня так и есть:сначала получил точки

(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...,которых совсем нет в моем коде.
Raznouh вне форума  
 
Непрочитано 03.01.2014, 23:27
#12
skkkk


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


Цитата:
Сообщение от Raznouh Посмотреть сообщение
но в данном случае мне нужны только концы стрелок(без размерной линии) - с помощью команды _LE я этого получить не сумел
Если так, то да - похоже тут без вариантов - убрать линию, но оставить стрелку мне тоже не удалось.
Цитата:
Сообщение от Raznouh Посмотреть сообщение
Ещё один минус - если сравнивать с кодом ,получается 2 клика мышью против 2 кликов+Esc,в пользу кода.
Если задать правильные параметры (нажать клавишу "Вниз" перед отрисовкой выноски), то можно добиться двух кликов. Но раз уж идет борьба за каждый клик (это я люблю и сам), то можно же сделать это одним кликом по нужному сегменту полилинии, а не указывать две точки. Плюс можно попробовать рассмотреть вариант, что называется, совсем без кликов - создать подходящий тип линии, но тут есть большие сомнения, что все будет гладко. Я бы еще попробовал вместо треугольника-полилинии вставлять треугольник-блок, может, с маскировкой (_WIPEOUT). Есть также динамические блоки, возможности которых весьма и весьма обширны. Есть в конце концов параметризация.
Идем далее. Представляем ситуацию, что все или некоторые трубопроводы поменяли свое положение на чертеже, например, заказчик передумал. Что тогда? Вертеть каждый треугольник? Или удалять его и штамповать все по новой? Можно, конечно, и реакторы прикрутить на событие "редактирование полилинии", но это уже темный лес и на мой взгляд, - неразумное использование инструментария... В случае с выноской, например, или с типом линий, тут проблем не будет: перенес линии, а стрелочки уже по местам. При правильной организации работы с динамическими блоками я почти уверен, что тоже будет все просто. Поэтому прежде чем изобретать новый велосипед, надо бы посмотреть то, что уже изобретено.
Цитата:
Сообщение от Raznouh Посмотреть сообщение
увлекательно это написать в первый раз,пусть корявый,но код
Это-то как раз с самого твоего первого сообщения всем ясно Тут таких много любителей собралось, но согласись, гораздо приятней решить ту задачу, которая еще не решена, а таких в AutoCAD'e, поверь, предостаточно!
skkkk вне форума  
 
Автор темы   Непрочитано 03.01.2014, 23:52
#13
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


skkkk,конечно же я понимаю - существуют вертикальные решения на базе акада,которые значительно упрощают поставленую задачу в комплексе.Взять,например, тот же Civil .Помимо этого ,есть специализированный софт для работы с водяными сетями:начиная от их моделирования и заканчивая симуляцией подачи воды в сеть и анализом выходных параметров,таких как расход, давление,гид.потери и другие.Эти проги(имею в виду WaterCAD и Epanet) поддерживают импорт-экспорт в dxf и глупо было бы предполагать,что направление потока воды по ним не узнать))Но понимаешь,в моем случае заказчик хочет видить так,как он считает красивым,а не так как правильно, удобно,эргономично и целесообразно - такое в наше время ,увы, случается часто))Вот программа рисует стрелку направления потока в районе середины длины трубы,а ему нравится,чтоб стрелка была замкнутой и не на середине ,а в конце трубы у распределительного узла))Идиотизм,понимаю...но реалии такие,что особо не поспоришь)
Raznouh вне форума  
 
Непрочитано 04.01.2014, 00:02
#14
skkkk


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


Цитата:
Сообщение от Raznouh Посмотреть сообщение
,есть специализированный софт для работы с водяными сетями
Специализированный софт в ряде случаев не совсем удовлетворяет, а порой и совсем не удовлетворяет конкретным поставленным задачам и не соответствует нормам. Я о нем и не говорил. Я перечислял возможности голого Автокада, подразумевая, что нужно добиться одинакового результата на бумаге при наименьших кликозатратах. Как насчет отрисовки треугольника одним кликом по выбору полилинии. Не хороша ли идея?
skkkk вне форума  
 
Автор темы   Непрочитано 04.01.2014, 00:07
#15
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


skkkk,идея хороша,не поспоришь...но применима если все полилинии,а их примерно 2 сотни км труб,построены правильно в соответствии с направлением потока воды)Ведь направление стрелки,проставленной в сегмент одним кликом,зависит от этого...я правильно понимаю?)

----- добавлено через ~3 мин. -----
...мне кажется,по-любому,приходим к 2 кликам...меньше не получается,так как то условие построения полилиний,о котором я выше писал,не соблюдается.
Raznouh вне форума  
 
Непрочитано 04.01.2014, 00:13
#16
skkkk


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


Правильно, но можно сделать так, чтоб при неверном направлении линии или отрезка по правой кнопке происходило изменение направления.
skkkk вне форума  
 
Автор темы   Непрочитано 04.01.2014, 00:17
#17
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


skkk,и тогда в среднем получается полтора клика на трубу,учитывая то,что вероятно ,половина труб всё таки случайным образом построена в соответствии с направлением потока

----- добавлено через ~7 мин. -----
skkkk , есть еще один немаловажный момент:геометрия полилинии не должна меняться .Это для того,чтоб в любой момент можно было извлечь длину любой трубы.Или просто скрыть слой стрелок,чтоб не отвлекали внимание,если,скажем, нужно посмотреть общую картину трубопровода на данном участке.
Raznouh вне форума  
 
Непрочитано 04.01.2014, 10:55
1 | #18
skkkk


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


Цитата:
Сообщение от Raznouh Посмотреть сообщение
skkkk,идея хороша,не поспоришь...но применима если все полилинии,а их примерно 2 сотни км труб,построены правильно в соответствии с направлением потока воды
Вообще говоря, этот момент я подразумевал как само собой разумеющийся, когда предполагал такое решение. Для любой более или менее надежной и работоспособной автоматизации, будь то настоящая САПР или небольшой набор lisp-функций с форума, необходимо соблюдение минимальных требований и принципов по стандартизации. Иными словами, автоматизировать хаос нельзя - должен быть хоть какой-то порядок. Знаю, что приходится работать с чужими чертежами, но госпожу Геометрию это не волнует, как проблемы индейцев известно кого.
Цитата:
Сообщение от Raznouh Посмотреть сообщение
тогда в среднем получается полтора клика на трубу
Raznouh, я тут сообразил (туговато с этим делом в начале января на Руси), что на самом деле, по-хорошему, это те же два клика: первым, левым, ставится стрелка, вторым, правым - подтверждение либо изменения направления (читай: НА ПРОТИВОПОЛОЖНОЕ)?!...то есть, копнув глубже, мы понимаем, что в свете вышеозначенных событий идея всё-таки плоха. Тогда переходим к плану "Б"

План "Б"
Зацикливаем запрос полилиний, а правой кнопкой либо Enter'ом (пустой ввод, в зависимости от настроек правой кнопки мыши) реверсируем только что оСТРЕЛенную полилинию и перерисовываем стрелку, удалив старую (всё программно, разумеется). Но тогда выход возможен только по Esc, что тоже не есть хорошо... Но в полтора клика в среднем укладываемся. Можно добавить по правой кнопке выпадающее меню, например (скопируй в командную строку, перед этим включив Динамический ввод, кнопка внизу экрана):
Код:
[Выделить все]
(getkword "\nВыбрать действие: [Реверсировать/Выход]")
Это больше 1.5, но меньше 2-х кликов в среднем.

Однако, пожалуй, самым правильным
будет такой подход:
1. Временно назначаем нужным полилиниям-трубопроводам (надеюсь, они хотя бы на одном слое или, на худой конец отличаются от остальных цветом/типом линий/весом, чтоб их можно было программно выбрать)...так вот: назначаем им временно тип линий в виде стрелок, например, такой.
2. Командой ENTREV из набора PL-Tools реверсируем неправильно ориентированные полилинии.
3. Рисуем ВСЕ (!) стрелки одним махом.
При таком подходе среднее количество кликов стремится к 0.5 на полилинию.
Цитата:
Сообщение от Raznouh Посмотреть сообщение
skkkk , есть еще один немаловажный момент:геометрия полилинии не должна меняться .Это для того,чтоб в любой момент можно было извлечь длину любой трубы.
При изменении направления линии на строго противоположное длина линии не изменится.
Цитата:
Сообщение от Raznouh Посмотреть сообщение
Признаться честно,не совсем понял как реализовать выход Esc из команды на любом этапе,оставляя при этом чертеж в "первозданном" виде,однако на практике вижу что в твоем коде эта возможность реализована так как нужно.Интуиция мне подсказывает,что секрет во многочисленных _end of...,которых совсем нет в моем коде.
Интуиция на этот раз подвела... "Многочисленные _end of..." - это всего лишь комментарии, созданные для пояснений внутри кода, т.е. всё что в строке после символа точки с запятой - программой не исполняется. Правильный выход по Esc - это обработка ошибок в сочетаниях с функциями vla-StartUndoMark и vla-EndUndoMark (см. также vl-catch-...-функции). Обработка ошибок подробно разобрана в теме указанной Alan'ом в #3.

Последний раз редактировалось skkkk, 04.01.2014 в 11:20.
skkkk вне форума  
 
Автор темы   Непрочитано 04.01.2014, 14:47
#19
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


Цитата:
Сообщение от skkkk Посмотреть сообщение
так вот: назначаем им временно тип линий в виде стрелок, например, такой.
skkkk,даров.Спасибо тебе за помощь!
ща загрузил этот тип линий ,он выглядит примерно так: ----->----->----->----->----->
Скорее всего,нарисую свой.Но опять таки выходит одно но :если я соберусь вскормить сеть нарисованную такими линиями ,предварительно переведя чертеж в dxf,программе Epanet для гидравлического анализа ...я не знаю,сможет ли он корректно считать длину каждой трубы,в связи со спецификой стиля полилиний,которыми она построена.Так что воспользоваться им стоит на финальном этапе разработки,когда все расчитанно ,пересчитано,исправлено и снова пересчитанно.
Но по-любому - способ четкий:пакетный.Попытаюсь им воспользоваться.Спасибо за подсказку.

Цитата:
Сообщение от skkkk Посмотреть сообщение
Правильный выход по Esc - это обработка ошибок в сочетаниях с функциями vla-StartUndoMark и vla-EndUndoMark (см. также vl-catch-...-функции). Обработка ошибок подробно разобрана в теме указанной Alan'ом в #3.
Поковыряюсь и посмотрю что там Полещук про это писал:надеюсь как бы то не было довести и свой код до ума тоже

----- добавлено через ~10 ч. -----
Пока читал тему Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу), привел свой код в более "благопристойный" вид:
Код:
[Выделить все]
 (defun c:fd (/ pt1 x2 y2 x3 y3 )
(setq pt1 (getpoint "Pick arrow end point:"))
(setq x2 (+ (car pt1) 5))
(setq y2 (+ (car (cdr pt1)) (/ 5 2)))
(setq x3 (+ (car pt1) 5))
(setq y3 (- (car (cdr pt1)) (/ 5 2)))
(command "._pline"
	 "_non" pt1
	 "_non"(list x2 y2)
	 "_non"(list x3 y3)
	 "_close"
(command "_rotate""_non" "_L" "" "_non" pt1 pause)
	 ))
Продолжаю читать.С нетерпением жду когда дойду до места,где раскрывается Тайна отмены кода нажатием Esc и возвращения чертежа в первозданный вид(после того как точка задана , полилиния вычерчена и осталось сделать только поворот).

----- добавлено через ~3 ч. -----
Оказывается...нужно сделать блок из моей стрелки,чтоб проблемы решились:отрисовать полилинию с началом в точке 0.0,потом сделать из нее блок,потом указать ему нужную точку вставки,а вот когда запросит угол поворота,вот только тогда можно нажать Esc и всё исчезнет)))

Последний раз редактировалось Raznouh, 05.01.2014 в 02:23.
Raznouh вне форума  
 
Автор темы   Непрочитано 05.01.2014, 17:21
#20
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


Выглядит всё это примерно так:
Код:
[Выделить все]
 (defun c:fd ()
(defun *error*(msg)
(princ msg);canceled by user
  )
  (if (tblsearch "block" "$arrow$");searching for arrow block if exists
  (command "_-insert" "$arrow$" "_X" 1  "_Y" 1 pause);insert arrow block if exists
(progn (command "_pline"
	 "_non" "0,0"
	 "_non" "5,2.5"
	 "_non" "5,-2.5"
	 "_close");creating arrow using closed _pl
(command "_-block" "$arrow$" "0,0" "_last" "");creating arrow block (if not existing) 
(command "_-insert" "$arrow$" "_X" 1  "_Y" 1 pause);insert new created arrow block 
))
)
Спасибо: Alan,kpblc,skkkk за напутствие и оказанную помощь;VVA за интересную постановку задачи в посте #265 темы Научите лиспу на примере..,а так же Red Nova (пост #289 ) за наглядную реализацию этой задачи.
ЗЫ: если в коде есть косяки ,которые могут помешать длительной работе с ним,подскажите пожалуйста.
Raznouh вне форума  
 
Непрочитано 05.01.2014, 17:26
#21
Кулик Алексей aka kpblc
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-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.01.2014, 17:45
#22
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


kpblc,если языком пользователя акад,касательно моего кода, нужно добиться того,чтоб блок $arrow$ с корнем исчезал из системы при выполнении команды _undo?
Raznouh вне форума  
 
Непрочитано 05.01.2014, 17:47
#23
Кулик Алексей aka kpblc
Moderator

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


Нужно чтобы после нажатия _.undo (Ctrl+Z) в файле не оставалось лишнего мусора.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.01.2014, 17:49
#24
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


kpblc,понял. Щас гляну. Правда страшно в с vla связываться почему то.
Raznouh вне форума  
 
Непрочитано 05.01.2014, 17:51
#25
Кулик Алексей aka kpblc
Moderator

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


Вопрос не в том, каким методом будет реализовываться отмена, а в том, где и когда будут ставиться метки.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.01.2014, 18:00
#26
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


kpblc,увидел глазами всё :выполнил код,сдал назад - всё исчезло,зашел в _insert - а он ,сволочь,там в блоках спрятался оказывается.
Raznouh вне форума  
 
Непрочитано 05.01.2014, 19:46
#27
skkkk


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


Raznouh, так уже как минимум намного изящней, чем вращение предварительно отрисованной и ориентированной горизонтально стрелки, как в первой версии.
А нельзя ли избавиться от запроса угла поворота блока при вставке? Для этого надо понять, всегда ли стрелка ставится в конце (или начале) полилинии, или она также может вставать и между сегментами, или на стыке двух полилиний?
skkkk вне форума  
 
Автор темы   Непрочитано 05.01.2014, 20:21
#28
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


skkkk,думаю,что можно,но не с той базой знаний лиспа ,какая у меня сейчас)Мне бы хоть наводки какие то:какими функциями оперировать для решения подобного рода задач...)
Raznouh вне форума  
 
Непрочитано 05.01.2014, 21:18
#29
skkkk


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


А как насчет этого?
Цитата:
Сообщение от skkkk Посмотреть сообщение
всегда ли стрелка ставится в конце (или начале) полилинии, или она также может вставать и между сегментами, или на стыке двух полилиний?
----- добавлено через ~6 мин. -----
...или отрезков...
skkkk вне форума  
 
Автор темы   Непрочитано 05.01.2014, 21:36
#30
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


skkkk,entsel ,entlast,entnext...выбрать полилинию ,указать в какую именно точку полилинии вставится стрелка?А как поворот правильный задать?
Raznouh вне форума  
 
Непрочитано 05.01.2014, 21:56
#31
Кулик Алексей aka kpblc
Moderator

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


Через угол от начальной/конечной вершины полилинии до следующей/предпоследней. И не забыть про дуговые сегменты... И не забыть про вариант с ненулевой шириной сегмента
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.01.2014, 22:05
#32
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


Код:
[Выделить все]
 (defun c:pci()
  (setq pol (entsel "Show object:"))
  (setq v1 (entnext pol))
  (command "_circle" "_non"  v1  10 ""  pause)
  )
В качестве тренировки хочу нарисовать кружок на первой точке выделенной полилинии.Но чё то не выходит.Почему?
Raznouh вне форума  
 
Непрочитано 05.01.2014, 22:08
#33
skkkk


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


В ответ на запрос угла поворота команды _-insert можно указать точку, а можно ввести угол.
Нужно также, чтобы программно можно было определить, где начало, а где конец. Если одна из точек уже известна (точка вставки блока), и если это крайняя точка линии и она не совпадает с крайней точкой другой линии, то я вижу как минимум два варианта:
Вариант 1: вычислить любую точку, принадлежащую данной линии, отличную от конечной точки и подставить ее на запрос угла. Тут я бы использовал функцию vlax-curve-getPointAtParam.
Вариант 2: вычислить угол по двум точкам (начала и конца линии) функцией angle и тоже скормить инсерту.
skkkk вне форума  
 
Непрочитано 05.01.2014, 22:15
#34
Кулик Алексей aka kpblc
Moderator

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


Raznouh, что будет, если в ответ на запрос pol я введу Esc? А что будет, если выберу отрезок, а следующий созданный мною примитив был, например, окружностью?
Цитата:
Сообщение от Raznouh Посмотреть сообщение
В качестве тренировки хочу нарисовать кружок на первой точке выделенной полилинии.Но чё то не выходит.Почему?
Как вариант номер раз:
Код:
[Выделить все]
 (defun c:pci (/ ent)
  (if (and (= (type (setq ent (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (car (entsel "\nSelect polyline <Cancel> : "))
                                    ) ;_ end of LAMBDA
                                  ) ;_ end of function
                                ) ;_ end of VL-CATCH-ALL-APPLY
                          ) ;_ end of setq
                    ) ;_ end of type
              'ename
              ) ;_ end of =
           (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")
           ) ;_ end of and
    (command "_.circle" "_none" (cdr (assoc 10 (entget ent))) 10)
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
Вариант номер два:
Код:
[Выделить все]
 (defun c:pci (/ ent)
  (if (and (= (type (setq ent (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (car (entsel "\nSelect polyline <Cancel> : "))
                                    ) ;_ end of LAMBDA
                                  ) ;_ end of function
                                ) ;_ end of VL-CATCH-ALL-APPLY
                          ) ;_ end of setq
                    ) ;_ end of type
              'ename
              ) ;_ end of =
           (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")
           ) ;_ end of and
    (entmakex (list (cons 0 "CIRCLE")
                    (assoc 10 (entget ent))
                    '(40 . 10.)
                    ) ;_ end of list
              ) ;_ end of entmakex
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
Есть еще несколько моментов, которые я не учел: полилиния не в текущей системе координат, имеет свою собственную Elevation и т.д.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.01.2014, 22:21
#35
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


kpblc я сейчас не могу об этом судить:я пока даже окружность на конце полилинии получить не смог.
Raznouh вне форума  
 
Непрочитано 05.01.2014, 22:33
#36
Кулик Алексей aka kpblc
Moderator

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


Так на конце полилинии, на начале полилинии или еще на какой-то точке?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.01.2014, 22:40
#37
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


kpblc,ни там ,ни там пока не смог.Я хочу разобраться в этом:хотя бы на элементарном уровне с ошибками недочетами и косяками - лишь бы построилось то,что хочу увидеть,а о том,что останется в системе после этого,что будет если указать не то что надо и что будет если выйти из команды не завершив ее - для меня это на первом этапе не важно:как я могу правильно выйти из кода,если не могу в него нормально зайти?))

----- добавлено через ~19 ч. -----
kpblk,я вот сейчас читал про функции из твоего первого кода(пост №34).
Я его немного пообрубал,и сделал чтоб мне более понятно было:
Код:
[Выделить все]
 (defun c:pci (/ ent eft)
  (setq ent (car (entsel "\nSelect polyline <Cancel> : ")))
  (setq eft (cdr (assoc 10 (entget ent))))
  (command "_.circle" "_none" eft 15 "" pause)
  )
Здесь 10 ,как я понял из книги Полещука,код группы начальной точки полилинии.У меня была мысль добраться до второй вершины полилинии,но в списке вторая вершина полилинии тоже под кодом 10,как и все последующие.Вопрос:с помощью какой функции можно реализовать извлечение координат n-ной вершины полилинии?
Raznouh вне форума  
 
Непрочитано 06.01.2014, 21:52
1 | #38
Do$

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


Цитата:
Сообщение от Raznouh Посмотреть сообщение
Вопрос:с помощью какой функции можно реализовать извлечение координат n-ной вершины полилинии?
Например:
1. применив функцию massoc из этого сообщения: http://forum.dwg.ru/showpost.php?p=64365&postcount=4 получим список из вершин.
2. применив стандартную функцию nth извлекаем любую вершину из этого списка.
Это один из многих возможных вариантов, может быть, не самый оптимальный.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 06.01.2014, 22:13
1 | #39
Кулик Алексей aka kpblc
Moderator

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


Еще один вариант получения координат вершин в мировой системе координат независимо ни от чего:
Код:
[Выделить все]
 
(defun lwpoly_vert (lwpoly / plinee elev vnv)
;|
*    Функция получения координат легкой полилинии (LWPOLYLINE) в WCS. Возвращает
* список 3Д-точек
*    Автор: BOZ (http://www.autocad.ru/cgi-bin/f1/board.cgi?t=26461HC)|;
  (setq  plinee (entget lwpoly)
  elev   (cdr (assoc 38 plinee))
  vnv    (cdr (assoc 210 plinee))
  ) ;_ end of setq
  (mapcar
    (function (lambda (x) (trans (list (cadr x) (caddr x) elev) vnv 0)))
    (vl-remove-if-not (function (lambda (x) (= (car x) 10))) plinee)
    ) ;_ end of mapcar
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 06.01.2014, 22:54
#40
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


kpblc,Do$ Спасибо!Сейчас начну ковырять.

----- добавлено через ~17 ч. -----
Написал чуть по-другому теперь. Люди,подскажите:почему не получается _rotate?
Код:
[Выделить все]
 (defun c:pro(/ pl pt pt2 rad deg x2 y2 x3 y3)
  (vl-load-com)
(setq pl(car(entsel "\nShow polyline"))
 ) 
(setq pt (vlax-curve-getStartPoint pl))
(setq pt2 (vlax-curve-getPointAtDist pl 3))
(setq rad (angle pt pt2))
(setq deg (angtof "rad" 1))
(setq x2 (+ (car pt) 5))
(setq y2 (+ (car (cdr pt)) (/ 5 2)))
(setq x3 (+ (car pt) 5))
(setq y3 (- (car (cdr pt)) (/ 5 2)))
 (command "_pline"
	 "_non" pt
	 "_non"(list x2 y2)
	 "_non"(list x3 y3)
	 "_close")
(command "_rotate" "_Last"  pt deg )
	 )
----- добавлено через ~17 ч. -----
Представления функции angtof проверил все от 1 до 4х,ни на одном не вращает.
Raznouh вне форума  
 
Автор темы   Непрочитано 07.01.2014, 23:40
#41
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


skkkk,приблизился к тому,о чем мы говорили неск.дней назад:
Цитата:
Сообщение от skkkk Посмотреть сообщение
Как насчет отрисовки треугольника одним кликом по выбору полилинии. Не хороша ли идея?
Код:
[Выделить все]
 (defun c:lro(/ pl pt1 pt2 x2 y2 x3 y3 x4 y4 v2 v3 v4 )
(setq pl(car(entsel "\n Show me polyline:")))
(setq pt1 (vlax-curve-getStartPoint pl))
(setq pt2 (vlax-curve-getPointAtDist pl 4))
(setq x2 (+(car pt1) 4))
(setq y2 (+(car (cdr pt1)) 2))
(setq x3 (+(car pt1) 4))
(setq y3 (car (cdr pt1))) 
(setq x4 (+(car pt1) 4))
(setq y4 (-(car (cdr pt1)) 2))
(setq v2 (list x2 y2))
(setq v3 (list x3 y3))
(setq v4 (list x4 y4))
(command "_pline" "_none" pt1 "_none" v2 "_none" v3 "_none" v4 "_close")
(command "rotate" "L" "" "_none"pt1 "R" "_none""@"  "_none"pt1 "_none"pt2  )
      )
Это черновой,но уже работающий вариант.
Осталось теперь только придумать как сделать реверс полилинии по наименее кликозатратному условию

----- добавлено через ~13 мин. -----
сделать после выполнения этого кода запрос типа "Reverse ?<No>",(пикбоксом указать полилайн,если да),а если нет - выход по энтер и снова начало верхнего кода.
Raznouh вне форума  
 
Непрочитано 08.01.2014, 01:04
1 | #42
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 190
Отправить сообщение для nolte с помощью Skype™


как вариант отрисовки стрелки
Код:
[Выделить все]
 
(defun L_ar (/ d coor lst_p count_ver ver_new)
(vl-load-com)
(setq d (vlax-ename->vla-object (car (entsel))))
(setq coor (vlax-safearray->list (vlax-variant-value (vla-get-coordinates d))))
(repeat (/ (length coor) 2) (setq lst_p (cons (list (car coor) (cadr coor)) lst_p)) (setq coor (cddr coor)))
(setq count_ver (1- (length lst_p)))
(setq ver_new (vlax-curve-getpointatdist d (- (vla-get-length d) 20)))
(vla-addvertex d count_ver (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble '(0 . 1)) (reverse (cdr (reverse ver_new)))))
(vla-setwidth d count_ver 10 0)
)
нет обработки ошибок, не учитывается толщина полилинии, минимальное расстояние последнего сегмента и т.д., но повторюсь как вариант отрисовки стрелки на конце полилинии.
вот и некрасиво работает с замкнутыми полилиниями.
__________________
Знание лисп: со справочником Н. Полещука

Последний раз редактировалось nolte, 08.01.2014 в 01:12.
nolte вне форума  
 
Автор темы   Непрочитано 08.01.2014, 01:11
#43
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


nolte,спасибо!Хороший код для изучения
Raznouh вне форума  
 
Непрочитано 08.01.2014, 01:53
1 | #44
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 190
Отправить сообщение для nolte с помощью Skype™


попытаюсь помочь тебе
строка 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).
Удачи тебе в нелегком, но увлекательном, не прибыльном, но греющем душу и дающем зарядку для серого вещества, деле изучения лисп.
__________________
Знание лисп: со справочником Н. Полещука
nolte вне форума  
 
Автор темы   Непрочитано 09.01.2014, 12:36
#45
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


Вот она задумка:
Код:
[Выделить все]
 (defun c:fd (/ pl pt1 pt2 endpt1 len len2 endpt2 x2 y2 x3 y3 x4 y4 v2 v3 v4 ans x5 y5 x6 y6 x7 y7 v5 v6 v7 )
(setq pl(car(entsel "\n Select pipe to add flow direction arrow:")))
(setq pt1 (vlax-curve-getStartPoint pl))
(setq pt2 (vlax-curve-getPointAtDist pl 4))
(setq endpt1 (vlax-curve-getEndPoint pl))
(setq len (vlax-curve-getDistAtPoint pl endpt1))
(setq len2 (- len 4))
(setq endpt2 (vlax-curve-getPointAtDist pl len2)) 
(setq x2 (+(car pt1) 4))
(setq y2 (+(car (cdr pt1)) 2))
(setq x3 (+(car pt1) 4))
(setq y3 (car (cdr pt1))) 
(setq x4 (+(car pt1) 4))
(setq y4 (-(car (cdr pt1)) 2))
(setq v2 (list x2 y2))
(setq v3 (list x3 y3))
(setq v4 (list x4 y4))
(command "_pline" "_none" pt1 "_none" v2 "_none" v3 "_none" v4 "_close")
(command "rotate" "L" "" "_none"pt1 "R" "_none""@"  "_none"pt1 "_none"pt2  )
(initget 16 "Y")
(setq ans (getkword "\n Change flow direction?[Y]<NO if Enter>"))
(if (= ans "Y")
(progn(command "_erase" "L" "")
(setq x5 (+(car endpt1) 4))
(setq y5 (+(car (cdr endpt1)) 2))
(setq x6 (+(car endpt1) 4))
(setq y6 (car (cdr endpt1))) 
(setq x7 (+(car endpt1) 4))
(setq y7 (-(car (cdr endpt1)) 2))
(setq v5 (list x5 y5))
(setq v6 (list x6 y6))
(setq v7 (list x7 y7))
(command "_pline" "_none" endpt1 "_none" v5 "_none" v6 "_none" v7 "_close")
(command "rotate" "L" "" "_none"endpt1 "R" "_none""@"  "_none"endpt1 "_none"endpt2  ))
      ))
  
Работает.Даже со сплайнами.Теперь осталось подумать над обработчиком ошибок.
Raznouh вне форума  
 
Автор темы   Непрочитано 27.01.2014, 00:57
#46
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


skkkk,за месяц понахватался немного знаний и всё таки сделал в 1 клик
Код:
[Выделить все]
 ( defun c:fd ()
(vl-load-com)
(setq obj (entsel "\n Select pipe close to node,where water flows <Esc for exit>:"))
(setq pl (car obj))
(setq sp (cadr obj))
(setq lsp (vlax-curve-getclosestpointto pl sp))
(setq len (vlax-curve-getdistatpoint pl (vlax-curve-getendpoint pl)))
(setq dlsp(vlax-curve-getdistatpoint pl lsp))
(setq spt (vlax-curve-getpointatdist pl (-(/ len 2) 2.5)))
(setq ept (vlax-curve-getpointatdist pl (+(/ len 2) 2.5)))
(if (< dlsp (/ len 2))
(progn
(setq pt1 (list (car spt) (car(cdr spt))))
(setq pt2 (list (car ept) (car(cdr ept)))))
(progn
(setq pt1 (list (car ept) (car(cdr ept))))
(setq pt2 (list (car spt) (car(cdr spt))))))
(entmakex (list (cons 0 "LWPOLYLINE") (cons 100  "AcDbEntity") (cons 100  "AcDbPolyline") (cons 90 2) (cons 70 0) (cons 10 pt1) (cons 40 0) (cons 41 5) (cons 42 0) 
(cons 10 pt2) (cons 40 0) (cons 41 0) (cons 42 0) ))
)
Стрелка выставляется ровно по центру,но можно без проблем этим же методом реализовать и на одном из концов.

----- добавлено через ~2 мин. -----
Спасибо форуму и всем форумчанам!
Raznouh вне форума  
 
Непрочитано 27.01.2014, 01:25
1 | #47
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 190
Отправить сообщение для nolte с помощью Skype™


__________________
Знание лисп: со справочником Н. Полещука
nolte вне форума  
 
Непрочитано 27.01.2014, 19:07
#48
skkkk


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


Цитата:
Сообщение от Raznouh Посмотреть сообщение
skkkk,за месяц понахватался немного знаний и всё таки сделал в 1 клик
Raznouh, сейчас нет возможности погонять код, и вникать не хочется, просто интересно: как определяется направление стрелки? Или порядок с направлениями линий в чертеже все же пришлось навести?

----- добавлено через ~17 мин. -----
Я что-то не в теме или почему вместо
Цитата:
Сообщение от Raznouh Посмотреть сообщение
Код:
[Выделить все]
 (setq pt1 (list (car spt) (car(cdr spt))))
нельзя написать просто
Код:
[Выделить все]
 (setq pt1 spt)
skkkk вне форума  
 
Автор темы   Непрочитано 27.01.2014, 19:59
#49
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


Цитата:
Сообщение от skkkk Посмотреть сообщение
нельзя написать просто
Код:
[Выделить все]
1
(setq pt1 spt)
skkkk,может быть и можно,но я так понял (и проверил на практике с помощью entget),что dxf код 10 lwpolyline - это точечная пара координат x и y,без z:
Цитата:
10 - Vertex coordinates (in OCS), multiple entries; one entry for each vertex
DXF: X value; APP: 2D point
+ Н.Н.Полещук стр.855 ,тогда как spt - трехмерная(с z).Опять таки - спорить не хочу,может я неправильно понял.

Цитата:
сейчас нет возможности погонять код, и вникать не хочется, просто интересно: как определяется направление стрелки? Или порядок с направлениями линий в чертеже все же пришлось навести?
Нет,просто nolte подал такую идею:тыкать в линию ближе к тому концу,к которому направлен поток))Достаточно не попасть ровно в середину линии,а дальше расстояние от твоего клика до середины линии не имеет значения,лишь бы клик пришелся в ту половину,куда направлен поток.
Raznouh вне форума  
 
Непрочитано 27.01.2014, 22:16
#50
skkkk


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


Raznouh, ясно, спасибо за объяснения. А идея хороша, ничего не скажешь, я не додумался до такой. Пока разбирался с Tapatalk'ом, проморгал как-то несколько сообщений. А что будет, если попасть в середину?
skkkk вне форума  
 
Автор темы   Непрочитано 27.01.2014, 22:53
#51
Raznouh


 
Регистрация: 13.09.2011
Баку, Азербайджан
Сообщений: 114


Цитата:
А что будет, если попасть в середину?
skkkk,не думаю,что такое вообще возможно - попасть пикбоксом (квадратик,не перекрестие,которым можно привязаться к средней точке) точно в середину полилинии или отрезка.И ещё:
Цитата:
Entsel .Возвращаемое значение — список, состоящий из двух элементов: имени выбранного примитива и точки, которой пользователь указал объект (такая точка, как правило, оказывается вне самого примитива, поскольку точность указания мышью зависит от величины прицела)
Всвязи с этим - 6-я строка кода.
Raznouh вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP.Стрелки направления на концах полилиний .Не могу написать код



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием 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