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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Создание дополнительных параметров Visibility Set в динамических блоках.

Создание дополнительных параметров Visibility Set в динамических блоках.

Ответ
Поиск в этой теме
Непрочитано 13.09.2008, 13:35 5 | #1
Создание дополнительных параметров Visibility Set в динамических блоках.
Supermax
 
Руководитель фирмы
 
Москва
Регистрация: 28.03.2007
Сообщений: 1,831

В этой теме рассматривается вопрос программного "наращивания" возможностей динамических блоков.
Программистам:
Разбор словарей дин.блока
Получение параметра видимости и его разбор

Примеры блоков с несколькими параметами видимости (Visibility Set): "неправильные" и "правильные".
В посте #212 - пример связи Lookup-ов друг с другом.
Макрос по перемещению свойств в списке свойств блока меню Properties
02.02.2010 Откорректирована для работы в 2010 каде



Пользователям:
Готовые макросы:
Все функции по вставке и обработке дополнительных Visibility Set
Обновление 17.07.2009г. Исправлена ошибка в element-sel-current-insert и добавлено включение видимости всем элементам с откатом назад, после выбора нужных элементов
Обновление 06.10.2009. Исправил функцию eval_graf_output, из-за которой не работала visibility-up.
Обновление 02.02.2010. !!! Откорректирована в связи с появлением нового динамического элемента в 2010 каде
(properties_add_all_visibility) - установка видимости выбранных динамических свойств и ручек во всех представлениях всех Visibility Set-ов.
Добавлен вывод значения текущего Visibility Set-a в статусную строку и спрятаны не нужные глобальные переменные
(element-all-current-del) - удаление из текущего Visibility Set всех элементов оставляя свойства и представления.
(element-sel-current-del) - очищает Visibility Set от указанных элементов без необходимости выключать им видимость в других представлениях текущего Visibility Set-а.
(element-sel-current-insert) - внедрение в общий список текущего Visibility Set-a выбранных элементов.
(Visibility_add) - Добавление нового Visibility Set-a
(visibility-up) - Делает указанный пользователем Visibility Set текущим
(eddedd) - Включает ручки всем элементам текущего Visibility Set-a
(Visibility_clear) - Очищает указанный Visibility Set от всех элементов, параметров и представлений. Принадлежащие ему элементы становятся свободными
Инструкция по применению дополнительных Visibility Set

Функции управления видимостью объектов (вкл\выкл)
Вебмакрос по управлению видимостью объектов (только для тех, у кого Internet Explorer 7.0)
Функция по выключению видимости отдельных элементов блока из пространства модели
#66 и #67 - восстановление видимости отдельных элементов блока.
Excel->Lookup
Lookup->Excel
Lookup->Lookup

Самые последние версии, для работы в любом пространстве.
Программа по массовой установке и снятию видимости элементов в представлениях текущего Visibility Set-a Обновление 8.10.2008г. Устранена ошибка загрузки DCL панели.
Программа по устаноке на параметр Lookup-a сколь угодного количества активаторов
Пример использования связанных активаторов Lookup-a через один параметр Lookup-a. 3D-динамический блок-игрушка Гидроцилиндр телескопический 4-х секционный. Файл обновлен 8.10.2008г.

Все макросы для кнопок и иконки к ним

24.01.2009.
Исправлена ошибка в функции (properties_add_all_visibility)

Исходные тексты к функциям:
http://www.private.peterlink.ru/pole...9/tainypod.htm

Последний раз редактировалось Supermax, 02.02.2010 в 20:26.
Просмотров: 361231
 
Автор темы   Непрочитано 13.09.2008, 14:35
#2
Supermax

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


Назрел момент коренным образом разобрать строение динамических блоков и определить, что же можно с ними делать, а что нельзя.
Я много "наковырял" информации о структуре динамических блоков, но многое еще не изучил и не понял. Мне не нужно становиться специалистом по каким-то там блокам. У меня много других проблем, но с динамическими блоками у меня связаны многие планы и ковырять их так и так придется. Буду весьма благодарен, если найдутся люди, желающие мне помочь и тоже интересующиеся строением динамических блоков. Чем больше людей будет уметь обращаться с ними программно, тем лучше будут программы к Автокаду, да и в других программах могут тоже появиться динамические блоки.

В посте №144 на 8-ой странице все функции по добавлению и управлению добавленными Visibility Set-ами.

Для чего нужны дополнительные Visibility Set-ы? Для того, чтобы можно было управлять видимостью одной группы элементов не трогая установку видимости для другой группы.
Создание дополнительных Visibility Set возможно и уже реализовано, но реализовано не правильно. Чтобы реализовать эту задачу правильно, надо в первую очередь ясно понять что и для чего сделано.

Добраться до словаря (0 . "ACAD_EVALUATION_GRAPH") где собственно лежат все свойства динамических блоков можно двумя путями.
1-й путь:
Код:
[Выделить все]
Выбрать в модели или листе любое из вхождений нужного нам блока.
└> Найти его эффективное имя.
    └> Найти в коллекции Block объект этой коллекции по эф. имени.
       └> Достать из DXF описания этого блока точечную пару 330 (0 . "BLOCK_RECORD")
         └> От туда 360 пару (0 . "DICTIONARY")
           └>  От туда 360 пару (0 . "ACAD_EVALUATION_GRAPH")
Второй путь - это через пространство редактора блоков.
Код:
[Выделить все]
Выбрать любой графический элемент (объекты свойств не трогать!)
└> Достать из DXF описания этого элемента точечную пару 330 (0 . "BLOCK_RECORD")
  └> От туда 360 пару (0 . "DICTIONARY")
    └>  От туда 360 пару (0 . "ACAD_EVALUATION_GRAPH")
-1 коды у полученных данных разные и это настораживает, поскольку не известно почему. Я знаю, что DXF представление искуственное отображение данных и порою даже меняется от одного запроса к другому, но тут коды -1 не меняются от того, что ты заходишь в редактор и выходишь из него, только если что-то изменить в графике.
Ну не важно. Наша цель - расковырять (0 . "ACAD_EVALUATION_GRAPH"), поскольку именно в него добавляются дополнительные Visibility Set-ы.

Следующая моя инфа о строении этого словаря.

Последний раз редактировалось Supermax, 03.10.2008 в 15:39.
Supermax вне форума  
 
Непрочитано 13.09.2008, 18:37
#3
Кулик Алексей aka kpblc
Moderator

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


Не думаю (давно не ковырял), что разбор только словаря ACAD_EVALUATION_GRAPH" даст ожидаемый эффект. Понадобится, скорее всего, просматривать еще и элементы блока.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.09.2008, 18:44
#4
Supermax

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


Сначала я дам код получения словаря "ACAD_EVALUATION_GRAPH".
Первый вариант его получения (из коллекции Block).
Код:
[Выделить все]
(setq lst 
  (entget 
    (TBLOBJNAME "block" 
      (vla-get-EffectiveName 
        (vlax-ename->vla-object 
          (car (entsel "Укажите нужный вам блок"))))) '("*")))
(setq EVAL_GRAPH 
  (entget 
    (cdr (assoc 360 
      (entget 
        (cdr (assoc 360 
          (entget (cdr (assoc 330 lst))))))))))
Второй способ (из пространства редактора блоков).
Код:
[Выделить все]
(setq EVAL_GRAPH 
(entget (cdr
(assoc 360 (entget (cdr 
(assoc 360 (entget (cdr 
(assoc 330 (entget (car (entsel))))))))))))
Автокад многие DXF пары корректировать не дает. Что туда не вставь - восстанавливает прежнее. Удали - тоже восстанавливает, но в тоже время, в том же списке этих пар есть такие, которые Автокад позволяет менять. Есть некоторые DXF коды (пара без точки посередине) присутствие которых в списке не дает возможность модифицировать этот список и только удалив эти коды из списка можно его модифицировать, но после модификации эти коды опять восстанавливаются.
Последовательность размещения точечных пар и DXF кодов в некоторых случаях произвольная, а в некоторых строго определенная. Так в случае с "ACAD_EVALUATION_GRAPH" - последовательность размещения имеет очень боьшое значение.
Многие модификации кончаются фатал еррором. Что это такое знают даже не программисты.

Не эксперементируйте с рабочими файлами! Не эксперементируйте в тот момент, когда в другом окне загружен рабочий файл!

Последний раз редактировалось Supermax, 14.09.2008 в 14:04.
Supermax вне форума  
 
Автор темы   Непрочитано 13.09.2008, 18:47
#5
Supermax

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


Даст, поверь. Но в объект (0 . "BLOCKVISIBILITYPARAMETER") мы залезем обязательно.
Supermax вне форума  
 
Автор темы   Непрочитано 13.09.2008, 18:58
#6
Supermax

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


Вот распечатка "ACAD_EVALUATION_GRAPH" не очень насыщенного свойствами блока.
Код:
[Выделить все]
((-1 . <Entity name: 7bf53288>) 
(0 . "ACAD_EVALUATION_GRAPH") 
(5 . "37EF9") 
(102 . "{ACAD_REACTORS") (330 . <Entity name: 7bf53280>) (102 . "}") 
(330 . <Entity name: 7bf53280>) 
(100 . "AcDbEvalGraph") 
(96 . 14) 
(97 . 14) 
(91 . 0) (93 . 32) (95 . 11) (360 . <Entity name: 7bf53308>) (92 . 0) (92 . 0) (92 . 1) (92 . 2)     BLOCKVISIBILITYPARAMETER 
(91 . 1) (93 . 32) (95 . 12) (360 . <Entity name: 7bf53310>) (92 . -1) (92 . -1) (92 . 0) (92 . 0)   BLOCKVISIBILITYGRIP 
(91 . 2) (93 . 32) (95 . 13) (360 . <Entity name: 7bf53318>) (92 . 1) (92 . 1) (92 . -1) (92 . -1)   BLOCKGRIPLOCATIONCOMPONENT "UpdatedX"
(91 . 3) (93 . 32) (95 . 14) (360 . <Entity name: 7bf53320>) (92 . 2) (92 . 2) (92 . -1) (92 . -1)   BLOCKGRIPLOCATIONCOMPONENT "UpdatedY"

(92 . 0) (93 . 0) (94 . 1) (91 . 1) (91 . 0) (92 . -1) (92 . -1) (92 . -1) (92 . -1) (92 . -1) 
(92 . 1) (93 . 0) (94 . 1) (91 . 0) (91 . 2) (92 . -1) (92 . -1) (92 . -1) (92 . 2) (92 . -1) 
(92 . 2) (93 . 0) (94 . 1) (91 . 0) (91 . 3) (92 . -1) (92 . -1) (92 . 1) (92 . -1) (92 . -1))
Именно в таком виде и надо просматривать этот словарь.
Нужна прога. У меня пока нет.
Дописки с правой стороны мои, для понимания что там лежит.

Это распечатка словаря блока, в котором установлен только один Visibility Set и больше ничего.
Параметр, ручка от него и два объекта - один расположение ручки по X и другой - по Y. Если ручку выключить - этих трех объектов не будет, только параметр останется.

Последний раз редактировалось Supermax, 13.09.2008 в 19:03.
Supermax вне форума  
 
Автор темы   Непрочитано 13.09.2008, 23:40
#7
Supermax

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


Я думаю, что до 96 кода описывать точечные пары не надо, поскольку о них все написано в книгах по автолиспу.
96 и 97 код пока рассматривать не будем, поскольку без понимания всего в целом, значения эти не понять.

По скольку AutoDeck не дает описания структуы, и даже терминов, которые он присваивает не дает - будем придумывать термины свои. Если кому-то не нравятся мои термины - предлагайте свои.
И так:
Помимо отдельных точечных пар в начале списка, которые несут общее определение имени, типа объекта, метки, и пр. все остальное делится на "записи". "Записью" я называю ряд точечных пар, из которых состоит что-то типа предложения, описывающего некую константу.
Начинается запись после 97 кода с точечной пары с номером записи по порядку. Этокод 91. Записи маркируются с 0.
Код:
[Выделить все]
(91 . 0) (93 . 32) (95 . 11) (360 . <Entity name: 7bf53308>) (92 . 0) (92 . 0) (92 . 1) (92 . 2)
Следующая пара с кодом 93 - тип записи. В этом же словаре есть и другого типа записи и в других словарях тоже по всей видимости, а в недрах Автокада есть скорее всего набор функций, которые в зависимости от типа записи знают сколько точечныхпар в ней, на каких местах кто стоит и что означает, и в соответствии с типом записи она и обрабатывает эти записи.

Следующий код 95 - номер создания элемента по порядку. То есть, когда создается элемент ему присваивается следующий порядковый номер. Этот номер изменить нельзя - фатал еррор сразу. Он сопровождает 360 код, в какую строку его не перемести. И скажу сразу, для практических целей совсем бесполезен. На последовательность отображения свойств в списке свойств блока не влияет. Но это он тут для манипуляций им бесполезен, но Lookup активатор именно на него и ссылается.

Следующий код 360 - указатель на объект. Этоили ...PARAMETER, или ...GRIP, или BLOCKGRIPLOCATIONCOMPONENT, или ...ACTION. То, что в редакторе блоков вы видите. Хотя Там явно видны только параметры и актион-сы, но есть и ручки (сине треугольнички). BLOCKGRIPLOCATIONCOMPONENT, как я уже писал - объект с данными о расположении ручки.

Следующий код 92 - Первый в строчке с 92 кодами - номер данного объекта в иерархии зависимости-принадлежности, или другими словами маркер места в родословной. Что такое родословная и как она выглядит у людей, думаю, что знают даже школьники. В объекте ...ACTION в случае управления им цепочкой параметров указывает на вторую запись расширенных данных перевого в цепочке управляемого параметра.

Следующий код 92 - Второй в строчке с 92 кодами - дополнительный, второй маркер места. Служит для указания "приемного" родителя которым как правило выступают ...ACTION. Главным родителем всегда выступает ...GRIP. Если у объекта нет ACTION, то первая пара 92 и вторая равны. То есть имеют один и тот же код.
В объекте ...ACTION в случае управления им цепочкой параметров указывает на вторую запись расширенных данных последнего в цепочке управляемого параметра.

Следующий код 92 - Третий в строчке с 92 кодами - Указатель на дочерний компонент №1. Если эта пара принадлежит элементу ...PARAMETER, то это указатель на дочерний компонент "UpdatedX", то есть положение по X. Если это ...GRIP или ...ACTION, то это указывает на дочерний компонет ...PARAMETER.

Следующий код 92 - Четвертый в строчке с 92 кодами - Указатель на дочерний компонент №2. Если эта пара принадлежит элементу ...PARAMETER, то это указатель на дочерний компонент "UpdatedY", то есть положение по Y. Если это ...GRIP или ...ACTION, то это указывает на дочерний компонет ...PARAMETER.
Исключением является объект LOOKUP, где в случае цепочки LOOKUP-ов эта точечная пара указывает на продолжение расширенной записи, а там уже на компонент "UpdatedY".

В случает если это ...GRIP или ...ACTION, последние два 92 кода всегда одинаковые и указывают на одно и то же.

Если в точечной паре стоит код -1, это значит, что данная точечная пара не содержит информации о принадлежности.

После окончания описания всех свойств записями (93 . 32) идут записи (93 . 0), которые являются расширенными данными о принадлежности элементов друг-другу. Эти записи привязаны к основным по коду маркера положения в родословной.

Код:
[Выделить все]
(92 . 0) (93 . 0) (94 . 1) (91 . 1) (91 . 0) (92 . -1) (92 . -1) (92 . -1) (92 . -1) (92 . -1) 
(92 . 1) (93 . 0) (94 . 1) (91 . 0) (91 . 2) (92 . -1) (92 . -1) (92 . -1) (92 . 2) (92 . -1) 
(92 . 2) (93 . 0) (94 . 1) (91 . 0) (91 . 3) (92 . -1) (92 . -1) (92 . 1) (92 . -1) (92 . -1))
Первый код 92 - Указатель на маркер элемента (первая или вторая точеная пара 92 в строке из четырех точечных пар). Это говорит, что данная запись принадлежит именно этому элементу.

Второй код 93 - тип записи.
Третий код 94 - понятия не имею. Всегда 1.

Далее идут два 91 кода -
Первый - указатель на номер 32-ой записи элемента-родителя.
Второй - указатель на номер собственной 32-ой записи.

Далее идут пять 92 кодов -

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

Второй - указатель на дополнительный маркер записи элемента. Точечная пара второго 92 кода в элементе, которому пренадлежит данная расширенная запись. Если такового нет, то значение -1. В дополнительных расширенных данных (вторая запись) указывает на дополнительные расширенные данные следующего в цепочке элемента.

Первая и вторая точечная пара с 92 кодом заполняются значениями только тогда, когда есть "приемный родитель", то есть у элемента ...RAMETER есть связь с элементом ...ACTION. В остальных случаях обе пары всегда -1.

Третий
- В расширенной записи "UpdatedY" Указатель на связь с "UpdatedX"
- В расширенной записи "Lookup" указатель на расширенные данные преидующего в цепочке Lookup-a (см. далее).

Четвертый
- В расширенной записи "UpdatedX" Указатель на связь с "UpdatedY"
- В расширенной записи "Lookup" указатель на расширенные данные
следущего в цепочке Lookup-a (см. далее).

Третий и четвертый код во всех остальных расширенных данных всегда -1 (во всяком случае, я не обнаружил других данных).

Пятый
- В случае наличия цепочки связей на связь предидущей или следующей записи дополнительных расширенных данных (2-я запись).

BLOCKVISIBILITYPARAMETER не имеет ACTION. Вообще. Только GRIP и два BLOCKGRIPLOCATIONCOMPONENT.
...GRIP не имеет расширенных данных и значения первых двух 92 кодово в 32-ой записи всегда -1.

Последний раз редактировалось Supermax, 03.11.2008 в 11:25.
Supermax вне форума  
 
Непрочитано 14.09.2008, 00:15
#8
Кулик Алексей aka kpblc
Moderator

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


Пока не забыл: третий путь "добраться до словаря" надо?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.09.2008, 08:49
#9
Supermax

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


Цитата:
третий путь "добраться до словаря" надо?
Я тебя не понимаю. Ты это о чем?
Supermax вне форума  
 
Автор темы   Непрочитано 14.09.2008, 09:58
#10
Supermax

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


Вернемся к 96 и 97 коду в словаре ACAD_EVALUATION_GRAPH.
Они всегда равны. Почему их два - не знаю. Показывают оба на номер создания последнего свойства (код точечной пары в 32 записи 95). Это тот, который менять нельзя. Если нужно добавить свойство в словарь, чтобы его всего не перелопачивать (а в нем ого-го сколько может быть всего) достаточно найти эти коды и прибавив 1 создать новую запись.

Теперь поговорим о перестановках свойств местами.
У этого словаря есть одна особенность: Если переставить 32 или 0-вые записи местами, то есть целиком, вместе с номером, то после модификации словаря функцией entmod и после прочтения этого словаря заново, мы с удивлением обнаружим, что все опять вернулось на свои места. То есть последовательность расположения записей в словаре строго по порядку.
Но, если взять и поменять местами только номера 32 записей и везде, где на них есть ссылка, то после entmod и повторного прочтения мы увидим, что порядок следования записей строго по возростанию, но вот начинка этих записей поменялась местами.
В списке свойств панели properties это к перемещению свойств местами не приведет. Для того, чтобы поменять свойства местами в этой панели, надо после обмена между двумя записями их номерами открыть функцией entnget то свойство, которое мы перемещаем (любое из двух) и выбросив из него DXF коды, препятствующие проведению entmod сделать ему это самое entmod.
Может быть достаточно просто блоку сделать entmod, не пробовал.
Теперь про функцию vla-getdynamicblockproperties: Она дает список свойств блока в той последовательности, в которой они отображены в панели properties. Но после наших манипуляций в панели будет одно, а в списке, возвращаемом этой функцией - старое. Чтобы и в нем поменялась последовательность расположения свойств, надо сделать entmod всему блоку.
Вот и вся технология по перемещению свойств местами.

Последний раз редактировалось Supermax, 15.09.2008 в 00:38.
Supermax вне форума  
 
Автор темы   Непрочитано 14.09.2008, 13:40
#11
Supermax

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


Словарь "BLOCKVISIBILITYPARAMETER".
Для начала создаем простенький блок, содержащий, скажем, три примитива: Линию, полилинию и круг. в блоке устанавливаем Visibility Set и больше ничего.
Вложения
Тип файла: dwg
DWG 2004
Пример1.dwg (29.5 Кб, 14309 просмотров)

Последний раз редактировалось Supermax, 14.09.2008 в 13:50.
Supermax вне форума  
 
Автор темы   Непрочитано 14.09.2008, 14:19
#12
Supermax

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


Вот код выковыривания из "ACAD_EVALUATION_GRAPH" свойства "BLOCKVISIBILITYPARAMETER"
Код:
[Выделить все]
(mapcar '(lambda (x) 
  (if (and (= (car x) 360) 
           (= (cdr (assoc 0 (entget (cdr x)))) "BLOCKVISIBILITYPARAMETER"))
      (setq BLC-VIS-PAR (entget (cdr x))))) EVAL_GRAPH)
В переменную BLC-VIS-PAR записано содержимое "BLOCKVISIBILITYPARAMETER".

Вот его словарь "ACAD_EVALUATION_GRAPH"
Код:
[Выделить все]
((-1 . <Entity name: 7c702330>) 
(0 . "ACAD_EVALUATION_GRAPH") 
(5 . "20E") 
(102 . "{ACAD_REACTORS") (330 . <Entity name: 7c702328>) (102 . "}") 
(330 . <Entity name: 7c702328>) 
(100 . "AcDbEvalGraph") 
(96 . 8) 
(97 . 8) 
(91 . 0) (93 . 32) (95 . 5) (360 . <Entity name: 7c702340>) (92 . 0) (92 . 0) (92 . 1) (92 . 2) 
(91 . 1) (93 . 32) (95 . 6) (360 . <Entity name: 7c702348>) (92 . -1) (92 . -1) (92 . 0) (92 . 0) 
(91 . 2) (93 . 32) (95 . 7) (360 . <Entity name: 7c702350>) (92 . 1) (92 . 1) (92 . -1) (92 . -1) 
(91 . 3) (93 . 32) (95 . 8) (360 . <Entity name: 7c702358>) (92 . 2) (92 . 2) (92 . -1) (92 . -1) 

(92 . 0) (93 . 0) (94 . 1) (91 . 1) (91 . 0) (92 . -1) (92 . -1) (92 . -1) (92 . -1) (92 . -1) 
(92 . 1) (93 . 0) (94 . 1) (91 . 0) (91 . 2) (92 . -1) (92 . -1) (92 . -1) (92 . 2) (92 . -1) 
(92 . 2) (93 . 0) (94 . 1) (91 . 0) (91 . 3) (92 . -1) (92 . -1) (92 . 1) (92 . -1) (92 . -1))
А вот и его "BLOCKVISIBILITYPARAMETER"
Код:
[Выделить все]
((-1 . <Entity name: 7c702340>) 
(0 . "BLOCKVISIBILITYPARAMETER") 
(330 . <Entity name: 7c702330>) 
(5 . "218") 
(100 . "AcDbEvalExpr") 
(90 . 5) 
(98 . 27) 
(99 . 1) 
(100 . "AcDbBlockElement") 
(300 . "Visibility State") 
(98 . 27) 
(99 . 1) 
(1071 . 16) 
(100 . "AcDbBlockParameter") 
(280 . 1) 
(281 . 0) 
(100 . "AcDbBlock1PtParameter") 
(1010 1121.97 306.361 0.0) 
(93 . 6) 
(170 . 0) 
(171 . 0) 
(100 . "AcDbBlockVisibilityParameter") 
(281 . 1) 
(301 . "Visibility") 
(302 . "") 
(91 . 0) 
(93 . 3) 
(331 . <Entity name: 7c702310>) (331 . <Entity name: 7c702318>) (331 . <Entity name: 7c702320>) 
(92 . 1) 
(303 . "VisibilityState0") 
(94 . 3) 
(332 . <Entity name: 7c702310>) (332 . <Entity name: 7c702318>) (332 . <Entity name: 7c702320>) 
(95 . 0))
Supermax вне форума  
 
Автор темы   Непрочитано 14.09.2008, 21:02
#13
Supermax

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


Рассотрим эти коды:
Начиная с кода -1 и по код 302 только три кода имеют интерес, это коды 280, 300 и 301.
280 - видимость параметра Visibility в списке свойств меню Properties. 1 - видим, 0 - нет. (добавлено)
300 - наименование параметра Parameter name из списка свойств объекта Visibility Set. Если открыть редактор блока и подсветить ручками объек Visibility Set, то в талице свойств вы найдете этот папаметр и можете его отредактировать.
301 - там же Visibility label . То, что мы видим в редакторе блоков написанное на объекте Visibility Set.
302 - там же Visibility description Тоже текстовая строка. Обозначение в списке свойств блока наименования раскрывающегося списка Visibility Set. То, что пишется слева от раскрывающегося списка.

И забегая немного вперед 303 - Наименование представления видимости. Таких 303 столько, сколько у вас в списке представлений.
Все остальные коды до 91 не имеют особого интереса для пионеров по ковырянию блоков.

91 код - не известно (изменено)
93 код (не путать с 93 кодом в начале списка) - количество графических и текстовых элементов в блоке, включая и атрибуты. Общее так сказать количество элементов.
За этим кодом следует 331 коды с указателями на сами элементы. Свойств в этом списке нет. Для чего иметь этот перечень расскажу позже.
92 код - количество представлений в данном Visibility Set-e. (исправлено)
А вот дальше - самое интересное.
303 код - имя представления (самое первое представление в данном списке имеет №0)
94 код - количество элементов в этом представлении
332 коды - перечень указателей на те элементы, которые видны в этом представлении.
95 код - количество свойств видимых в этом представлении (свойство Visibility Set не считается)
И если помимо Visibility Set есть еще какие-нибудь свойства, то далее идут 333 коды с указателями на эти свойства.

Если представлений много, то запись 303, 94, 332-е, 95, 333-ие повторяется и повторяется.
Если в представлении нет элементов, то есть (94 . 0), то и 332 кодов тоже нет. Если в представлении нет свойств, то есть (95 . 0), то и 333 кодов тоже нет.

Последний раз редактировалось Supermax, 08.02.2009 в 16:12.
Supermax вне форума  
 
Автор темы   Непрочитано 15.09.2008, 00:17
#14
Supermax

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


Теперь коротко что и для чего сделано.
Полный список элементов блока, как и свойств его нужен чтобы видимость выключать при переходе из одного представления в другое, а список элементов в записи под именем представления для того, чтобы видимость элементам включать. То есть Автокад при каждом переключении видимости сначала все, что в записи с 331 кодами и все свойства блока выключает, а затем по записи с 332 кодами и 95-ми следующими после точечной пары с именем представления, все что там указано включает.

Я удалял из списка всех элементов и из списка элементов в записи представления отдельный элемент (поменяв при этом и значение 93 и 94 точечной пары с количеством элементов на меньшее) и все именно так и работает. То есть есть реальная возможность частью элементов блока управлять из одного "BLOCKVISIBILITYPARAMETER", а частью из другого и они не будут мешать друг другу (если только в общих списках не будет одинаковых элементов).

То, что редактор блока не в состоянии обрабатывать несколько Visibility Set-ов не беда, при помощи не хитрой программы все разруливается самым наилучшим способом.

Если в пространстве редактора блока функцией entget открыть примитив, то его -1 код и есть тот 331 и 332 код в этом словаре.
360 коды функций, в словаре "ACAD_EVALUATION_GRAPH" и есть 333 коды в словаре "BLOCKVISIBILITYPARAMETER".
Чтобы сопоставить функцию (элемент "параметр") из пространства редактора блока с функцией в словаре "BLOCKVISIBILITYPARAMETER", надо перевести -1 код (там только он и есть, один единственный) объекта параметр во вла-объект и прочитав его тип элемента, имя параметра, найти в словаре параметр соответствующий этому типу и имени. Далее по словарю "ACAD_EVALUATION_GRAPH" найти ручку, актион, координаты по X и Y прочесть их 360 коды и найти их в записи словаря "BLOCKVISIBILITYPARAMETER".

Другого способа я не нашел сопоставлять элементы параметров (свойств блока) с их прототипами в словаре "BLOCKVISIBILITYPARAMETER".
Supermax вне форума  
 
Автор темы   Непрочитано 15.09.2008, 09:44
#15
Supermax

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


Последняя информация по теме модернизации динамического блока с целью добавления к нему дополнительных параметров Visibility Set/

Вот, скажем у вас три графических примитива, и вы хотите в разных сочетаниях их включать. Сколько надо представлений?
3 - по одному, 3 - по два, 1 - все видимы и 1 - все не видимы. 8 штук.
2 в степени равной количеству элементов.
А если у вас 6 элементов, то чтобы можно было в любом сочетании их увидеть надо аж 2 в 6-й степени представлений. 64 штуки. Если 9 элементов, то 512 представлений и так далее.
А чтобы то же самое сделать с тремя Visibility Set, надо в каждом из них по 8 представлений то есть только 24 представления вместо 512. Но если сделать на каждый элемент свой Visibility Set, то всего 9 представлений вместо 512. Впечатляет?
Стоит игра свечь?

В Visibility Set можно включать элементы не перечисленные в общем списке. То есть, если по каким-то причинам в другом Visibility Set были выключены свойства или элементы, а надо их включить - пожалуйста.

Если кто заинтересовался - задавайте свои вопросы.
Supermax вне форума  
 
Непрочитано 15.09.2008, 10:23
#16
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Немного не по теме программирования:
С диначискими блоками дружим уже давно и заметил такую проблемку... Когда динамический блок переграмажден свойствами всевозможными, то он заметно притормаживает. Мне например кучу параметров видимости необходимо только для упрощения создания очень сложных и громоздких динамических блоков. Интересно как они себя будут вести... По сути когдато себе представлял огромнейший динамический блок по сути занимающий весь чертеж который будет иметь ну очень много параметров видимости и других параметров. Как он будет работать уже не могу представить...
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Автор темы   Непрочитано 15.09.2008, 11:30
#17
Supermax

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


Все очевидно. Гораздо быстрее обработать блок с 10 Visibility Set, в каждом из которых по одному представлению, чем блок с одним Visibility Set, но с 1024 представлениями. Если элементов в блоке очень много, это надо в каждом представлении перечислять все, что включено.
да простит меня администрация форума
По просьбе автора поста код заменен вложением /kpblc/
Вложения
Тип файла: rar visibilty.rar (6.4 Кб, 654 просмотров)

Последний раз редактировалось Кулик Алексей aka kpblc, 16.10.2008 в 01:25.
Supermax вне форума  
 
Непрочитано 15.09.2008, 12:15
#18
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Supermax, Еще не совсем по теме вопрос:
можно ли сделать связь между двумя дин.блоками. Чтобы свойства одного блока связывались с другими. Например есть блок1 с 3 параметрами видимости и есть блок2 с другими 4 параметрами видимости. Нужно их связать - выбрали в первом блоке параметр видимости 1 - автоматом или после лиспа в другом блоке выбирается параметр видимости 3 например. Возможно ли это вообще? Или это фантазии?
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Автор темы   Непрочитано 15.09.2008, 13:05
#19
Supermax

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


Сделать лисп, который изменяет параметры дин. блока в зависимости от параметров другого дин. блока - раз плюнуть. Только надо чтобы была таблица соответствия сделана и управлять ею можно через "невидимую линию". Это такая линия, которая имеет Linear Stretch параметр, но не видна ни в каких представлениях. Она фигурирует в таблице Lookup и управляет этой таблицей. Какая длинна этой линии, такая строчка Lookup-а задействована.

Два блока, в каждом есть такие линии и они должны быть равны. Вот макрос их и выравнивает. Один блок "ведущий", другой - "ведомый". Ну и третий, четвертый и т.д.
Если установить четкое наименование параметра Linear Stretch, то по нему эти линии и находят.
Макрос будет что-то типа attsync команды. Чтобы отличать одни ведущие блоки от других и знать кто кому подчиняется, имя Linear Stretch должно содержать Постоянную_часть-номер_группы-признак_ведущий\ведомый. Пример: @Dist-1420-0, где @Dist - говорит о том, что это управляющая невидимая линия; 1420 - номер группы; 0 - ведущий (1 - ведомый). Все блоки где @Dist-1420-1 подгоняются под блок где @Dist-1420-0. Другая группа имеет другой номер группы.

Ведущий блок может содержать две невидимые линии. Одна от одной группы в которой он ведущий, а другая от другой, в которой он ведомый. Такие блоки макрос обрабатывает в последнюю очередь.

Есть опасность зацикливания. Когда один блок влияет на второй, тот на третий, а третий на первый. Надо дерево делать и его проверять на отсутствие обратных связей.
Supermax вне форума  
 
Непрочитано 15.09.2008, 14:19
#20
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Короче можно! Уже радует. Supermax, Можешь изобразить простенький пример с сием чудом?

Offtop: Вспоминается игра "Что?Где?Когда?" Там как-то команда "Знатоков" очень сильно проигрывала. И ведущий заметил такой момент: В команде очень большие профессионалы с большим стажем игры. Каждый боится сказать "глупую" идею, что либо предположить. Боятся сказать глупый вариант и потерять авторитет. А в команде должен быть человек, который будет как генератор идей выкидывать постоянно даже бредовые идеи, а профессионалы их "отстреливать" - так у команды больше шансов победить. Почему-то почувствовал себя этим генератором идей
__________________
Поезд который устал от ржавого здравомыслия рельсов...

Последний раз редактировалось Shoorup, 15.09.2008 в 14:30. Причина: оффтоп написал
Shoorup вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Создание дополнительных параметров Visibility Set в динамических блоках.

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как с помощью vba начертить линию vasyavip Программирование 77 09.10.2008 23:17
Femap и VBA Makson Программирование 11 05.08.2008 14:54
Создание списка чертежей из Sheet Set Manager krokh AutoCAD 2 20.06.2008 16:46