Динамические блоки и разные масштабы
Понадобилось мне тут поработать с динамическими блоками с разными масштабами по разным осям. Интереснейшие вещи выяснились!
Создаем элементарный дин.блок, с одним линейным параметром растяжения (например, с именем 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-механизм возвращает не реально установленное значение, а "установленное значение"*"максимальный по модулю масштаб вставки блока".
"Поймал" я это на линейных параметрах - но, подозреваю, аналогичные результаты могут быть и для перемещений. А уж что будет на угловых операциях - даже подумать страшно.