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

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

vla-GetBoundingBox

Закрытая тема
Поиск в этой теме
Непрочитано 24.10.2007, 17:05 #1
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 для списка объектов?

Спасибо.
Просмотров: 8590
 
Непрочитано 24.10.2007, 17:39
#2
VVA

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


1.Так лучше?
Код:
[Выделить все]
(setq B (vlax-ename->vla-object (car(entsel))))
(vla-GetBoundingBox B 'minp 'maxp)
(print (vlax-safearray->list minp))(princ)
Найди 1 отличие.
2. На почившем в бозе autocad.ru Евгений Елпанов выкладывал такую ф-цию.
Код:
[Выделить все]
;|
;**************** lst-getboundingbox.lsp *************
;   Функция    определения габаритного контейнера
;   для списка VLA объектов
;   Автор  Евгений Елпанов.
;*****************************************************
;   Аргумент lst - список VLA объектов
;   пример получения списка с использованием (ssget) :
(if (setq sset (ssget))
 (setq lst
       (mapcar
        (function vlax-ename->vla-object)
        (vl-remove-if
         (function listp)
         (mapcar (function cadr) (ssnamex sset))
        ) ;_ vl-remove-if
       ) ;_  mapcar
 ) ;_  setq
)
;   Пример вызова:
 (lst-getboundingbox lst)
;   Возвращает список из двух 3d точек
;   '((левая нижняя) (правая верхняя))
|;
;|=============================================================================
=============================================================================|;
(defun lst-getboundingbox (lst / maxp minp)
  (vl-load-com)
  (if (and lst (listp lst))
    (apply
      (function
 (lambda (a1 a2 a3 a4 a5 a6)
   (list
     (list
       (apply (function min) a1)
       (apply (function min) a2)
       (apply (function min) a3)
       ) ;_ end of list
     (list
       (apply (function max) a4)
       (apply (function max) a5)
       (apply (function max) a6)
       ) ;_ end of list
     ) ;_ end of list
   ) ;_ end of lambda
 ) ;_ end of function
      (apply
 (function mapcar)
 (cons
   'list
   (mapcar
     (function
       (lambda (x)
  (vla-getboundingbox x 'minp 'maxp)
  (append
    (vlax-safearray->list minp)
    (vlax-safearray->list maxp)
    ) ;_ end of append
  ) ;_ end of lambda
       ) ;_ end of function
     lst
     ) ;_ end of mapcar
   ) ;_ end of cons
 ) ;_ end of apply
      ) ;_ end of apply
    ) ;_ end of if
 
  ) ;_ end of defun
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 25.10.2007, 17:51
#3
DY


 
Регистрация: 21.12.2006
Москва
Сообщений: 110


Спасибо!

Хотя не могу "догнать" действие связки
(print (vlax-safearray->list minp))(princ)

Видимо вечер - устал...
DY вне форума  
 
Непрочитано 25.10.2007, 18:11
#4
VVA

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


Любая ф-ция автолиспа возвращает результат. Что-то типа зхо-вывода. А princ без аргументов печатает "пусто". Поэтому рекомендуется команды заканчивать (princ), чтобы не пугать пользователей, выполнивших команду чем-то типа
Цитата:
Выберите объект: #<VLA-OBJECT IAcadLine 13874804>
Т.е. (print (vlax-safearray->list minp)) печатает координаты и возвращает их же в качестве эхо-вывода. Вот и получается дубляж
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 25.10.2007, 21:01
#5
DY


 
Регистрация: 21.12.2006
Москва
Сообщений: 110


Да уж...
Это не паскаль и Дельфи. Что то туговато мне этот LISP дается - не всегда логику действий понимаю. Хотя надо признать, в чем-то он проще не куда.
DY вне форума  
 
Непрочитано 26.10.2007, 06:29
#6
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от DY Посмотреть сообщение
Да уж...
Это не паскаль и Дельфи. Что то туговато мне этот LISP дается - не всегда логику действий понимаю. Хотя надо признать, в чем-то он проще не куда.
Да уж. Не Pascal. Это совершенно иная "религия" - функциональный язык. Но после понимания логики, а этого можно достичь и за час (как при обучении езде на велосипеде - никак не получалось, но вдруг поехал, и теперь уже на всю жизнь). Вот тогда можно использовать все преимущества LISP и удивляться, почему простые вещи в императивных языках приходится делать так сложно.

И в то же время не пытаться сделать на LISP то, что гораздо удобнее делать в Delphi.
ShaggyDoc вне форума  
 
Непрочитано 26.10.2007, 10:01
#7
VVA

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


Тяжело в начале, до тех пор, пока будешь себя ловить на том, что 1+1 хочешь записать как (1 + 1), а не (+ 1 1). Хотя надо признать, что работая с Автокадом и Лиспом с 1990 года, относительно недавно раскрыл для себя в полной мере потенциал функций lambda, mapcar и apply, в результате чего изменился стиль программирования и, наверное, я ближе стал к пониманию "Мира Лиспа". Хотя до таких колоссов как Michael Puckett далеко.
Если ты поймешь как работает этот пример, станешь на порядок ближе к пониманию сущности лиспа.
Код:
[Выделить все]
 
(apply 'mapcar (cons 'list '((1 4 7)(2 5 8)(3 6 9))))
В свое время я делал это пошагово с карандашом в руках.
Вот страничка Michael Puckett. Там много хороших примеров.
Удачи в освоении этого интересного языка.
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 19.09.2015 в 07:27.
VVA вне форума  
 
Непрочитано 26.10.2007, 10:23
#8
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от VVA Посмотреть сообщение
На почившем в бозе autocad.ru Евгений Елпанов выкладывал такую ф-цию...
При всём уважении к Евгению, выложенный код всёже несколько запутан. В качестве альтернативы, можно посмотреть более простой вариант реализации:
Код:
[Выделить все]
(defun demo (/ adoc asel maxlst maxpnt minlst minpnt)
    (setq adoc (vla-get-activedocument (vlax-get-acad-object))
          asel (vla-get-activeselectionset adoc)
    )
    (vla-clear asel)
    (pl:obj-select-on-screen asel "*")
    (vlax-for i asel
        (vla-getboundingbox i 'minpnt 'maxpnt)
        (setq minlst (cons (vlax-safearray->list minpnt) minlst)
              maxlst (cons (vlax-safearray->list maxpnt) maxlst)
        )
    )
    (list (apply (function mapcar) (cons (function min) minlst))
          (apply (function mapcar) (cons (function max) maxlst))
    )
)
(defun pl:obj-select-on-screen (sel enttype)
    (vla-selectonscreen
        sel
        (vlax-safearray-fill (vlax-make-safearray vlax-vbinteger '(0 . 0)) '(0))
        (vlax-safearray-fill (vlax-make-safearray vlax-vbvariant '(0 . 0)) (list enttype))
    )
)
(vl-load-com)
 
(demo)
Alaspher вне форума  
 
Непрочитано 26.10.2007, 10:35
#9
Кулик Алексей aka kpblc
Moderator

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


Безотносительно логики кода (она, как всегда, безупречна), вопрос: а asel не надо очищать? Я-то обычно иду через ssget....
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.10.2007, 10:40
#10
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755



После использования, вобщем - нет, можно и не очищать, если не предполагаются какие-то дальнейшие манипуляции, где потребуется пустой набор. Собственно и перед использованием, это скорее перестраховка, но просто уже привык так делать всегда, когда использую активный набор.
Alaspher вне форума  
 
Непрочитано 26.10.2007, 20:14
#11
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Безотносительно логики кода (она, как всегда, безупречна), вопрос: а asel не надо очищать?
Если ActiveSelectionSet обозначать правильно, т.е. ass, то строка
Код:
[Выделить все]
(if (> (vla-get-count ass) 0) (vla-clear ass))
пишется сама собой
Цитата:
Я-то обычно иду через ssget....
Из бессмертного: "В _______ (вписать нужное - армии, России, нашей фирме) все делается через ________ (вписать нужное - censed, censed, ssget).
Лентяй вне форума  
 
Непрочитано 22.01.2017, 10:55
#12
Profan


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


В результате работы функции (vla-GetBoundingBox) мы получаем 2 крайние точки габаритного контейнера. Но правильно ли мы трактуем эти точки, строя по ним прямоугольник?
Вот простейшая программа:
Код:
[Выделить все]
(defun C:BO ( / echo obj B pmin pmax) 
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq obj (car (entsel "\nВыберите объект: ")))
(setq B (vlax-ename->vla-object obj))
(vla-GetBoundingBox B 'minp 'maxp)
(setq pmin (vlax-safearray->list minp) pmax (vlax-safearray->list maxp))
(vl-cmdf "_RECTANG" pmin pmax)
(setvar "CMDECHO" echo)
(princ)
)
Во вложении простейший пример с блоком и полилинией. Получается странная картина. Если угол поворота блока не равен 0, то прямоугольник получается больше, чем в случае полилинии.
Почему так происходит?
Аналогичный результат происходит и при использовании приведенных в этой теме программ. Кстати, программа Alaspher вообще работает 1 или 2 раза и вырубается.
Миниатюры
Нажмите на изображение для увеличения
Название: test-box.jpg
Просмотров: 117
Размер:	16.5 Кб
ID:	182388  
Вложения
Тип файла: dwg
DWG 2010
test-box.dwg (101.1 Кб, 14 просмотров)

Последний раз редактировалось Profan, 23.01.2017 в 07:18.
Profan вне форума  
 
Непрочитано 22.01.2017, 19:45
#13
Дима_

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


Цитата:
Сообщение от Profan Посмотреть сообщение
Почему так происходит?
Для блока выдаются габариты повернутого габаритного контейнера, а не его содержимого.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 22.01.2017, 20:36
#14
Profan


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


Если эти операции произвести вручную: задать угол поворота блока = 0, получить габаритный прямоугольник, повернуть его на исходный угол и получить новый габаритный прямоугольник, то именно так и получается. (Неужели AutoCAD именно так и делает? И зачем?)
Но вот есть задача:
Имеется несколько разных объектов, в том числе и повернутый блок. Необходимо построить габаритный прямоугольник для всех этих объектов.
Как это корректно выполнить?
Profan вне форума  
 
Непрочитано 22.01.2017, 21:06
#15
Дима_

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


Самое простое - рекурсивно взорвать все вхождения блоков.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 22.01.2017, 21:20
#16
Profan


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


Видимо, так и придется сделать.
Profan вне форума  
 
Непрочитано 23.01.2017, 00:06
#17
trir


 
Регистрация: 18.12.2010
Сообщений: 5,051


Для слияния MBR - нужно просто найти минимальное и максимальное значение для каждой размерности
trir вне форума  
 
Непрочитано 23.01.2017, 07:32
#18
Profan


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


MBR - Master Boot Record (Главная Загрузочная Запись). Для слияния разделов на жестком диске я обычно использую Acrinis или Paragon. Эти программы сами показывают минимальные и максимальные размеры разделов.
Profan вне форума  
 
Непрочитано 23.01.2017, 08:52
#19
Кулик Алексей aka kpblc
Moderator

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


trir, Profan, вы про что?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.01.2017, 09:04
#20
trir


 
Регистрация: 18.12.2010
Сообщений: 5,051


Цитата:
Minimum bounding rectangle, also known as bounding box or envelope
Код:
[Выделить все]
        public void add(Rectangle r)
        {
            for (int i = 0; i < DIMENSIONS; i++)
            {
                if (r.min[i] < min[i])
                {
                    min[i] = r.min[i];
                }
                if (r.max[i] > max[i])
                {
                    max[i] = r.max[i];
                }
            }
        }
trir вне форума  
Закрытая тема
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > vla-GetBoundingBox

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

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


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