|
||
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Динамич. блоки. Програмное изм. свойств
Россия
Регистрация: 29.08.2007
Сообщений: 28
|
||
Просмотров: 11957
|
|
||||
Инженер 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,426
|
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 29.08.2007
Россия
Сообщений: 28
|
Вставить динам. блок не проблема.
Когда мы его выделяем в чертеже, все параметры которыми мы его наделили (т.е. растяжение, отображение и т.д.) отображаюся в окне свойства и каждый со своим списком вариантов. Может программно можно туда обращаться чтоб менять значение? Спасибо за помощь!!! |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426
|
Можно. Как пример 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,426
|
Да там столько багов, высветилось при переходе на 2007, что проще новое написать
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426
|
Во-первых, знать имя дин.блока мало. Надо знать его конкретное вхождение. Во-вторых, дин.свойство может быть индексируемым (перечисляемым) - типа "красный желтый зеленый в_горошек" или неиндексируемым (длина, например). В-третьих, блок может лежать на заблокированном слое или принадлежать другому блоку, который тоже неизвестно как лежит. В-четвертых, изменение значения дин.свойства может вызвать изменение видимости некоторых примитивов дин.блока, а эти примитивы могут быть положены на замороженный или заблокированный в данный момент слой. Соответственно необходимо:
- проверить правильность передачи данных. Если указателя на блок нет, запросить. Если имени дин.свойства нет, запросить. Если свойство индексируемое, запросить новое значение. Или не запрашивать - подобные решения зависят от области применения лиспа. - проверить, работа выполняется со вхождением блока или нет? - проверить, а динамический ли блок? - проверить владельца дин.блока. Если внешняя ссылка, то механизм работы меняется принципиально и я его реализовать не могу. При этом помнить о том, что дин.блок может входить внутрь блока, который входит во внешнюю ссылку. - проверить наличие у этого дин.блока этого свойства - если свойство есть и оно индексируемое, проверить - попадает ли передаваемое значение в допустимый диапазон - разморозить и разблокировать слои. Возможно, придется проходить по всем слоям файла, так как вычислить владельца дин.свойства мне пока не удалось - изменить свойство. При этом помнить, что свойства могут отображаться как числовые или строковые переменные, а передаваться должны как 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 и внутри них дополнительные действия... Перечитайте еще раз мои рекомендации, они основаны на реальных тестах! |
||||
![]() |
|
||||
Да, читал я все и понимаю прекрасно. Только наука взломология ушла чуток вперед
![]() Дело в том, что параметр видимости может быть доступен только один в текущий момент. В первом (нулевом) уровне все прекрасно, можно динамические свойства устанавливать и графику. Во втором и выше вы можете поставить только графику и завязать ее видимость на окна в этом уровне. Сделать это можно (пока, не сомневаюсь) только в редакторе. И причем после слома lookupa, который должен быть последним из установленных динамических свойств первого (нулевого) уровня. После того, как все visibility сделаны и графика в них установлена, можно починить lookup и станет доступен нулевой уровень visibility, где уже динамическими свойствами завязать графику других visibility. Вот такая вот безумная идея. Вручную я это уже делал, но вспотел безбожно. Надо сделать специальный гаечный ключ. |
||||
![]() |
|
||||
Цитата:
Делал все полностью программно, но не единой программой, а частями, хотя все из лисп редактора. ![]() |
||||
![]() |
|
||||
Да и я тоже самое делал, да только взаимосвязь "левых" visibility обнаруживается только при их установке через редактор. Правда с динамическими свойствами вкупе я не пробовал.
И еще очень хочу перенести stretch в другой блок, да никак не разберусь с вот этим: Код:
|
||||
![]() |
|
||||
Последние наблюдения:
В блоке лежит примитив, скажем полилиния. Я вхожу в редактор и делаю (entget (car (entsel))). -1 DXF код показывает от вхождения к вхождению все время разные значения. Но если я захожу в параметр visibility и смотрю там на этот примитив, то его -1 код всегда один и тот же. Вот чем они отличаются: Данные (entget (car (entsel))) Код:
Код:
Интересно как себя поведут vla-функции в покареженном блоке? |
||||
![]() |
|
||||
Хотя можно поробовать стерать и 410 код вместе с -1 и 5.
А вот таже полилиния, только в пространстве модели с координатами как в блоке (место точки вставки в 0,0,0). Код:
Последний раз редактировалось Supermax, 08.11.2007 в 18:53. |
||||
![]() |
|
||||
330 - всегда постоянный, что в блоке, что за пределами его.
Чтобы вставить графику в блок, в свойство visibility, надо подставить нужный 330 код от этого visibility и стереть кое-что не нужное. Можно и обратно делать тоже самое. Можно свой редактор блоков сделать. Последний раз редактировалось Supermax, 08.11.2007 в 18:58. |
||||
![]() |
|
||||
Надо попробовать изменить объект динамических свойств из под редактора блоков. То есть произвести модификацию свойства из пространства редактора. Если получится, то это даст представление о связи символов свойств с описанием объектов модели.
|
||||
![]() |
|
||||
Что такое код 95 в словаре "ACAD_EVALUATION_GRAPH"?
Счетчик созданного свойства. Если все время удалять Stretch, а потом вставлять и опять удалять и вставлять, 95 код над этим элементом в словаре прибавляет от раза к разу единицу. Код:
Последний раз редактировалось Supermax, 12.11.2007 в 15:26. |
||||
![]() |
|
||||
Некоторые люди считают, что если данные не документированы, то и изучать их не надо, поскольку в следующих версиях программы они могут быть изменены.
Отвечу следующее: Да они обязательно будут изменены, поскольку совершенства в этой области не достигло своего апогея. Но если при этом совершенствовании будет нарушена приемственность форматов одной программы в другую - это будет уже две разных программы и выбор какой пользоваться за пользователем естественно. Вот есть у меня 2006 кад, в котром я могу создавать динамические блоки с несколькими параметрами видимости, а 2007 даже 3Dорбит в редакторе блоков работать перестал (правда в 2008 восстановили), так и что? Закроют в 2009 каде вообще динамические свойства (я лично сомневаюсь) и будем держать сразу несколько кадов. Расковыряем 2006 на все 100 и будем его модернизировать сами. Да я думаю, что в конце концов эти сведения опубликуют, как только поймут, что публиковать уже поздно. |
||||
![]() |
|
||||
Я нашел закономерность по которой образуются коды выделенные красным.
(91 . 14) (93 . 32) (95 . 31) (360 . <Entity name: 7efa1ac0>) (92 . 11) (92 . 11) (92 . -1) (92 . -1) В них определена связь объектов друг с другом и одновременно последовательность описания в зависимости от последовательности создания. (да не треснут ваши головы) ![]() |
||||
![]() |
|
||||
Вот что я нарыл:
Цитата:
http://www.enlight.ru/faq3d/articles/75.htm Не находите сходство? Я по этому примеру опишу эти красные коды 92, но чуть позже. Последний раз редактировалось Supermax, 12.11.2007 в 22:49. |
||||
![]() |
|
||||
Вот сюда я выложил программу, которая заполняет Lookup-ы из Excel.
http://dwg.ru/f/showthread.php?t=8940&page=6 Пост№114 |
||||
![]() |
|
||||
- Регистрация: 31.07.2005
Ухта
Сообщений: 381
![]() |
Проверь свой макрос Supermax, что-то он мне не нравится (не срабатывает). Он автоматом начинает работать, когда подгужаешь LISPик через Сервис - AutoLISP - Приложения
AutoCAD Ругается таким образом: (load "Excel-Loocup.lsp" "Фаил Excel-Loocup.lsp не найден") "Фаил Excel-Loocup.не найден"
__________________
Я не волшебник, я только учусь… |
|||
![]() |
|
||||
Не знаю что у тебя за кад. НО! Если лисп загружать ручками, то есть через Tools\AutoLISP\Load Application, то путь не нужен вообще. А вот если ты положил мой лисп в свою папочку для лиспов и хочешь кнопочкой его от туда вызвать, а судя по
Цитата:
Удачи! |
||||
![]() |
|
||||
Дык, я ж давал! Да и в темах ничем не отличаются по свежести от тех. Правда не все в данлоад кладу. Ну кому нужны лиспы для ковыряния дин. блоков? Да и народ как-то вяло темой этой интересуется. Качают, а зачем сами наверное не знают.
Не, правда твоя, в данлоад не давал. Так на главной и так пару дней висит и маячит, неужели не замечают? |
||||
![]() |
|
||||
- Регистрация: 31.07.2005
Ухта
Сообщений: 381
![]() |
Supermax, как это мало интересуются? То чем ты занимался и что выложил это класс! Эта помощь просто супер! теперь дин блоки можно очень быстро делать (где много позиций). Я доволен! Спасибо огромное всем кто этим занимался и тебе огромное что выложил сюда! Просто нет слов!
__________________
Я не волшебник, я только учусь… |
|||
![]() |
|
||||
Инженер Регистрация: 11.12.2007
Москва
Сообщений: 295
|
Скажите пожалуйста, тока без страшных кодов.)
Есть ли теперь возможность использовать больше одного параметра видимости в динамических блоках? Visibility Set - это и есть то самое? Теперь знаю что есть такие блоки. Увидел файл с 5 параметрами видимости. )) Просвятите где самое лаконичное объяснение или тупо где "кнопку" сделать для вставки ещё видимостей.
__________________
Live as though tomorrow you will die, Study as though you will live eternally. Последний раз редактировалось Juss_00, 17.04.2009 в 17:32. Причина: Непрочёл исходную тему до конца |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426
|
Juss_00, ищи тему "Создание дополнительных параметров Visibility Set" (автор - Supermax)
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |