Динамич. блоки. Програмное изм. свойств
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Динамич. блоки. Програмное изм. свойств

Динамич. блоки. Програмное изм. свойств

Ответ
Поиск в этой теме
Непрочитано 05.10.2007, 11:44 #1
Динамич. блоки. Програмное изм. свойств
ct_ycte
 
Россия
Регистрация: 29.08.2007
Сообщений: 28

Здравствуйте!!!
Создал динам. блок, например с изменением его длины. При его выделении появляется ручка где показаны все возможные варианты длины.
Вопрос: А нельзя изменение длины(для этого случая) запрограммировать на кнопку?

Спасибо за помощь!!!

(Просто хочется сделать форматы на основе динам. блоков с удобным интерфейсом)
Просмотров: 11922
 
Непрочитано 05.10.2007, 11:58
#2
VVA

Инженер 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.
VVA вне форума  
 
Непрочитано 05.10.2007, 12:14
#3
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Тогда уж http://forum.abok.ru/index.php?showtopic=14612&st=377
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.10.2007, 12:58
#4
Diman111

промышл проектант
 
Регистрация: 26.05.2005
Изовсехщелей
Сообщений: 323


Послали так послали
- а вопрос то интересный - вернее на него ответ )
Diman111 вне форума  
 
Автор темы   Непрочитано 05.10.2007, 14:03
#5
ct_ycte


 
Регистрация: 29.08.2007
Россия
Сообщений: 28


Да, я думал что решение по проще будет.
ct_ycte вне форума  
 
Автор темы   Непрочитано 05.10.2007, 14:59
#6
ct_ycte


 
Регистрация: 29.08.2007
Россия
Сообщений: 28


Вставить динам. блок не проблема.

Когда мы его выделяем в чертеже, все параметры которыми мы его наделили (т.е. растяжение, отображение и т.д.) отображаюся в окне свойства и каждый со своим списком вариантов.
Может программно можно туда обращаться чтоб менять значение?

Спасибо за помощь!!!
ct_ycte вне форума  
 
Непрочитано 05.10.2007, 15:57
#7
Кулик Алексей aka kpblc
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-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.10.2007, 17:00
#8
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Кулик Алексей aka kpblc
Ты, кстати, обнови там функцию-то, у ней же баг высветился...
Krieger вне форума  
 
Автор темы   Непрочитано 05.10.2007, 17:19
#9
ct_ycte


 
Регистрация: 29.08.2007
Россия
Сообщений: 28


А у меня все программы по ссылке http://www.autocad.ru/cgi-bin/f1/board.cgi?t=36637zq выдает ошибку
слишком мало аргументов.
програму вызывал (_KPBLC-GET-DYN-BLOCK-LIST-PROP-AND-VALUES)
ct_ycte вне форума  
 
Непрочитано 05.10.2007, 17:21
#10
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Да там столько багов, высветилось при переходе на 2007, что проще новое написать Направление указано, а там уж как карта ляжет... Если разрабатывать универсалку (как я люблю), то тут кода страницы на 3 будет, не меньше.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.10.2007, 17:29
#11
ct_ycte


 
Регистрация: 29.08.2007
Россия
Сообщений: 28


Смотри, допустим я знаю как называется дим. блок(т.е. мне не надо его искать)., знаю имя свойства.
Т.е. я его уже вставил в чертеж и мне только надо изменить одно из свойств динам. блока.

Если так вопрос поставить.
ct_ycte вне форума  
 
Непрочитано 05.10.2007, 17:48
#12
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Во-первых, знать имя дин.блока мало. Надо знать его конкретное вхождение. Во-вторых, дин.свойство может быть индексируемым (перечисляемым) - типа "красный желтый зеленый в_горошек" или неиндексируемым (длина, например). В-третьих, блок может лежать на заблокированном слое или принадлежать другому блоку, который тоже неизвестно как лежит. В-четвертых, изменение значения дин.свойства может вызвать изменение видимости некоторых примитивов дин.блока, а эти примитивы могут быть положены на замороженный или заблокированный в данный момент слой. Соответственно необходимо:
- проверить правильность передачи данных. Если указателя на блок нет, запросить. Если имени дин.свойства нет, запросить. Если свойство индексируемое, запросить новое значение. Или не запрашивать - подобные решения зависят от области применения лиспа.
- проверить, работа выполняется со вхождением блока или нет?
- проверить, а динамический ли блок?
- проверить владельца дин.блока. Если внешняя ссылка, то механизм работы меняется принципиально и я его реализовать не могу. При этом помнить о том, что дин.блок может входить внутрь блока, который входит во внешнюю ссылку.
- проверить наличие у этого дин.блока этого свойства
- если свойство есть и оно индексируемое, проверить - попадает ли передаваемое значение в допустимый диапазон
- разморозить и разблокировать слои. Возможно, придется проходить по всем слоям файла, так как вычислить владельца дин.свойства мне пока не удалось
- изменить свойство. При этом помнить, что свойства могут отображаться как числовые или строковые переменные, а передаваться должны как variant (по-моему).
- обновить вхождение блока.
- регенерировать текущий (если активна закладка модели) или все (если активна закладка листа) видовые экраны.
- восстановить состояние слоев.
На каждом этапе надо отслеживать возможность ошибки. Приходится помнить, что vla-get-allowedvalues (вроде так пишется) возвращает "не список"; что тупое применение GetDynProperties может выбить acad в непонятное состояние (особенно для описаний блоков или внешних ссылок); что слишком большая вложенность обработчика ошибок может не сработать...
Если писать нормально работающую программу на это, то тут явно не на 3 строки. Хотя, если исключить все эти отловы, то можно и 3-4 строками обойтись. Но использовать такое я не рискну.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 05.10.2007, 19:34
#13
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


>ct_ycte Ты хочешь программно изменять свойства, но не хочешь в программах разбираться.
Берешь программы по ссылке №2
Если свойство индексируемое (перечисляемое). Обычно по умолчанию Visible - это имя. В объекте значения храняться в Allowedvalues, а текущее в Value.
Допустим в чертеже вставлен блок, у него есть перечисляемое свойство "Visible" и значения Круг, Квадрат, Треугольник
тогда

Код:
[Выделить все]
(SetDynamicBlockPropertyNameAllowedValue  (vlax-ename->vla-object (car(entsel))) "Visible" "Круг")
Установит свойсво в Круг

Если есть неиндексируемое свойство, например "Distance"

Код:
[Выделить все]
(SetDynamicBlockPropertyNameValue (vlax-ename->vla-object (car(entsel))) "Distance" 200)
Установит его в 200.

PS Пишу без Автокада, за правильное написание vlax-ename->vla-object и парность скобок не ручаюсь
VVA вне форума  
 
Автор темы   Непрочитано 07.10.2007, 18:10
#14
ct_ycte


 
Регистрация: 29.08.2007
Россия
Сообщений: 28


Я в таком коде не вжизнь не разберусь
ct_ycte вне форума  
 
Непрочитано 08.10.2007, 11:00
#15
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Пользуйся готовыми ф-циями. По принципу черного ящика, известно что на входе и на выходе.
VVA вне форума  
 
Автор темы   Непрочитано 11.10.2007, 14:03
#16
ct_ycte


 
Регистрация: 29.08.2007
Россия
Сообщений: 28


Спасибо Вам ребята!!!
Вроде разобрался!
Надесь к вам еще можно будет обратится за помощью.
Очень на это расчитываю!
ct_ycte вне форума  
 
Автор темы   Непрочитано 11.10.2007, 19:01
#17
ct_ycte


 
Регистрация: 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
ct_ycte вне форума  
 
Непрочитано 12.10.2007, 07:26
#18
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от ct_ycte
Не как не могу понять как правильно указать имя блока чтоб не выдавал запрос на выбор
Никак - функция работает со вставкой блока, а не с его определением. Что-бы не было запроса на указание объекта, его надо передать в виде аргумента, о чём прямо сказано в описании функции:
Цитата:
Сообщение от ct_ycte
* Параметры вызова:
* ent указатель на блок (vla-, ename или string). Строка воспринимается
как хендл объекта. nil -> запрашивается у пользователя
Alaspher вне форума  
 
Непрочитано 08.11.2007, 14:55 Про программное изменение свойств динамического блока
#19
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Очень-ца интересная тема, однако. Только что-то не туда ушла. Надо подкорректировать чуток.
В свете последних достижений по расковыриванию свойств динамического блока хотелось бы обсудить дальнейшее будующее такой информации и воплотить пару идей.
Надо написать лиспик, который находит в словаре lookup с заданным именем. Имя это записано в 300 DXF код и его надо портить, а потом восстанавливать.
Если lookup не испорченный, его имя видно в редакторе блока, а если его имя изменилось, а всю остальную динамическую лабуду об этом не предупредили, то активатор lookupa исчезает из редактора. В какое имя переименовали это несчастный lookup, допустим забыли, как узнать какой lookup порченный?
Рассуждаю в слух: Заходим в редактор блока и выделяем все, что выделяется. Мы имена можем прочесть? Нет entget выдает только код -1. А вот совпадает он с тем кодом, что в словаре не знаю.

Я что хочу? Я хочу испортить это имя, это даст возможность вставить много параметров видимости, а потом его исправить. Давно хочу сделать этот эксперемент, но все руки не доходят, может командно это сделаем?

Kpblc, ау! Давай тут динамические блоки разбирать.
Supermax вне форума  
 
Непрочитано 08.11.2007, 14:59
#20
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Supermax Посмотреть сообщение
Очень-ца интересная тема, однако. Только что-то не туда ушла. Надо подкорректировать чуток.
В свете последних достижений по расковыриванию свойств динамического блока хотелось бы обсудить дальнейшее будующее такой информации и воплотить пару идей.
Надо написать лиспик, который находит в словаре lookup с заданным именем. Имя это записано в 300 DXF код и его надо портить, а потом восстанавливать.
Если lookup не испорченный, его имя видно в редакторе блока, а если его имя изменилось, а всю остальную динамическую лабуду об этом не предупредили, то активатор lookupa исчезает из редактора. В какое имя переименовали это несчастный lookup, допустим забыли, как узнать какой lookup порченный?
Рассуждаю в слух: Заходим в редактор блока и выделяем все, что выделяется. Мы имена можем прочесть? Нет entget выдает только код -1. А вот совпадает он с тем кодом, что в словаре не знаю.

Я что хочу? Я хочу испортить это имя, это даст возможность вставить много параметров видимости, а потом его исправить. Давно хочу сделать этот эксперемент, но все руки не доходят, может командно это сделаем?

Kpblc, ау! Давай тут динамические блоки разбирать.
Я же вам говорил - ничего не надо ломать!
Достаточно просто добавить дополнительные объекты lookup и внутри них дополнительные действия... Перечитайте еще раз мои рекомендации, они основаны на реальных тестах!
Елпанов Евгений вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Динамич. блоки. Програмное изм. свойств