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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP. Вытащить координаты прямоугольников и сложить в массив.

LISP. Вытащить координаты прямоугольников и сложить в массив.

Ответ
Поиск в этой теме
Непрочитано 10.12.2014, 13:48 #1
LISP. Вытащить координаты прямоугольников и сложить в массив.
SNIIP
 
Регистрация: 04.05.2010
Сообщений: 338

Язык: LISP. Автокад 2012. Понимаю, что легко нагуглить, но на работе доступ только форуму dwg, поэтому надеюсь на помощь...

Я спросил у пользователя выберите объекты: и он выбрал пусть 10 прямоугольников.
мне нужно из этого массива объектов сформировать список из координат верхнего левого и нижнего правого угла. друг за другом просто цифры...

Тут 2 строчки но блин не могу нагуглить (((

Последний раз редактировалось SNIIP, 10.12.2014 в 14:03.
Просмотров: 4989
 
Непрочитано 10.12.2014, 14:45
#2
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


Без проверок как-то так:
Код:
[Выделить все]
 
(defun _bound_lst (ss)
;;; Функция получения координат габаритных точек
;;; минимально левой и максимально правой
(defun _sensor_prim_sel ( ss typ)
;;; ss - набор в список VLA или ename примитивов
;;; Возврат:
;;; если typ nil, то ename, t - vla 
;;; список примитивов
  (setq primlst nil)
  (cond
    ( (not (eq (type ss) 'PICKSET))
      (princ "/nThis is not a PICKSET") nil
    )
    ( (setq primlst 
                    (repeat 
                      (setq item (sslength ss))
	                    (setq primlst (cons (ssname ss (setq item (1- item))) primlst))
	                  )
	    )
	    (if typ (mapcar 'vlax-ename->vla-object primlst) primlst)           
    )
  )
)

  (mapcar 
    (function 
      (lambda (x)
        (vla-GetBoundingBox x 'MinPt 'MaxPt)
        (list (vlax-safearray->list MinPt)(vlax-safearray->list MaxPt))
      )
    )
  (_sensor_prim_sel ss t))
)

Последний раз редактировалось roaa, 10.12.2014 в 14:52.
roaa вне форума  
 
Непрочитано 10.12.2014, 23:09
#3
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Цитата:
Сообщение от roaa Посмотреть сообщение
;;; минимально левой и максимально правой
А ему нужно "максимально левой и минимально правой".
Profan вне форума  
 
Непрочитано 11.12.2014, 01:37
#4
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


для начала определитесь что есть для вас прямоугольники... ну и не забываем про основы лиспа - car и cdr

Код:
[Выделить все]
 (list (car MinPt) (cadr MaxPt)) ; левый верхний
(list (car MaxPt) (cadr MinPt)) ; правый нижний
gomer вне форума  
 
Автор темы   Непрочитано 11.12.2014, 04:49
#5
SNIIP


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


пока разбирался нашел готовое решение на VB. ну т.к. знаю тольок лисп... попытаюсь свое доделать из спортивного интереса)))


Позже......

НЕ работает тот код на VB... выкладываю свой... рабочий... берешь, обрамляешь в прямоугольники чертежи... вводишь команду printser
и печатаются все прямоугольники
Вложения
Тип файла: zip Ленивая печать dnl12633.zip (81.1 Кб, 26 просмотров)
Тип файла: lsp Lisppechati.lsp (1.2 Кб, 34 просмотров)

Последний раз редактировалось SNIIP, 11.12.2014 в 08:41.
SNIIP вне форума  
 
Непрочитано 11.12.2014, 09:57
#6
Кулик Алексей aka kpblc
Moderator

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


Пока работа немного "подвисла", на коленке:
Код:
[Выделить все]
 (vl-load-com)

(defun test (/ selset)
  (if (= (type (setq selset (vl-catch-all-apply
                              (function
                                (lambda ()
                                  (ssget '((0 . "LWPOLYLINE")
                                           (90 . 4)
                                           (-4 . "<OR")
                                           (70 . 1)
                                           (70 . 129)
                                           (-4 . "OR>")
                                           )
                                         ) ;_ end of ssget
                                  ) ;_ end of lambda
                                ) ;_ end of function
                              ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
         'pickset
         ) ;_ end of =
    (progn
      (setq selset (apply (function append)
                          (mapcar
                            (function
                              (lambda (ent / _min _max)
                                (vla-getboundingbox (vlax-ename->vla-object ent) '_min '_max)
                                (list (vlax-safearray->list _min) (vlax-safearray->list _max))
                                ) ;_ end of lambda
                              ) ;_ end of function
                            ((lambda (/ tab item)
                               (repeat (setq tab  nil
                                             item (sslength selset)
                                             ) ;_ end setq
                                 (setq tab (cons (ssname selset (setq item (1- item))) tab))
                                 ) ;_ end of repeat
                               ) ;_ end of lambda
                             )
                            ) ;_ end of mapcar
                          ) ;_ end of apply
            ) ;_ end of setq
      (list (cons "min" (mapcar '(lambda (n) (apply 'min (mapcar '(lambda (x) (nth n x)) selset))) '(0 1 2)))
            (cons "max" (mapcar '(lambda (n) (apply 'max (mapcar '(lambda (x) (nth n x)) selset))) '(0 1 2)))
            ) ;_ end of list
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
----- добавлено через 46 сек. -----
Правда, на "прямоугольность" не проверяю - лениво
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.12.2014, 07:58
#7
SNIIP


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


Ну я вот сделал... все вроде работает... (взял и первого поста функцию и командными методами разбавил). С точки зрения программирования не очень но мне пойдет... вот печатал дня 3... потом вдруг раз и в 1 файле не печатает(прикрепляю его).. вернее почему то все координаты смещает... В чем косяк может быть? привязка не причем.. отключал... включал...


з.ы. А кстати... если я не писал для чего это... обводим чертежи прямоугольниками, потом выбираем их все... нажимаем лисп... и все выводится на печать...
Вложения
Тип файла: lsp Lisppechati.lsp (1.2 Кб, 20 просмотров)
Тип файла: dwg
DWG 2007
Пожрезервуар+трасса_канализации.dwg (876.8 Кб, 1059 просмотров)
SNIIP вне форума  
 
Непрочитано 15.12.2014, 11:26
#8
baksconstructor


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


Цитата:
Сообщение от SNIIP Посмотреть сообщение
В чем косяк может быть? привязка не причем.. отключал... включал...
Может быть найдёте ответ здесь - Пакетная печать множества рамок (форматов) из пространства модели. , проанализируете существующее и может найдёте (я в лиспе не понимаю).
baksconstructor вне форума  
 
Автор темы   Непрочитано 15.12.2014, 12:16
#9
SNIIP


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


даа... обидно что эту тему не нашел раньше... но все же охота чвой добить.. принаровился к нему я..
Да и хорошо работает, кроме одного файла... не могу понять почему именно в нем координаты слетают и прямоугольники берутся вообще с других мест...
SNIIP вне форума  
 
Непрочитано 15.12.2014, 12:35
1 | #10
Кулик Алексей aka kpblc
Moderator

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


Систему координат проверяй
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.12.2014, 12:37
#11
baksconstructor


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


Цитата:
Сообщение от SNIIP Посмотреть сообщение
не могу понять почему именно в нем координаты слетают и прямоугольники берутся вообще с других мест...
Почему слетают не знаю, но если послать на печать вариантом №1, а потом сохранить файл то эта ошибка исчезнет.
baksconstructor вне форума  
 
Автор темы   Непрочитано 15.12.2014, 13:41
#12
SNIIP


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


Алексей прав... в непечатаемых файлах ПСК сбитая стояла, СПАСИБО)

----- добавлено через ~21 ч. -----
АХ вот не тут то было) Начали использовать в отделе... у всех нормально а у одного сотрудника на этой строчке:
Код:
[Выделить все]
(if typ (mapcar 'vlax-ename->vla-object primlst) primlst)
вылетает: ошибка: no function defenition

Я так понимаю это ошибка - на его компе что не так, т.к. у остальных работает... в чем дело?

----- добавлено через ~23 ч. -----
а может это быть из за отсутствия (vl-load-com) в первом посте??
почему тогда у остальных работает?
SNIIP вне форума  
 
Непрочитано 18.12.2014, 20:16
#13
skkkk


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


Цитата:
Сообщение от SNIIP Посмотреть сообщение
почему тогда у остальных работает?
У остальных (vl-load-com) есть в каком-либо лиспе в автозагрузке, например, или эта строчка прописана в acaddoc20XX.lsp.
skkkk вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP. Вытащить координаты прямоугольников и сложить в массив.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите вытащить из полилинии все координаты вершин Zaghim Программирование 20 29.08.2021 17:43
Как из AutoCAD вытащить координаты высотных отметок в формат txt? NataliyaGo AutoCAD 6 05.09.2017 16:51
Линии электрических соединений Shoorup Программирование 23 07.02.2015 15:13
Как вытащить координаты 3dface в VBA swell{d} Программирование 4 13.03.2013 14:38
Как из готового чертежа вытащить координаты точек? АлександрМихайлович Программирование 1 23.05.2005 08:29