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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > vla-GetBoundingBox

vla-GetBoundingBox

Закрытая тема
Поиск в этой теме
Непрочитано 24.10.2007, 17:05
vla-GetBoundingBox
DY
 
Москва
Регистрация: 21.12.2006
Сообщений: 110

Код:
[Выделить все]
 
(setq B (vlax-ename->vla-object (car(entsel))))
(vla-GetBoundingBox B 'minp 'maxp)
(print (vlax-safearray->list minp))
Почему выдает результат как
(17.287 164.327 -1.0e-008) (17.287 164.327 -1.0e-008)

вместо
(17.287 164.327 -1.0e-008)

Так и должно быть???

И еще один вопрос:
vla-GetBoundingBox для одного объекта
а есть ли аналог vla-GetBoundingBox для списка объектов?

Спасибо.
Просмотров: 8600
 
Непрочитано 23.01.2017, 09:32
#21
Profan


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
trir, Profan, вы про что?
Не знаю, я наугад ляпнул про то, что мне доступно.
А вообще, мне бы хотелось увидеть рабочий вариант кода, а не теоретические выкладки. Я, все-таки, не инженер Lisp.
Profan вне форума  
 
Непрочитано 23.01.2017, 12:46
#22
skkkk


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


Цитата:
Сообщение от Profan Посмотреть сообщение
Имеется несколько разных объектов, в том числе и повернутый блок. Необходимо построить габаритный прямоугольник для всех этих объектов.
Как это корректно выполнить?
Selection Set Bounding Box?
Правда, с повернутым блоком тот же "плохой" результат.

Последний раз редактировалось skkkk, 23.01.2017 в 12:52.
skkkk вне форума  
 
Непрочитано 23.01.2017, 22:30
#23
VVA

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


Profan, skkkk, Пока проверить нет возможноти. Попробуйте ф-цию LM:blockreferenceboundingbox отсюда Justify Block Base Point
Код:
[Выделить все]
;; Block Reference Bounding Box  -  Lee Mac
;; Returns a WCS point list describing a rectangular frame bounding all geometry of a supplied block reference.
;; Excludes Text, MText & Attribute Definitions.
;; ref - [vla] Block Reference Object
 (defun LM:blockreferenceboundingbox ( ref )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 23.01.2017, 23:27
#24
skkkk


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


VVA, результат - красный прямоугольник. По-моему, это не то, что нужно Profan'у. Насколько я понял, он хочет ортогональный boundingbox.
Миниатюры
Нажмите на изображение для увеличения
Название: Контур.PNG
Просмотров: 43
Размер:	17.4 Кб
ID:	182456  

Последний раз редактировалось skkkk, 24.01.2017 в 01:53. Причина: Добавил вложение
skkkk вне форума  
 
Непрочитано 24.01.2017, 03:36
#25
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


В общем надо размяться (на автолиспе давно не писал - так что если вдруг - не ругайте сильно).
Код:
[Выделить все]
 (vl-load-com)
(defun block-bound-box(ent / minpt maxpt)
  ((lambda (ent-ob)
     (if (= (cdr (assoc 0 (entget (car ent-ob)))) "INSERT")
         ((lambda (lst-ob)
            ((lambda (lst-minpt-maxpt)
               (mapcar 'vla-delete lst-ob)
               ((lambda (lst-minpt lst-maxpt)
                  (cons (list (apply 'min (mapcar 'car lst-minpt))
                              (apply 'min (mapcar 'cadr lst-minpt))
                              0.0)
                        (list (apply 'max (mapcar 'car lst-maxpt))
                              (apply 'max (mapcar 'cadr lst-maxpt))
                              0.0)))
                (mapcar 'car lst-minpt-maxpt)
                (mapcar 'cdr lst-minpt-maxpt)))
             (mapcar 'block-bound-box lst-ob)))
          (vlax-safearray->list (vlax-variant-value (vla-explode (cdr ent-ob)))))
         (progn (vla-getboundingbox (cdr ent-ob) 'minpt 'maxpt)
                (cons (vlax-safearray->list minpt) (vlax-safearray->list maxpt)))))
   (if (= (type ent) 'ename)
       (cons ent (vlax-ename->vla-object ent))
       (cons (vlax-vla-object->ename ent) ent))))
Пример вызова (block-bound-box (entlast)) - Возвращает пару (minPt . maxPt)
Для проверки:
Код:
[Выделить все]
 (defun test-bound (pt1-pt2)
  (entmakex (list '(0 . "LINE") (cons 10 (car pt1-pt2)) (cons 11 (cdr pt1-pt2)))))
Вызов что-то вроде (test-bound (block-bound-box (car (entsel))))

з.ы. - как далее вспомнил Крыс - с внешними ссылками работать не будет.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 24.01.2017 в 09:05.
Дима_ вне форума  
 
Непрочитано 24.01.2017, 08:36
#26
Кулик Алексей aka kpblc
Moderator

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


Дима_, внешнюю ссылку не расколотишь
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.01.2017, 08:52
#27
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Почему? Не проверял - она-же вроде как обычный "insert"
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 24.01.2017, 08:55
#28
Кулик Алексей aka kpblc
Moderator

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


Насколько я помню (сейчас проверять лениво), у нее метод explode не срабатывает. И, кстати, не должен
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.01.2017, 09:02
#29
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


А точно - было такое - ну значит - НЕ СРАБОТАЕТ (по крайней мере в старых версиях точно) - кто хочет может добавить расширенную версию.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 24.01.2017, 09:30
#30
Profan


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
VVA, результат - красный прямоугольник. По-моему, это не то, что нужно Profan'у. Насколько я понял, он хочет ортогональный boundingbox.
Программу Lee Mac я тоже пробовал.
Но skkkk прав. Это не то, что нужно, хотя программа интересная. Нужен для начала действительно ортогональный габарит. А в реальности нужен габарит под произвольным (задаваемым) углом к осям координат. Когда я искал решение, я как раз и натолкнулся на эту проблему с повернутым блоком.
А почему тут всплыли внешние ссылки?
Дима_, твоя программа выдает список координат в виде
((3758.36 777.809 0.0) 4154.0 1173.44 0.0)
а это неправильно.
Profan вне форума  
 
Непрочитано 24.01.2017, 09:40
#31
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Почему неправильно? Она не выдает список координат - она выдает пару (car и cdr) из координат.
Ну если хотите список (хотя в моем понимании здесь он как раз не является правильным) - в строках 9,20 меняем cons на list, в строке 16 cdr на cadr.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 24.01.2017, 10:46
#32
Profan


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


Ну, понятно, это ты под себя делал, функциями. Я-то хочу увидеть габарит.
Вот при таком варианте функции
Код:
[Выделить все]
(defun test-bound (pt1-pt2)
(entmakex (list '(0 . "LINE") (cons 10 (setq gpt1 (car pt1-pt2))) (cons 11 (setq gpt2 (cdr pt1-pt2)))))
(vl-cmdf "_RECTANG" gpt1 gpt2)
)
я этот габарит увидел. И похоже, что это как раз то, что нужно.
Спасибо.
Команду для пользователей сварганю сам

----- добавлено через ~1 ч. -----
Вот окончательный вариант программы построения габаритного контура для нескольких объектов под заданным углом:
Код:
[Выделить все]
;;; Повернутый габарит нескольких объектов
;;; Используются функции от Дима_
;;; http://forum.dwg.ru/showthread.php?t=14437
(defun C:ГНО ( / echo ss tvs ugol rbl gpt1 gpt2) 
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq ss (ssget))
(princ "\nУкажите базовую точку: ")
(vl-cmdf "_-BLOCK" "BBOX" pause ss "")
(setq tvs (getvar "LASTPOINT"))
(vl-cmdf "_-INSERT" "BBOX" tvs "1" "1" "0")
(initget 1)
(setq ugol (getreal "\nУгол поворота: "))
(vl-cmdf "_ROTATE" "_L" "" tvs ugol)
(setq rbl (entlast))
;;; Функции от Дима_
(defun block-bound-box(ent / minpt maxpt)
  ((lambda (ent-ob)
     (if (= (cdr (assoc 0 (entget (car ent-ob)))) "INSERT")
         ((lambda (lst-ob)
            ((lambda (lst-minpt-maxpt)
               (mapcar 'vla-delete lst-ob)
               ((lambda (lst-minpt lst-maxpt)
                  (cons (list (apply 'min (mapcar 'car lst-minpt))
                              (apply 'min (mapcar 'cadr lst-minpt))
                              0.0)
                        (list (apply 'max (mapcar 'car lst-maxpt))
                              (apply 'max (mapcar 'cadr lst-maxpt))
                              0.0)))
                (mapcar 'car lst-minpt-maxpt)
                (mapcar 'cdr lst-minpt-maxpt)))
             (mapcar 'block-bound-box lst-ob)))
          (vlax-safearray->list (vlax-variant-value (vla-explode (cdr ent-ob)))))
         (progn (vla-getboundingbox (cdr ent-ob) 'minpt 'maxpt)
                (cons (vlax-safearray->list minpt) (vlax-safearray->list maxpt)))))
   (if (= (type ent) 'ename)
       (cons ent (vlax-ename->vla-object ent))
       (cons (vlax-vla-object->ename ent) ent)))
)
(defun test-bound (pt1-pt2)
(setq gpt1 (car pt1-pt2) gpt2 (cdr pt1-pt2))
(vl-cmdf "_RECTANG" "_none" gpt1 "_none" gpt2)
(setq rect (entlast))
)
(test-bound (block-bound-box rbl))
;;;
(vl-cmdf "_ROTATE" rbl rect "" tvs (- 0 ugol))
(vl-cmdf "_EXPLODE" rbl)
(vl-cmdf "_-PURGE" "_B" "" "_N")
(princ "\n\nГабарит построен")
(setvar "CMDECHO" echo)
(princ)
)

Последний раз редактировалось Profan, 24.01.2017 в 12:15.
Profan вне форума  
 
Непрочитано 24.01.2017, 12:26
#33
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Я вот никак не могу понять почему вместо
Код:
[Выделить все]
 (setq gpt1 (car pt1-pt2) gpt2 (cdr pt1-pt2))
(vl-cmdf "_RECTANG" "_none" gpt1 "_none" gpt2)
не написать
Код:
[Выделить все]
 (vl-cmdf "_RECTANG" "_none" (car pt1-pt2) "_none" (cdr pt1-pt2))
Вы же нигде и никогда их использовать больше не будете???
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 24.01.2017, 12:33
#34
Profan


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


Умом Profana не понять. Это же только первый вариант, тут можно еще что-нибудь наоптимизировать. Может, кто-нибудь еще что-нибудь сочинит. Попроще, без нагромождения функций.
А вообще некоторые здесь любят писать: "Не проверял", "Делал на коленке" и т.д. и т.п.
Profan вне форума  
 
Непрочитано 26.01.2017, 10:42
#35
Profan


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


Вариант без указания базовой точки:
Код:
[Выделить все]
;;; Построение габаритного контура нескольких объектов под заданным углом
;;; Используются функции от Lee Mac http://www.lee-mac.com/ssboundingbox.html
;;; и Дима_ http://forum.dwg.ru/showthread.php?t=14437
;;; ГНОБ - Габарит Нескольких ОБъектов
(defun C:ГНОБ ( / echo sel idx obj ls1 ls2 ptrot ugol rbl gpt1 gpt2) 
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq sel (ssget))
;;; Функции от Lee Mac
(repeat (setq idx (sslength sel))
        (setq obj (vlax-ename->vla-object (ssname sel (setq idx (1- idx)))))
        (if (and (vlax-method-applicable-p obj 'getboundingbox)
                 (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-getboundingbox (list obj 'llp 'urp))))
            )
            (setq ls1 (mapcar 'min (vlax-safearray->list llp) (cond (ls1) ((vlax-safearray->list llp))))
                  ls2 (mapcar 'max (vlax-safearray->list urp) (cond (ls2) ((vlax-safearray->list urp))))
            )
        )
)
;;;
(setq ptrot (list (/ (+ (nth 0 ls2) (nth 0 ls1)) 2) (/ (+ (nth 1 ls2) (nth 1 ls1)) 2)))
(vl-cmdf "_-BLOCK" "BBOX" ptrot sel "")
(vl-cmdf "_-INSERT" "BBOX" ptrot "1" "1" "0")
(initget 1)
(setq ugol (getreal "\nУгол поворота: "))
(vl-cmdf "_ROTATE" "_L" "" ptrot ugol)
(setq rbl (entlast))
;;; Функции от Дима_
(defun block-bound-box(ent / minpt maxpt)
  ((lambda (ent-ob)
     (if (= (cdr (assoc 0 (entget (car ent-ob)))) "INSERT")
         ((lambda (lst-ob)
            ((lambda (lst-minpt-maxpt)
               (mapcar 'vla-delete lst-ob)
               ((lambda (lst-minpt lst-maxpt)
                  (cons (list (apply 'min (mapcar 'car lst-minpt))
                              (apply 'min (mapcar 'cadr lst-minpt))
                              0.0)
                        (list (apply 'max (mapcar 'car lst-maxpt))
                              (apply 'max (mapcar 'cadr lst-maxpt))
                              0.0)))
                (mapcar 'car lst-minpt-maxpt)
                (mapcar 'cdr lst-minpt-maxpt)))
             (mapcar 'block-bound-box lst-ob)))
          (vlax-safearray->list (vlax-variant-value (vla-explode (cdr ent-ob)))))
         (progn (vla-getboundingbox (cdr ent-ob) 'minpt 'maxpt)
                (cons (vlax-safearray->list minpt) (vlax-safearray->list maxpt)))))
   (if (= (type ent) 'ename)
       (cons ent (vlax-ename->vla-object ent))
       (cons (vlax-vla-object->ename ent) ent)))
)
(defun test-bound (pt1-pt2)
(setq gpt1 (car pt1-pt2) gpt2 (cdr pt1-pt2))
(vl-cmdf "_RECTANG" "_none" gpt1 "_none" gpt2)
(setq rect (entlast))
)
(test-bound (block-bound-box rbl))
;;;
(vl-cmdf "_ROTATE" rbl rect "" ptrot (- 0 ugol))
(vl-cmdf "_EXPLODE" rbl)
(vl-cmdf "_-PURGE" "_B" "" "_N")
(princ "\n\nГабарит построен")
(setvar "CMDECHO" echo)
(princ)
)
Profan вне форума  
Закрытая тема
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > vla-GetBoundingBox

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как по координатам из метода GetBoundingBox уменьшить размер disintegrator Программирование 8 26.10.2005 23:35