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

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

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

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

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

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

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

Просмотров: 13570
 
Непрочитано 05.01.2014, 17:26
#21
Кулик Алексей aka kpblc
Moderator

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


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
С.-Петербург
Сообщений: 39,850


Нужно чтобы после нажатия _.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
С.-Петербург
Сообщений: 39,850


Вопрос не в том, каким методом будет реализовываться отмена, а в том, где и когда будут ставиться метки.
__________________
Моя библиотека 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,653


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,653


А как насчет этого?
Цитата:
Сообщение от 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
С.-Петербург
Сообщений: 39,850


Через угол от начальной/конечной вершины полилинии до следующей/предпоследней. И не забыть про дуговые сегменты... И не забыть про вариант с ненулевой шириной сегмента
__________________
Моя библиотека 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,653


В ответ на запрос угла поворота команды _-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
С.-Петербург
Сообщений: 39,850


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
С.-Петербург
Сообщений: 39,850


Так на конце полилинии, на начале полилинии или еще на какой-то точке?
__________________
Моя библиотека 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,702
Отправить сообщение для 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
С.-Петербург
Сообщений: 39,850


Еще один вариант получения координат вершин в мировой системе координат независимо ни от чего:
Код:
[Выделить все]
 
(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 вне форума  
Ответ
Вернуться   Форум 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