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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp/ActiveX Как найти габариты (длину ширину и высоту) блока.

Lisp/ActiveX Как найти габариты (длину ширину и высоту) блока.

Ответ
Поиск в этой теме
Непрочитано 07.10.2013, 16:52 #1
Lisp/ActiveX Как найти габариты (длину ширину и высоту) блока.
Kirill_Ja
 
Мурманск
Регистрация: 28.07.2008
Сообщений: 208

Доброго времени суток.
Вот есть у меня например вхождение блока. А могу - ли я как-нибудь узнать его габариты (длину, ширину, высоту) не расчленяя?
Самый простой пример этих габаритов - размер и положение углов видового экрана при выполнении команды показать все в редакторе блоков.
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения.
Просмотров: 2703
 
Непрочитано 07.10.2013, 16:53
#2
Кулик Алексей aka kpblc
Moderator

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


Можешь. vla-getboundingbox в руки.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.10.2013, 19:47
#3
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Если блок динамический, придется повозиться.
Самое простое - взрывать. Серьезно, без шуток. Программно расфигачить, пробежаться по габаритам "осколков" и удалить их. Могут быть проблемы только с атрибутами и вложенными блоками.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 07.10.2013, 20:55
#4
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Я знаю, что самое простое. Сам так делал.
А чем не угодили динамические блоки? Если нужны габариты конкретного вложения, мы сможем найти габариты некоего *U<номер> и все получится (в букве только точно не уверен).
Алексей спасибо.
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения.
Kirill_Ja вне форума  
 
Непрочитано 07.10.2013, 20:58
#5
Кулик Алексей aka kpblc
Moderator

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


А зачем быть "уверенным"? Если есть указатель на вхождение блока, его и подставляй.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 08.10.2013, 07:55
#6
AndruxaZ


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


Вот попробуй такой код
Код:
[Выделить все]
   (defun GetBoundingBox_dynblock (ent / lst min_point max_point)
    (setq ent (vlax-ename->vla-object ent))
    (vlax-for item
	      (vla-item	(vla-get-blocks
			  (vla-get-activedocument (vlax-get-acad-object))
			) ;_ end of vla-get-blocks
			(vla-get-name ent)
	      ) ;_ end of vla-item
      (if (equal (vla-get-visible item) :vlax-true)
	(setq lst (cons item lst))
      ) ;_ end of if
    ) ;_ end of vlax-for
    (setq lst	    (vl-remove
		      nil
		      (mapcar
			(function
			  (lambda (x / minp maxp)
			    (if	(not (vl-catch-all-error-p
				       (vl-catch-all-apply
					 (function
					   (lambda ()
					     (vla-getboundingbox x 'minp 'maxp)
					   ) ;_ end of lambda
					 ) ;_ end of function
				       ) ;_ end of vl-catch-all-apply
				     ) ;_ end of vl-catch-all-error-p
				) ;_ end of not
			      (list (cons "min" (vlax-safearray->list minp))
				    (cons "max" (vlax-safearray->list maxp))
			      ) ;_ end of list
			    ) ;_ end of if
			  ) ;_ end of lambda
			) ;_ end of function
			lst
		      ) ;_ end of mapcar
		    ) ;_ end of vl-remove
	  min_point (mapcar
		      (function +)
		      (mapcar
			(function
			  (lambda (f)
			    (apply
			      (function min)
			      (mapcar f
				      (mapcar
					(function
					  (lambda (x) (cdr (assoc "min" x)))
					) ;_ end of function
					lst
				      ) ;_ end of mapcar
			      ) ;_ end of mapcar
			    ) ;_ end of apply
			  ) ;_ end of lambda
			) ;_ end of function
			(list 'car 'cadr 'caddr)
		      ) ;_ end of mapcar
		      (vlax-safearray->list
			(vlax-variant-value (vla-get-insertionpoint ent))
		      ) ;_ end of vlax-safearray->list
		    ) ;_ end of mapcar
	  max_point (mapcar
		      (function +)
		      (mapcar
			(function
			  (lambda (f)
			    (apply
			      (function max)
			      (mapcar f
				      (mapcar
					(function
					  (lambda (x) (cdr (assoc "max" x)))
					) ;_ end of function
					lst
				      ) ;_ end of mapcar
			      ) ;_ end of mapcar
			    ) ;_ end of apply
			  ) ;_ end of lambda
			) ;_ end of function
			(list 'car 'cadr 'caddr)
		      ) ;_ end of mapcar
		      (vlax-safearray->list
			(vlax-variant-value (vla-get-insertionpoint ent))
		      ) ;_ end of vlax-safearray->list
		    ) ;_ end of mapcar
	  lst	    (list min_point max_point)
    ) ;_ end of setq
  ) ;_ end of defun



  
AndruxaZ вне форума  
 
Непрочитано 08.10.2013, 19:49
#7
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Насколько я помню, этот код для идеальных блоков - не масштабированных, не повернутых и без атрибутов.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 09.10.2013, 12:59
#8
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Такой и требовался))) Потом используя пары 210 и 10 (начальная точка + положение блока в пространстве) можно найти например центр блока, чтобы его, скажем, подписать на чертеже.
Особенно приятно, когда все это мракобесие в изометрии и названия блоков и их лицевая их сторона указываются автоматически.
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения.
Kirill_Ja вне форума  
 
Непрочитано 14.10.2013, 17:55
#9
roaa

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


С учетом масштаба:

Код:
[Выделить все]
 (defun _sensor_name_blk_count (_name_blk _scale / _ins_point _blk _minpt _maxpt)

;;; функция определения габаритов блока по его имени 
;;; _name_blk - имя блока
;;; _scale - масштаб блока
;;; возвращает список (<имя> (<длина> . <высота>)) , иначе - nil

  (if (tblsearch "BLOCK" _name_blk)
    (progn
      (setq _ins_point (list
                         (+
                           (car (getvar "VSMAX"))
                           (* 2 (max (atof _scale) (atoi _scale)))
                         ) ;_ end +
                         (+
                           (cadr (getvar "VSMAX"))
                           (* 2 (max (atof _scale) (atoi _scale)))
                         ) ;_ end +
                         0.0
                       ) ;_ end list
            _blk       (vla-insertblock               
                         (if
                           (= (vla-get-activespace (vla-get-activedocument (vlax-get-acad-object))) 1)
                           (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
                           (vla-get-paperspace (vla-get-activedocument (vlax-get-acad-object)))
                         ) ;_ end if
                         (vlax-3d-point _ins_point)
                         _name_blk
                         (atof _scale)
                         (atof _scale)
                         (atof _scale)
                         "0"
                       ) ;_ end vla-InsertBlock
      ) ;_ end setq
      (if
        (and
          _blk
          (vlax-property-available-p _blk 'hasattributes)
          (= :vlax-true (vla-get-hasattributes _blk))
        ) ;_ end and
         (mapcar '(lambda (_tag) (vla-put-textstring _tag ""))
                 (vlax-invoke _blk 'getattributes)
         ) ;_ end mapcar
      ) ;_ end if
      (vla-getboundingbox _blk 'minpt 'maxpt)
      (setq _minpt (vlax-safearray->list minpt)
            _maxpt (vlax-safearray->list maxpt)
            _count (list
                     (vla-get-effectivename _blk)
                     (cons
                       (- (nth 0 _maxpt) (nth 0 _minpt))
                       (- (nth 1 _maxpt) (nth 1 _minpt))
                     ) ;_ end cons
                   ) ;_ end list
      ) ;_ end setq
      (vla-erase _blk)
      _count
    ) ;_ end progn
    (progn
      (princ "\nБлок не найден")
      nil
    ) ;_ end progn
  ) ;_ end if
) ;_ end defun
roaa вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp/ActiveX Как найти габариты (длину ширину и высоту) блока.

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с базовой точкой блока и вхождением блока в DXF nogaems Программирование 5 29.08.2013 15:46
Экскаватор ЭО 4125 подскажите габаритные размеры. Длину, ширину, высоту Оля Ермакова Поиск литературы, чертежей, моделей и прочих материалов 0 16.05.2013 23:45
Как найти имя предка анонимного блока. Kirill_Ja Программирование 4 16.04.2013 17:33
Как менять ширину и высоту параметрически ractangle? Lопух AutoCAD 6 06.11.2007 15:32