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

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

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

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

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

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

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

Просмотров: 14188
 
Автор темы   Непрочитано 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