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

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

    После выполнения кода:

    Команда: (_KPBLC-GET-DYN-BLOCK-LIST-PROP-AND-VALUES nil)

    Укажите блок : (("Формат" "Неиндексированное значение") ("Ширина"
    "Неиндексированное значение") ("Высота" "Неиндексированное значение")
    ("Ориентация" "Неиндексированное значение") ("Размер 1" "Неиндексированное
    значение") ("Размер 2" "Неиндексированное значение") ("OR" "Неиндексированное
    значение"))

  2. Кулик Алексей aka kpblc пишет:

    А с каким это блоком происходит? Если штатный - проверю, если нет - то нужен образец.

  3. Кулик Алексей aka kpblc пишет:

    А, понял... При копировании затесались лишние символы. Код исправил, выложил по новой.

  4. Kostinok пишет:

    Опять что-то не то, похоже, что не обрабатывается "параметр выбора".
    Файл для примера по адресу: https://yadi.sk/d/9uOZlhiwWUxvC

    После выполнения кода:
    Команда: (_kpblc-get-dyn-block-list-prop-and-values nil)

    Укажите блок : (("Формат" "A4" "A3" "A2" "A1" "A0" "A4x3" "A4x4"
    "A3x3") ("Ширина" "Неиндексированное значение") ("Высота" "Неиндексированное
    значение") ("Ориентация" "Горизонтальный" "Вертикальный") ("Размер 1"
    "Неиндексированное значение") ("Размер 2" "Неиндексированное значение") ("OR" 0
    1))

    AutoCAD 2009 x32, sp3

  5. Кулик Алексей aka kpblc пишет:

    Честно говоря, я не учитывал вариант наличия нескольких параметров видимости. Autodesk не предоставляет подобный механизм - это Supremax на dwg.ru развлекался.
    "Неиндексированное значение" на данный момент выводится для любого параметра, у которого устанавливаемое значение "плавает". Можно внести изменения в код, и вместо "неиндексированное значение" либо показывать текущее значение (если его вообще возможно получить), либо написать "неиндексируемое значение" (или любой другой текст). Какой вариант предпочтительнее?
    P.S. Заняться смогу не раньше вторника-среды...

  6. Kostinok пишет:

    Это НЕ несколько параметров ВИДИМОСТИ, это параметры ВЫБОРА.

    Функция получения параметров дин. блоков может показывать (выводить в виде списка) или текущие значения или все имеющиеся, на выбор...
    Если все имеющиеся не удается считать в виду замудренного блока, то пусть пишет как пишет “неиндексированное значение”.

  7. Кулик Алексей aka kpblc пишет:

    Сорри, я динамические блоки последний раз создавал очень давно :)
    Прочитать значение не вопрос. Да и вывести тоже - но это будет текущее значение для текущего вхождения блока. Пока же код по сбору получает все возможные значения из описания блока.

    Черт, бежать надо - попробую вечером еще один вариант нарисовать.

  8. Supermax пишет:

    Значит так:
    Всё не правильно! Если параметров Visibility-set в блоке нет, то узнать это можно только покопавшись в словаре "ACAD_EVALUATION_GRAPH" на предмет наличия в 360 парах указателя с парой 0 - "BLOCKVISIBILITYPARAMETER".
    Если таковые в словаре есть, то берём их имя (пара 301) и ищем его в списке свойств через метод "GetDynamicBlockProperties".
    Там находим свойство PropertyName с таким именем и читаем его текущее значение Value.
    Далее, в "BLOCKVISIBILITYPARAMETER" находим 303 пару с таким именем как в свойстве Value. Сразу за этой парой находим 95 пару с количеством видимых свойств блока и запоминаем все 333 пары до следующей пары 303.

    А теперь - главное!

    У вас несколько Visibility-set-ов. в каждом из них есть текущее представление и список видимых свойств за ним. В свойствах блока будут видны только те свойства, которые есть во всех списка текущего значения Visibility-set-ов. Если хоть в одном из них какого-то свойства нет - его в панели "свойства" вы не увидите. Надо все списки с текущими значениями сравнить на "И".

    Код закинут в отдельный файл: http://wp.me/a4lEOS-Cj

  9. Кулик Алексей aka kpblc пишет:

    А кто-то говорил про несколько visibility set'ов? :) и при чем тут они? :)

  10. Кулик Алексей aka kpblc пишет:

    Что-то странное с комментированием... В воскресенье вечером попробую разобраться.
    ---
    Разобрался. Проблема была в форматировании кода. Перекинул в отдельный файл.

  11. Supermax пишет:

    Ещё раз, привет всем!
    1. Алексей, к сообщению надо сразу ссылку на код кидать, а не через промежуточную страницу. Если уж делать через страницу, то надо там не Supermax писать, а что-то типа "файл лиспа". Я еле-еле понял,что надо жать на свой ник.

    Там, в коде в первом фрагменте, надо заменить :vlax-true на :vlax-false. Это я специально сделал, чтобы visibility-set-ы достать из своего блока (они у меня с выключенной видимостью).

    Кстати, о свойстве Shou - оно :vlax-false или 0 только если свойства всегда не видны, а если их видимостью управляет visibility-set, то всегда :vlax-true. Так что если хотите получить именно тот список, что вы видите в свойствах блока, то лопатить вам “ACAD_EVALUATION_GRAPH” придётся.

  12. Supermax пишет:

    В последнем фрагменте кода, в строчке
    [cc lang="lisp"] (if (not (null r_w)) (mapcar (function (lambda (x) ....
    [/cc] надо убрать not - тоже специально вставлял чтобы проверить как пары создаёт.

  13. Кулик Алексей aka kpblc пишет:

    Supermax, твой код сработает только в текущем документе. И касается он только VisibilitySet. А остальные параметры и значения что, отправляются лесом?
    За ради приколу - предоставь мне "на растерзание" один-два своих дин.блока с несколькими параметрами видимости, а я посмотрю - какие результаты выдаст мой код.
    P.S. Изначально код создавался для того, чтобы получить все параметры дин.блока. Для индексируемых параметров дополнительно выводить допустимые значения. Плюс возможность установки допустимых значений для вхождений блока.

  14. Кулик Алексей aka kpblc пишет:

    А файл с таким блоком предоставить? :)

  15. Supermax пишет:

    А как?

  16. Кулик Алексей aka kpblc пишет:

    На любой файлообменник. А здесь - ссылку :) НУ или на dwg.ru вложить

  17. Кулик Алексей aka kpblc пишет:

    Позиция недоступна. В свой пост на dwg.ru приложи файл - будет и проще, и дешевле.

  18. Supermax пишет:

    Ещё не проверили. Мой скайп < ...> прочти и сотри

  19. Кулик Алексей aka kpblc пишет:

    Отправил данные

  20. Кулик Алексей aka kpblc пишет:

    Архив закинут сюда.
    Результаты выполнения моего кода на ACAD2015 таковы:

    Твой код не проверить: у меня на машине нет записи в реестре по ветке "HKEY_CURRENT_USER\\LISP" ключа "diametr".

  21. Supermax пишет:

    А вот результат работы моей писанины:

    (("Сайт производителя" "http://www.omk.ru/")
    ("Производитель" "ЗАО \"Объединенная металлургическая компания\"")
    ("Теоретическая масса 1 м труб, кг" "128.24")
    ("Толщина стенки O530" "10,0")
    ("Диаметр " "530")
    ("Марка стали" "Ст3кп")
    ("Группа" "Б")
    ("Технические условия" "ГОСТ 10706-76")
    ("Стандарт сортамента" "ГОСТ 10704-91")
    ("Наименование материала" "Трубы стальные электросварные прямошовные"))

  22. Кулик Алексей aka kpblc пишет:

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

  23. Supermax пишет:

    Естественно с текущего вхождения! Вся затыка была получить именно то, что мы видим в меню "свойства". Именно текущие настройки а не всё что только можно! Думаешь я не видел этот массив данных? Прекрасно видел и понимал, что его можно использовать только когда пытаешься настроить блок программно, а это делать программно как раз и не желательно. Нет такой программы, которая может определять какую толщину стенки надо выбрать (к примеру).

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


Я не робот.