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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > нарисовать полилинию из списка с координатами точек (lisp)

нарисовать полилинию из списка с координатами точек (lisp)

Ответ
Поиск в этой теме
Непрочитано 11.02.2011, 03:17
нарисовать полилинию из списка с координатами точек (lisp)
paradoxvaha
 
проектирование противооползневых сооружений
 
Yalta
Регистрация: 06.04.2007
Сообщений: 50

Всем привет. Возник небольшой вопрос: можно ли как то нарисовать полилинию (_pline) по имеющимся координатам точек в списке lisp? Т.е. список состоит из точечных пар, и надо по этим точкам отрисовать полилинию. Если нет идей, то подскажите пожалуйста где об этом почитать можно.
Просмотров: 24539
 
Непрочитано 13.02.2011, 10:02
#21
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
А зачем, например, vla-get-Block вставлен?
А затем, чтоб полилиния создавалась в активном пространстве, так же как это будет при entmake
заменив
Код:
[Выделить все]
 (vla-get-Block (vla-get-ActiveLayout (vla-get-ActiveDocument (vlax-get-acad-object))))
на
Код:
[Выделить все]
 (if (= 1 (getvar "TILEMODE")) 
     (vla-get-ModelSpace(vla-get-ActiveDocument(vlax-get-Acad-Object))) 
     (vla-get-PaperSpace(vla-get-ActiveDocument(vlax-get-Acad-Object))) 
   )
Легче стало не намного, соотношение времени выполнения vla : ent стало 2.3 : 1, вместо 2.5 : 1 ранее

Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Конечно, такой вызов будет работать медленнее, чем простенький entmake.
И entmake не простенький, там ещё tranc-иться всё постоянно, чтоб сравниваемые функции были идентичными.
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 13.02.2011, 12:01
#22
Li6-D


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


Самое простое, что можно предложить автору темы:
Код:
[Выделить все]
;|Выражение для рисования незамкнутой lw-полилинии нулевой толщины "командным" методом.
Если заменить '("") на '("_Close") получится замкнутая полилиния.
Точки полилинии должны быть определены в списке pN.|;
(apply 'vl-cmdf (append (list "_.PLINE" (car pN) "_W" 0 0) (cdr pN) '("")))
Интересно насколько оно медленнее по сравнению с vla-,ent-методами?
Код:
[Выделить все]
;;Выражение, формирующее список точек pN для тестирования.
;;Последовательность ввода точек обозначается временными векторами красного цвета.
((lambda (p)
   (setq PN nil)
   (if p
     (while (setq pN (cons p pN) p (getpoint p "\nВведите следующую точку: "))
       (grdraw (car pN) p 1)
   ) )
   (setq PN (reverse pN))
 )
 (getpoint "\nВведите первую точку: ")
)

Последний раз редактировалось Li6-D, 13.02.2011 в 13:34.
Li6-D вне форума  
 
Непрочитано 14.04.2012, 18:24
#23
SteelBrother

Проектировщик
 
Регистрация: 14.08.2011
Екатеринбург
Сообщений: 58
<phrase 1=


VVA
Подскажи пожалуйста, зачем в посте номер 3 вы использовали функцию trans? полдня голову ломаю)))
одно предположение есть только: для того что бы избавится от проблем если в системе переменная ELEVATION отлична от нуля.
SteelBrother вне форума  
 
Непрочитано 14.04.2012, 18:29
#24
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


В ту функцию точки передаются в текущей UCS.
Александр Ривилис вне форума  
 
Непрочитано 14.04.2012, 18:40
#25
SteelBrother

Проектировщик
 
Регистрация: 14.08.2011
Екатеринбург
Сообщений: 58
<phrase 1=


уточню. в текущей? или в МСК?
SteelBrother вне форума  
 
Непрочитано 14.04.2012, 18:49
#26
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от VVA Посмотреть сообщение
; lst - list of points ((X1 Y1)(X2 Y2) ... (Xn Yn)) in current UCS
UCS - это ПСК. WCS - это МСК. Данная функция считает, что точки передаются ей в текущей ПСК (current UCS)
Александр Ривилис вне форума  
 
Непрочитано 14.04.2012, 18:56
#27
SteelBrother

Проектировщик
 
Регистрация: 14.08.2011
Екатеринбург
Сообщений: 58
<phrase 1=


спасибо. понял.
SteelBrother вне форума  
 
Непрочитано 19.02.2014, 21:13
#28
Eghor123


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


Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
ACET-PLINE-MAKE
а что это вообще за функции такие? чет мне про них ничего не известно
Eghor123 вне форума  
 
Непрочитано 19.02.2014, 21:39
#29
Кулик Алексей aka kpblc
Moderator

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


Из ExpressTools
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.12.2014, 17:49
#30
alex101000


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


Подскажите, пожалуйста, как изменить только одну из координат точки в http://forum.dwg.ru/showpost.php?p=700954&postcount=22 ? Значение поправки должно запрашиваться для каждого участка полилинии.
alex101000 вне форума  
 
Непрочитано 30.12.2014, 13:05
#31
alex101000


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


Голова поломалась. Запутался в строке вусмерть.
Код:
[Выделить все]
 (while (setq pN (cons p pN) p (getpoint p "\nВведите следующую точку: "))
Уже на (getpoint p "\nВведите...") торможу, ведь обычно запись вида (setq p (getpoint "\nВведите...")).
Дальше вообще запутался: аргументы (setq pN) какие ? (cons p pN) ? А что тогда (setq pN (cons p pN) p вот это ?
alex101000 вне форума  
 
Непрочитано 30.12.2014, 14:22
1 | #32
VVA

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


Цитата:
Сообщение от alex101000 Посмотреть сообщение
(setq pN (cons p pN) p вот это ?
Это СПИСОК точек
Цитата:
Сообщение от alex101000 Посмотреть сообщение
Уже на (getpoint p "\nВведите...") торможу, ведь обычно запись вида (setq p (getpoint "\nВведите...")).
Это необязательный параметр, нужен для отображения резиновой линии.
Если раздражает, можно и убрать
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 13.01.2015, 15:00
#33
alex101000


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


VVA, благодарю за разъяснение. Резиновая линия на этапе отладки даже помогает.
Из палок и глины получилось вот что:
Код:
[Выделить все]
 
(defun change_point (point / dx dy new_point)
 ;точка
 ;смещение по х
 ;смещение по y
 ;измененная точка
					
 (setq dx 0)
 ;;изменение координаты х
  (setq   new_point
    (subst                         ;заменить
      (+ (car point) dx)      ;на новую x
      (car point)         ;старую x
      point         ;в координатах точки point
    )            ;end subst
  )               ;end setq
  (setq point new_point)
 ;;изменение координаты y
(setq dy (getreal "\nEnter Offset <exit>: "))
 (setq   new_point
    (subst
      (- (cadr point) dy)      ;new y
      (cadr point)         ;old y
      point         ;list
    )            ;end subst
  )               ;end setq
)
;;;;;;
(defun C:12 (/ p PN pn)
((lambda (p)
   (setq PN nil)
   (if p
     (while (setq pN (cons (change_point p) pN) p (getpoint p "\nВведите следующую точку: "))
       (grdraw (car pN) p 1)
	   )
	)
   (setq PN (reverse pN))
 )
 (getpoint "\nВведите первую точку: ")
)
(apply 'vl-cmdf (append (list "_.PLINE" (car pN) "_W" 0 0) (cdr pN) '("")))
)
Но поведение странное:
Иногда воспринимает оффсет через одну точку
Иногда игнорирует смещение для отдельной точки
"Засечки" резиновой линии проставляются с задаваемым смещением (файл 1.jpg), посторенная полилиния странная (файл 2.jpg) - смещения задавались 50 и 100, но в одном случае не отработало.

Черетж1.dwg:
Белая самая длинная - оригинал, о которого откладывалось смещение.
Для жёлтой полилинии задавал смещение 50, 100 по очереди, последние три значения смещения были 100.
Красная полилиния - начал не с первой точки оригинала, те же 100 и 50 для смещения, в одной точке смыкается с оригиналом.
Нижняя белая полилиния - ход экспериментов, но смыкание с оригиналом тоже видно.

И как сделать смещение для первой точки, в случае указания всех точек оригинальной полилинии ?

Потыкайте, пожалуйста носом, где ошибаюсь.
Заранее признателен.
Миниатюры
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 97
Размер:	366.4 Кб
ID:	141868  Нажмите на изображение для увеличения
Название: 2.jpg
Просмотров: 87
Размер:	376.2 Кб
ID:	141869  
Вложения
Тип файла: dwg
DWG 2010
Чертеж1.dwg (148.4 Кб, 703 просмотров)
alex101000 вне форума  
 
Непрочитано 26.04.2016, 13:13
#34
olezhkooo

Проектирование
 
Регистрация: 06.08.2012
СПб
Сообщений: 163


Возможно немного не по теме, но, дабы не создавать отдельную тему, напишу здесь.
Помогите с лиспом. Нужен простейший лисп, который будет рисовать отрезок по заданным длинам проекций X и Y. Например мне нужен отрезок, чтобы проекция по X была 40, а по Y 20.. По функциям, наверно, чтобы было так..: я запускаю лисп и он предлагает указать начальную точку, потом к примеру длину проекции X и далее длину проекции Y.. и всё.. с лиспом не работал уже лет 10 (( всё позабылось..
olezhkooo вне форума  
 
Непрочитано 26.04.2016, 13:16
1 | #35
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™



А зачем для этого лисп? Запускаешь команду ОТРЕЗОК (_LINE), указываешь первую точку, указываешь вторую точку в виде @X,Y (в данном случае @40,20)
Александр Ривилис вне форума  
 
Непрочитано 26.04.2016, 13:23
#36
olezhkooo

Проектирование
 
Регистрация: 06.08.2012
СПб
Сообщений: 163


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
А зачем для этого лисп? Запускаешь команду ОТРЕЗОК (_LINE), указываешь первую точку, указываешь вторую точку в виде @X,Y (в данном случае @40,20)
блин.. а точно же.. через относительный ввод..
olezhkooo вне форума  
 
Непрочитано 05.04.2023, 05:58
#37
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Цитата:
Сообщение от VVA Посмотреть сообщение
Только lw полилиния
Код:
(defun LWPoly (lst cls / exv)
; Draw lwpolyline in current UCS
; version for pre-visual lisp.
; lst - list of points ((X1 Y1)(X2 Y2) ... (Xn Yn)) in current UCS
; cls - DXF group 70 flag* to indicate closure : 0 = open, 1 = closed
(setq exv (trans (list 0 0 1) 1 0 T))
(entmakex (append (list (cons 0 "LWPOLYLINE")
(cons 38 (caddr (trans (car lst) 1 exv)))
(cons 100 "AcDbEntity")
(cons 100 "AcDbPolyline")
(cons 90 (length lst))
(cons 70 cls)
(cons 210 exv))
(mapcar '(lambda (p) (cons 10 (trans p 1 exv))) lst)))
)
Можно ли используя только данный код добавить в полилинию арочные сегменты?
Или по другому: как добавить в полилинию арочные сегменты не используя VLA объекты?
МишаИнженер вне форума  
 
Непрочитано 07.04.2023, 09:51
1 | #38
VVA

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


В этой функции нет. Там нужно использовать понятие кривизны (bulge, dxf группа 42) Polyline Bulges
Функции для работы с кривизной можно взять у Lee Mac'a Bulge Conversion Functions
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 07.04.2023, 09:58
#39
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Сделал функцию которая создает LWполилнию из списка точек SpPt и списка радиусов дуг SpArc. Вызывается функция следующим образом:
Код:
[Выделить все]
      
      (setq SpPt (list pt1 pt2 pt3 pt4 pt5 pt6 pt7 pt8 pt9 pt10 pt11 pt12 pt13 pt14 pt15 pt16))
      (setq SpArc (list (list 3 (- rd1)) (list 5 (- rd1)) (list 11 (- rd1)) (list 13 (- rd1))))
      (LWPoly SpPt SpArc 1)
Функция не использует функции Visual-Lisp потому что использование (vl-load-com) приводит к торможению компьютера, так как нет функций выгрузки этих функций после их использования.
Сама функция такая:


Код:
[Выделить все]
   (defun LWPoly (lstPt lstArc cls / SpPt pt1b pt2b rArc L05 i j)
  ; Draw lwpolyline in current UCS
  ; version for pre-visual lisp.
  ; lstPt - list of points ((X1 Y1)(X2 Y2) ... (Xn Yn)) in current UCS
  ; lstArc - list or rArc ((NumPi rArci) ... NumPn rArcn)) in current UCS
  ; cls - DXF group 70 flag* to indicate closure : 0 = open, 1 = closed
  ; Сформируем список точек прямолинейной полилинии
	      
        (setq SpPt (mapcar '(lambda (x) (cons 10 x)) lstPt))
    
    ;Добавим в полученный список данные об арочных сегментах
        (foreach lst lstArc 
            (progn
            (setq ni (- (car lst) 1))
            (setq nj (+ ni 1))
            (if (= nj (length lstPt)) (setq nj 0))
	      
            (setq pt1b (nth ni lstPt))
            (setq pt2b (nth nj lstPt))
            (setq rArc (cadr lst))

            (setq L05 (/ (distance pt1b pt2b) 2))
            (setq hkat (sqrt (- (* rArc rArc) (* L05 L05))))
            (setq blg (tan (/ (* 2 (arcsin (/ hkat rArc))) 4)))

            (setq SpPt (append (reverse (member (cons 10 pt1b) (reverse SpPt)))
                              (list (cons 42 blg))
                              (cdr (member (cons 10 pt1b) SpPt))))
	      
               );_ end of progn
        );_ end of foreach
;Создадим определение LWПолилинии в DXF кодах
    	(entmakex (append (list
        (cons 0 "LWPOLYLINE")
        (cons 100 "AcDbEntity")
        (cons 100 "AcDbPolyline")
        (cons 90 (length lstPt))
        (cons 70 cls))
        SpPt))
    ) ;_ end of defun
  
	(defun tan ( x ) (if (not (equal 0.0 (cos x) 1e-10))  (/ (sin x) (cos x))))
	(defun arcsin (x) (* 2.0 (atan (/ x (+ 1 (sqrt (- 1 (* x x))))))))
Файлы с отладочной и без отладочной информации смотрите в приложении
Вложения
Тип файла: lsp LWPolyLine_EM.lsp (1.9 Кб, 15 просмотров)
Тип файла: lsp LWPolyLine_EM (debug).lsp (2.9 Кб, 15 просмотров)

Последний раз редактировалось МишаИнженер, 07.04.2023 в 16:05.
МишаИнженер вне форума  
 
Непрочитано 08.04.2023, 11:59
#40
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


Цитата:
... что использование (vl-load-com) приводит к торможению компьютера...
Правда, что ли? И насколько оно критично?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > нарисовать полилинию из списка с координатами точек (lisp)

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP - 2D полилинию в 3D Andrej LISP 22 25.04.2019 11:40
Как с помощью LISP нарисовать окно линиями? Aндрeй LISP 13 24.06.2011 14:37
Как имея массив точек создать полилинию по ним? emilko AutoCAD 9 19.06.2009 23:15
Lisp: Обработка объектов и получение списка свойств (координаты точек) Nanotronic LISP 2 23.04.2009 23:07
нарисовать полилинию и запустить макрос VBA gizmo_zx Программирование 8 24.12.2008 08:47