|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Динамич. блоки. Програмное изм. свойств
Россия
Регистрация: 29.08.2007
Сообщений: 28
|
||
Просмотров: 11922
|
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
http://forum.abok.ru/index.php?showtopic=14612&st=360
пост 378 *** Добавлено Ссылка на caduser LISP. Изменение свойств(а) динамических блоков. Последний раз редактировалось VVA, 28.12.2010 в 15:45. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404
|
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 29.08.2007
Россия
Сообщений: 28
|
Вставить динам. блок не проблема.
Когда мы его выделяем в чертеже, все параметры которыми мы его наделили (т.е. растяжение, отображение и т.д.) отображаюся в окне свойства и каждый со своим списком вариантов. Может программно можно туда обращаться чтоб менять значение? Спасибо за помощь!!! |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404
|
Можно. Как пример http://www.autocad.ru/cgi-bin/f1/board.cgi?t=36637zq
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 29.08.2007
Россия
Сообщений: 28
|
А у меня все программы по ссылке http://www.autocad.ru/cgi-bin/f1/board.cgi?t=36637zq выдает ошибку
слишком мало аргументов. ![]() програму вызывал (_KPBLC-GET-DYN-BLOCK-LIST-PROP-AND-VALUES) |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404
|
Да там столько багов, высветилось при переходе на 2007, что проще новое написать
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404
|
Во-первых, знать имя дин.блока мало. Надо знать его конкретное вхождение. Во-вторых, дин.свойство может быть индексируемым (перечисляемым) - типа "красный желтый зеленый в_горошек" или неиндексируемым (длина, например). В-третьих, блок может лежать на заблокированном слое или принадлежать другому блоку, который тоже неизвестно как лежит. В-четвертых, изменение значения дин.свойства может вызвать изменение видимости некоторых примитивов дин.блока, а эти примитивы могут быть положены на замороженный или заблокированный в данный момент слой. Соответственно необходимо:
- проверить правильность передачи данных. Если указателя на блок нет, запросить. Если имени дин.свойства нет, запросить. Если свойство индексируемое, запросить новое значение. Или не запрашивать - подобные решения зависят от области применения лиспа. - проверить, работа выполняется со вхождением блока или нет? - проверить, а динамический ли блок? - проверить владельца дин.блока. Если внешняя ссылка, то механизм работы меняется принципиально и я его реализовать не могу. При этом помнить о том, что дин.блок может входить внутрь блока, который входит во внешнюю ссылку. - проверить наличие у этого дин.блока этого свойства - если свойство есть и оно индексируемое, проверить - попадает ли передаваемое значение в допустимый диапазон - разморозить и разблокировать слои. Возможно, придется проходить по всем слоям файла, так как вычислить владельца дин.свойства мне пока не удалось - изменить свойство. При этом помнить, что свойства могут отображаться как числовые или строковые переменные, а передаваться должны как variant (по-моему). - обновить вхождение блока. - регенерировать текущий (если активна закладка модели) или все (если активна закладка листа) видовые экраны. - восстановить состояние слоев. На каждом этапе надо отслеживать возможность ошибки. Приходится помнить, что vla-get-allowedvalues (вроде так пишется) возвращает "не список"; что тупое применение GetDynProperties может выбить acad в непонятное состояние (особенно для описаний блоков или внешних ссылок); что слишком большая вложенность обработчика ошибок может не сработать... Если писать нормально работающую программу на это, то тут явно не на 3 строки. Хотя, если исключить все эти отловы, то можно и 3-4 строками обойтись. Но использовать такое я не рискну.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
>ct_ycte Ты хочешь программно изменять свойства, но не хочешь в программах разбираться.
Берешь программы по ссылке №2 Если свойство индексируемое (перечисляемое). Обычно по умолчанию Visible - это имя. В объекте значения храняться в Allowedvalues, а текущее в Value. Допустим в чертеже вставлен блок, у него есть перечисляемое свойство "Visible" и значения Круг, Квадрат, Треугольник тогда Код:
Если есть неиндексируемое свойство, например "Distance" Код:
PS Пишу без Автокада, за правильное написание vlax-ename->vla-object и парность скобок не ручаюсь |
|||
![]() |
|
||||
Регистрация: 29.08.2007
Россия
Сообщений: 28
|
снова я.
Не как не могу понять как правильноуказать имя блока чтоб не выдавал запрос на выбор "\nУкажите блок <Отмена> : " Имя блока block11. Может подскажите, пожалуйста. Например в этой програмке. (defun _kpblc-change-dyn-block-prop (ent name value / adoc prop value_lst blk) ;| * Функция изменения свойства динамического блока. * Параметры вызова: * ent указатель на блок (vla-, ename или string). Строка воспринимается как хендл объекта. nil -> запрашивается у пользователя * name имя дин.свойства * value новое значение * Функция проверяет, является ли переданный примитив указателем на динамический * блок, наличие у этого дин.блока указанного свойства и возможности назначения * value. |; (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 (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))) ) ;_ end of vla-StartUndoMark (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 (setq blk (vla-item (vla-get-blocks adoc) (vla-get-effectivename ent) ) ;_ end of vla-item ) ;_ end of setq ) ;_ end of vla-get-isxref :vlax-true ) ;_ end of = name (= (type name) 'str) value (setq prop (car (vl-remove-if-not '(lambda (x) (= (strcase (vla-get-propertyname x)) (strcase name) ) ;_ end of = ) ;_ 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-not ) ;_ end of car ) ;_ end of setq (member value (mapcar 'vlax-variant-value (vlax-safearray->list (vlax-variant-value (vla-get-allowedvalues prop)) ) ;_ end of vlax-safearray->list ) ;_ end of mapcar ) ;_ end of member ) ;_ end of and (progn (vla-put-value prop (vlax-make-variant value (vlax-variant-type (vla-get-value prop)) ) ;_ end of vlax-make-variant ) ;_ end of vla-put-value (vla-update ent) ) ;_ end of progn (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 (vla-endundomark adoc) (princ) ) ;_ end of defun |
|||
![]() |
|
||||
Регистрация: 11.10.2004
e•burg
Сообщений: 755
|
Цитата:
Цитата:
|
|||
![]() |
|
||||
Очень-ца интересная тема, однако. Только что-то не туда ушла. Надо подкорректировать чуток.
В свете последних достижений по расковыриванию свойств динамического блока хотелось бы обсудить дальнейшее будующее такой информации и воплотить пару идей. Надо написать лиспик, который находит в словаре lookup с заданным именем. Имя это записано в 300 DXF код и его надо портить, а потом восстанавливать. Если lookup не испорченный, его имя видно в редакторе блока, а если его имя изменилось, а всю остальную динамическую лабуду об этом не предупредили, то активатор lookupa исчезает из редактора. В какое имя переименовали это несчастный lookup, допустим забыли, как узнать какой lookup порченный? Рассуждаю в слух: Заходим в редактор блока и выделяем все, что выделяется. Мы имена можем прочесть? Нет entget выдает только код -1. А вот совпадает он с тем кодом, что в словаре не знаю. Я что хочу? Я хочу испортить это имя, это даст возможность вставить много параметров видимости, а потом его исправить. Давно хочу сделать этот эксперемент, но все руки не доходят, может командно это сделаем? Kpblc, ау! Давай тут динамические блоки разбирать. |
||||
![]() |
|
||||
Цитата:
Достаточно просто добавить дополнительные объекты lookup и внутри них дополнительные действия... Перечитайте еще раз мои рекомендации, они основаны на реальных тестах! |
||||
![]() |