Получение и установка параметров динамических блоков

Коды, опубликованные ниже, были сделаны аж в 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



Комментарии

Есть 26 коммент. к “Получение и установка параметров динамических блоков”
  1. Кулик Алексей aka kpblc пишет:

    >> Прекрасно видел и понимал, что его можно использовать только когда пытаешься настроить блок программно, а это делать программно как раз и не желательно. Нет такой программы, которая может определять какую толщину стенки надо выбрать (к примеру).
    Начальная задача как раз в том и состояла, насколько я помню :) В принципе, можно и мой код переработать так, чтобы он брал данные только с текущего вхождения блока, но я сейчас этой задачкой заниматься как-то не сильно могу: работы навалили за последние минут 10 столько, что проще повеситься ;)

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


Я не робот.