Динамические блоки и разные масштабы

Понадобилось мне тут поработать с динамическими блоками с разными масштабами по разным осям. Интереснейшие вещи выяснились!

Создаем элементарный дин.блок, с одним линейным параметром растяжения (например, с именем Distance1 - это сейчас не критично). Вставляем этот блок, например, в пространство модели и выполняем следующий код:

1
2
3
4
5
6
7
8
9
10
11
_$ (setq blk (vlax-ename->vla-object (car (entsel))))
#<VLA-OBJECT IAcadBlockReference 000000008ecfadc8>
_$ (vlax-dump-Object blk)
; IAcadBlockReference: AutoCAD Block Reference Interface
<...>
;   XEffectiveScaleFactor = 1.0
;   XScaleFactor = 1.0
;   YEffectiveScaleFactor = 1.0
;   YScaleFactor = 1.0
;   ZEffectiveScaleFactor = 1.0
;   ZScaleFactor = 1.0

И получим у него значения дин.параметров:

1
2
3
4
5
6
7
_$ (mapcar '(lambda (x) (cons (vla-get-propertyname x) (vlax-variant-value (vla-get-value x))))
        (vl-remove-if-not
          '(lambda (x) (wcmatch (strcase (vla-get-propertyname x)) "D*1"))
          (vlax-safearray->list (vlax-variant-value (vla-getdynamicblockproperties blk)))
          ) ;_ end of vl-remove-if-not
        ) ;_ end of mapcar
(("Distance1" . 100.0))

А теперь вручную поменяем масштабы с 1 на 2 - по всем осям:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
_$ (vlax-dump-Object blk)
; IAcadBlockReference: AutoCAD Block Reference Interface
<...>
;   XEffectiveScaleFactor = 2.0
;   XScaleFactor = 2.0
;   YEffectiveScaleFactor = 2.0
;   YScaleFactor = 2.0
;   ZEffectiveScaleFactor = 2.0
;   ZScaleFactor = 2.0
T
_$ (mapcar '(lambda (x) (cons (vla-get-propertyname x) (vlax-variant-value (vla-get-value x))))
        (vl-remove-if-not
          '(lambda (x) (wcmatch (strcase (vla-get-propertyname x)) "D*1"))
          (vlax-safearray->list (vlax-variant-value (vla-getdynamicblockproperties blk)))
          ) ;_ end of vl-remove-if-not
        ) ;_ end of mapcar
(("Distance1" . 200.0))

О как! Значение параметра возвращается умноженным на коэффициент масштабирования!

А теперь включим "обезьяну с гранатой" и поставим разные коэффициенты по разным осям. Плевать, что пропадут ручки - нам не это сейчас интересно:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
_$ (vlax-dump-Object blk)
; IAcadBlockReference: AutoCAD Block Reference Interface
<...>
;   XEffectiveScaleFactor = 2.0
;   XScaleFactor = 2.0
;   YEffectiveScaleFactor = 10.0
;   YScaleFactor = 10.0
;   ZEffectiveScaleFactor = -20.0
;   ZScaleFactor = -20.0
T
_$ (mapcar '(lambda (x) (cons (vla-get-propertyname x) (vlax-variant-value (vla-get-value x))))
        (vl-remove-if-not
          '(lambda (x) (wcmatch (strcase (vla-get-propertyname x)) "D*1"))
          (vlax-safearray->list (vlax-variant-value (vla-getdynamicblockproperties blk)))
          ) ;_ end of vl-remove-if-not
        ) ;_ end of mapcar
(("Distance1" . 2000.0))

Получается, что ActiveX-механизм возвращает не реально установленное значение, а "установленное значение"*"максимальный по модулю масштаб вставки блока".

"Поймал" я это на линейных параметрах - но, подозреваю, аналогичные результаты могут быть и для перемещений. А уж что будет на угловых операциях - даже подумать страшно.



Поделитесь своим мнением


Я не робот.