Получение и установка параметров динамических блоков
Автор: Кулик Алексей aka kpblc | Дата: 27 Июнь 2014 · 26 коммент.
Коды, опубликованные ниже, были сделаны аж в 2007 году (господи, сколько времени прошло!) и позволяют получить и установить значения параметров динамических блоков. Впервые было опубликовано, кажется, на форуме caduser.ru.
Для установки параметра используется функция _kpblc-change-dyn-block-prop. Код и ссылки для скачивания представлены ниже.
А для получения списка доступных параметров - эта:
_kpblc-get-dyn-block-list-prop-and-values
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | (defun _kpblc-get-dyn-block-list-prop-and-values (ent / res) ;| * Функция получения списка свойств и их возможных значений для дин.блока * Параметры вызова: * ent указатель на блок (vla-, ename или string). Строка воспринимается как хендл объекта. nil -> запрашивается у пользователя |; (vl-load-com) (vl-catch-all-apply '(lambda () (setq ent (cond (ent) (t (car (entsel "\nУкажите блок <Отмена> : "))) ) ;_ end of cond ) ;_ end of setq ) ;_ end of lambda ) ;_ end of vl-catch-all-apply (if (vl-catch-all-error-p (vl-catch-all-apply (function (lambda () (if (and (setq ent (cond ((= (type ent) 'ename) (vlax-ename->vla-object ent)) ((= (type ent) 'vla-object) ent) ((= (type ent) 'str) ((lambda (/ tmp) (vl-catch-all-apply '(lambda () (setq tmp (vla-handletoobject ent))) ) ;_ end of vl-catch-all-apply tmp ) ;_ end of lambda ) ) (t nil) ) ;_ end of cond ) ;_ end of setq (= (strcase (vla-get-objectname ent) t) "acdbblockreference") (= (vla-get-isdynamicblock (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)) ) ;_ end of vla-get-blocks (vla-get-effectivename ent) ) ;_ end of vla-item ) ;_ end of vla-get-isxref :vlax-true ) ;_ end of = ) ;_ end of and (setq res (mapcar '(lambda (x / еьз) (cons (vla-get-propertyname x) (if (vl-catch-all-error-p (vl-catch-all-apply '(lambda () (setq tmp (mapcar 'vlax-variant-value (vlax-safearray->list (vlax-variant-value (vla-get-allowedvalues x) ) ;_ end of vlax-variant-value ) ;_ end of vlax-safearray->list ) ;_ end of mapcar ) ;_ end of setq ) ;_ end of lambda ) ;_ end of vl-catch-all-apply ) ;_ end of vl-catch-all-error-p (list "Неиндексированное значение") tmp ) ;_ end of if ) ;_ end of cons ) ;_ end of lambda (vl-remove-if '(lambda (a) (= (strcase (vla-get-propertyname a)) "ORIGIN") ) ;_ end of lambda (vlax-safearray->list (vlax-variant-value (vla-getdynamicblockproperties ent) ) ;_ end of vlax-variant-value ) ;_ end of vlax-safearray->list ) ;_ end of vl-remove-if ) ;_ end of mapcar ) ;_ end of setq (princ "\nОшибка указания примитива") ) ;_ end of if ) ;_ end of lambda ) ;_ end of function ) ;_ end of vl-catch-all-apply ) ;_ end of vl-catch-all-error-p (princ (strcat "\nОшибка выполнения :: " (itoa (getvar "errno")))) ) ;_ end of if res ) ;_ end of defun |
_kpblc-get-dyn-block-list-prop-and-values.lsp
_kpblc-change-dyn-block-prop.lsp
Версии, обновленные 21 октября 2015 года:
_kpblc-get-dyn-block-list-prop-and-values.lsp
_kpblc-change-dyn-block-prop.lsp
Похожее
Размещено в AutoCAD, Код LISP, Функции LISP · Метки: LISP, Архив caduser.ru, Практика
>> Прекрасно видел и понимал, что его можно использовать только когда пытаешься настроить блок программно, а это делать программно как раз и не желательно. Нет такой программы, которая может определять какую толщину стенки надо выбрать (к примеру).
Начальная задача как раз в том и состояла, насколько я помню В принципе, можно и мой код переработать так, чтобы он брал данные только с текущего вхождения блока, но я сейчас этой задачкой заниматься как-то не сильно могу: работы навалили за последние минут 10 столько, что проще повеситься