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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Объектная модель Автокада (настоящая)

Объектная модель Автокада (настоящая)

Ответ
Поиск в этой теме
Непрочитано 29.12.2009, 16:48 #1
Объектная модель Автокада (настоящая)
Supermax
 
Руководитель фирмы
 
Москва
Регистрация: 28.03.2007
Сообщений: 1,831

Пишу программу для аудита модели, в частности аудита всех блоков модели. Пишу на Автолиспе и AutoIT-e. Там дерево можно сваять. Ну, на чем пишу, натом и пишу, не в этом дело, а дело в том, что дерево вложенности я строю, опираясь на данные ObjectID и OwnerID. И мне открывается странная картина. То дерево, которое нарисовано во всех хелпах по Автокаду - рядом не лежало с тем, что вырисовывается по этим ObjectID и OwnerID.
Я не ребенок и могу отличить папку от ярлыка на эту папку. То, что в интерфейсах многих объектов Автокада понатыкано прямых ссылок на всякие объекты, и даже то, что в некоторых коллекциях их можно найти, не означает, что они принадлежат этому объекту или коллекции.

Вопрос первый: - Может у кого есть реальное дерево вложенности?
Ну скажем, где коллекция Layouts принадлежит коллекции Dictonaries, а не документу, как это намалевано в хелпе?

Вопрос второй:
- В коллекции Blocks есть две подколлекции, "*Papir_Spase" и "*Paper_Space0". Одна - текущий лист, другая - предидущий перед текущим. Каждая из них состоит из элементов данного листа и указателя на конфигурацию данного листа. А где лежат все остальные наборы элементов других листов, не текущего и не предидущего перед текущим? Мне что, надо лист сделать текущим, чтобы добраться до его элементов?
Они вообще где-нибудь есть? Может я какую-нибудь коллекцию пропустил? Может можно через конфигурацию листа из коллекции Layouts как-то добраться до набора элементов листа?
Просмотров: 6833
 
Непрочитано 29.12.2009, 17:45
#2
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Supermax Посмотреть сообщение
А где лежат все остальные наборы элементов других листов
По идеологии Автокада листы, модель, внешние ссылки представляют собой блоки.
Код:
[Выделить все]
(vlax-for Blk (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object)))
  (princ "\nBlock Name=")(princ (vla-get-name Blk))
  )
(terpri)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 29.12.2009, 17:50
#3
Supermax

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


Не, VVA, ты не понял. Я и сам знаю где лежит активный лист, я спрашиваю где остальные лежат?
Когда их не два, а дюжина, как проверить блоки, лежащие в них на соответствие клеше? Каждый лист активным делать?

Не, разобрался. Убил все листы кроме первого и исчез "*Paper_Space0". Когда он был, было три листа, а показывало только "*Paper_Space" и "*Paper_Space0". Добавил еще три листа и теперь "*Paper_Space0" отсутствует, а вместо него появились
"*Paper_Space9" "*Paper_Space10" и "*Paper_Space11". Это их Name такое. Настоящее Name закопано в свойстве Layout.
Все эти "*Paper_Space x " гуляют по массиву листов. Каждый из них, в зависимости от ситуации может представлять той или иной лист. Item только эти "имена" находит, а в свойство Layout и тамошний Name не смотрит.

С "*Paper_Space0" глюки были. Открыл чистый файл и там поэксперементировал. Все путем. Три листа-три папира. Гуляют правда, но это не беда.
Миниатюры
Нажмите на изображение для увеличения
Название: дерево.JPG
Просмотров: 172
Размер:	32.3 Кб
ID:	31304  

Последний раз редактировалось Supermax, 29.12.2009 в 18:39.
Supermax вне форума  
 
Непрочитано 29.12.2009, 18:47
#4
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


>Supermax
Я сейчас делаю нечто подобное (во всяком случае одна из деталей):
Открывается окошко, в котором изначально имеется корневая ветвь BlockTable далее от неё танцую: модель листы и всё содержимое на них. Данные динамически меняются в зависимости от того, добавляется ли объект в файл, изменяется или удаляется. Такая визуальная иерархия, мол у кого откуда ноги растут...

Только я пишу средствами .Net. Если будет интересно - результаты выложу, как только в более-менее удобоваримый вид приведу.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 29.12.2009, 18:58
#5
Supermax

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


Конечно интересно. Это окошко только начало. Справа будет таблица со свойствами блока и атрибутами (даже можно будет их из этой таблицы менять). Будет поиск по данным и анализ заполненности атрибутов.
Для начала надо дерево правильно разворачивать. В коллекции Blocks есть еще и внешние ссылки, а у них своя база. Свои Blocks и ModelSpace.
Вот, бъюсь над этим кусочком.
Жалко дерева нет перед глазами (хотя елка - тоже дерево).
Supermax вне форума  
 
Непрочитано 29.12.2009, 19:05
#6
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Supermax Посмотреть сообщение
Конечно интересно. Это окошко только начало. Справа будет таблица со свойствами блока и атрибутами (даже можно будет их из этой таблицы менять). Будет поиск по данным и анализ заполненности атрибутов.
Для начала надо дерево правильно разворачивать. В коллекции Blocks есть еще и внешние ссылки, а у них своя база. Свои Blocks и ModelSpace.
Вот, бъюсь над этим кусочком.
Жалко дерева нет перед глазами (хотя елка - тоже дерево).
собственно всё это я и делаю. ))) Плюс хочу добавить в обычный автокад возможность создания пользователем групп свойств и назначения их отдельным примитивам или целым типам (подобно тому, как это есть в вертикальных решениях). Затем на основании этой информации + информации в свойствах можно будет извлекать более развёрнутые ведомости и спецификации (посредством LINQ), создавать и сохранять свои фильтры (автокадовские фильтры, к примеру, не могут искать прокси объекты, насколько мне помнится). Фильтры думаю сохранять в вид XSD-схем, а группы свойств - в виде xml данных, причём вся эта петрушка будет сериализоваться в записи словарей (дабы не храниться в отдельных файлах). Отчёты будут получаться специализированным под это дело генератором (уже имеется).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

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

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


Ага, так значит ты тоже за то, чтобы информация об изделии, которое представлено графикой, находилась в самом файле с этой графикой?
Я динамические блоки для этого использую и называю такую графику "виртуальными изделиями", а такие свойсва "приписанными свойствами".
Куда бы файл не перекочевал, он является носителем информации об изделиях в нем указанных. Правда в случае с динамическими блоками - можно и без специальных программ посмотреть свойства блока и увидеть "приписанные свойства". Но, в случае с ObjectARX можно и примочку к Автокаду сделать.
Но, прежде чем делать спецификацию, надо убедиться, что все блоки соответствуют норме, то есть данные выставлены правильно и атрибуты заполнены, а для этого нужна прога.

Очень интересная инфа:
Объект Document имеет ObjectID (RO) = 0
В коллекции Blocks, в блоке-внешней ссылке есть свойство XRefDatabase (RO) = #<VLA-OBJECT IAcadDatabase 0b230fd4>
указывающее на элемент аналогичный объекту Document и так же как и он ObjectID (RO) = 0, но ни в том, ни в другом объектах таких свойств нет. Если сделать (vla-ObjectIDToObject act-doc 0), то получите ; error: Automation Error. Description was not provided.

Если залезть в свойства объекта XRefDatabase и выколупать от туда объект Blocks, то там мы увидим OwnerID (RO) = 0, а ObjectID (RO) = 2128456712 (ну это у меня). Так вот, цифирки 2128456712 эти работают почему-то не с XRefDatabase, как со своим родителем, а с Document-ом (vla-ObjectIDToObject act-doc 2128456712) и находят коллекцию Blocks этой внешней ссылки!

Мне чтобы дерево вырастить у внешней ссылки приходится этот XRefDatabase игнорировать и коллекции Blocks в него входящей присваивать OwnerID как ObjectID у блока внешней ссылки.

Вот интересно а как ты эту проблему решил?

Последний раз редактировалось Supermax, 29.12.2009 в 19:46.
Supermax вне форума  
 
Непрочитано 30.12.2009, 00:30
#8
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Supermax Посмотреть сообщение
Вот интересно а как ты эту проблему решил?
Я не заморачивался с такими вопросами и, честно говоря, из написанного не многое понял.
Касательно визуального представления структуры файла - главное (имхо) чтобы было наглядно представлено кто кому родитель. На вскидку созданное мною визуальное древо выглядит примерно так (результат получен программно):



Как видим, в древе я объединяю примитивы по подгруппам в соответствии с их типом, дабы было некоторое подобие порядка, а те, в свою очередь, располагаются в составе записей таблицы блоков (как это визуально и видно)... На мой взгляд так удобней читается содержимое.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 30.12.2009 в 00:41.
hwd вне форума  
 
Непрочитано 30.12.2009, 01:19
#9
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Offtop: Supermax
а на кой ляд пользователю такое растение? ему глубоко наплевать в каком *паперспейсN лежит его блок, он его видит на чертеже и доволен. Такое дерево помойму только програмисту для отладки годится.
пользователь будет рад увидив наподобии

этаж 1
|-помещение 1
| |-стол
| |-стул
|
|-помещение 2
| |-елка
| |-стол
| | |-водка 0.7 х2
| |-стул
| | |-снегурочка
............

ты предлагаешь ему самому организовывать подобное паперспейсами и хрефами?

Последний раз редактировалось zamtmn, 30.12.2009 в 01:28.
zamtmn вне форума  
 
Непрочитано 30.12.2009, 08:51
#10
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от zamtmn Посмотреть сообщение
а на кой ляд пользователю такое растение?
Данное "растение" как раз и предназначено для того, чтобы в конечном счёте пользователь мог получать ведомости типа:
Цитата:
Сообщение от zamtmn Посмотреть сообщение
этаж 1
|-помещение 1
| |-стол
| |-стул
|
|-помещение 2
| |-елка
| |-стол
| | |-водка 0.7 х2
| |-стул
| | |-снегурочка
............
Основную массу необходимых действий юзер будет выполнять мышью. К примеру: выделить либо на чертеже либо в древе все нужные ему объекты и перетащит мышью на поле "Группы" (на скрине отсутствует) - тем самым создав своеобразную именованную группу (я реализую это не в виде автокадовской группы, т.к. порой хочется оперировать группами в редакторе блоков, а группы автокада там не работают, насколько мне помнится). Если пользователь планирует данный набор объектов юзать и в дальнейшем - имхо данный способ его создания удобен. Выделяя объекты в визуальном дереве они будут на чертеже либо подсвечиваться, либо сразу выделяться ручками, в зависимости от желания пользователя. Кроме того, данные группы можно будет использовать в процессе работы команд в качестве объектов выбора. В этом же окошке будет присутствовать визуальный построитель запросов, на основе которого состав выборки можно будет генерировать автоматически. Это похоже на команду _filter, но всё же это не она, поскольку она не со всеми типами объектов работает (прокси-объекты с ней не выбрать). Запросы так же можно сохранять. Поскольку результат запроса на программном уровне я легко могу предоставить в виде того же xml, и автоматически получить на его основе xsd-схему, данный момент позволяет отправить эти два элемента в генератор отчёта, в котором даже не самый продвинутый пользователь сможет визуально состряпать себе нужный бланк, и сохранив его юзать в дальнейшем. Т.о. я внедряю в САПР генератор отчётов (на самом деле это очень мощная и удобная штука - пользуюсь ею не один год). Про наборы пользовательских свойств я уже писал выше. Т.о. Юзеру будут предоставлены неплохие инструменты жонглирования данными и получения на их основе отчёта любого вида. Далее всё будет зависеть от соображалки юзера: насколько грамотно он будет организовывать чертёж - настолько просто ему будет извлекать информацию в виде отчётов и ведомостей. Причём вся эта петрушка динамическая, т.е. после того, как юзер внесёт изменения в чертёж - всё динамически обновляется. При желании результаты легко можно будет экспортировать во внешние приложения. На данный момент перечень таких приложений следующий (список не полный, там внизу ещё три формата, просто у меня на скрине не вмещается):



Ну и, конечно же, результаты запросов можно будет сохранять в таблицах автокада. Причем будет добавлена возможность создания своеобразных стилей таблиц, в которых заранее будут сформированы "шапки".

п.с. Во всяком случае, мне всё это видится именно так. Возможно Supermax в своём решении всё видит иначе.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 30.12.2009 в 10:31.
hwd вне форума  
 
Непрочитано 30.12.2009, 10:09
#11
чеснок


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


hwd, назвал бы инструменты с помощью которых такаую красоту получить можно, уж больно необычно.
чеснок вне форума  
 
Непрочитано 30.12.2009, 10:14
#12
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от чеснок Посмотреть сообщение
hwd, назвал бы инструменты с помощью которых такаую красоту получить можно, уж больно необычно.
WPF. На самом деле это далеко не красота, а пяти минутная наколенная поделка... Возможности этой технологии весьма впечатляющие (при желании можно без проблем создавать совершенно любые интерфейсы, всё ограничено лишь умением/фантазией разработчика). Просчёт GUI осуществляется видеокартой, а не ЦП, за счёт чего работает шустро и красиво даже на слабых компах. На самом деле я хочу связать ядро программы не с конкретным GUI, а с interface, посредством которого можно было бы использовать совершенно разные GUI (например GUI написанные на WinForms или на GTK).

п.с. интерфейсы 2009/2010 автокадов сделаны в WPF (во всяком случае графическая часть) - в этом можно убедиться программно, просмотрев какие сборки загружены в основной процесс автокада.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 30.12.2009 в 10:33.
hwd вне форума  
 
Непрочитано 30.12.2009, 10:48
#13
чеснок


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


hwd, Что, просто стандартный wpf, без сторонних инструментов. Здорово, надо переползать. А какую версию NET используешь?

Надеюсь тема будет развиваться, и open-source результат будет ).
Столкнулся с проблемой обработки событий изменений на чертеже.
События Database: ObjectAppended, ObjectErased, ObjectReappended, ObjectUnappended,
ObjectModified, ObjectOpenedForModify.
Толком не разобрался что, когда, зачем происходит.
А еще достают вспомогательные элементы при манипуляциях на чертеже. Их нужно фильтровать отдельно. При вкл. динамичности, что происходит, вообще атас.
чеснок вне форума  
 
Непрочитано 30.12.2009, 10:56
#14
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от чеснок Посмотреть сообщение
hwd, Что, просто стандартный wpf, без сторонних инструментов?
да
Цитата:
Сообщение от чеснок Посмотреть сообщение
hwdА какую версию NET используешь?
для wpf должна быть не ниже 3.0.
я использую 3.5.
Цитата:
Сообщение от чеснок Посмотреть сообщение
hwd
Надеюсь тема будет развиваться, и open-source результат будет ).
Не знаю, посмотрим. Если все будут переползать на облачные вычисления и настольные приложения отойдут в мир иной - то вряд ли, хотя аналогия wpf для интернета - SilverLight (урезанный вариант WPF).

Цитата:
Сообщение от чеснок Посмотреть сообщение
hwd
Столкнулся с проблемой обработки событий изменений на чертеже.
События Database: ObjectAppended, ObjectErased, ObjectReappended, ObjectUnappended,
ObjectModified, ObjectOpenedForModify.
Толком не разобрался что, когда, зачем происходит.
А еще достают вспомогательные элементы при манипуляциях на чертеже. Их нужно фильтровать отдельно. При вкл. динамичности, что происходит, вообще атас.
Сегодня буду вешать обработчики событий - посмотрю, что у меня самого получится...

чем дальше, тем страшнее...

__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 30.12.2009 в 13:29.
hwd вне форума  
 
Автор темы   Непрочитано 04.01.2010, 17:43
#15
Supermax

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


Да... !!! Красочные разговоры пошли, надо будет поддержать.
Опять верну людей на дерево проблем.
Есть вот такое дерево:


В коллекции, как видите, есть внешняя ссылка, а в ней коллекция Blocks, в которой лежат папирспейсы, моделспейс и блоки, но блоки эти имеют ObjectID и OwnerID коллекции Blocks основного документа, то-есть являются копиями. Машина тупо их в эту коллекцию и вставила (повторно). Я могу их "вернуть" обратно, но мне придется сделать липовую ветку "копии", что делать не хотелось бы, или по примеру hwd приписывать к таким блокам ObjectID и OwnerID. Метку приписывать бесполезно, она во внешней ссылке соответствует метке в файле внешней ссылки.
Как я и писал ранее, есть в коллекциях не только блоки принадлежащие этим коллекциям, но и копии из других коллекций. Я в дипрессии и не знаю что с этими копиями делать. Ранее хотел полное дерево вложенноти наваять, а теперь меня вынуждают думать, а это не очень приятно.

У меня несколько иная цель создания древаCada.
Есть модель и есть коллекция Blocks. Не все блоки из коллекции Blocks есть в самой модели, хотя модель сама, как блок, входит в коллекцию Blocks. Если проводить аудит блоков, то есть проверять их на наличие определенных данных в свойствах и атрибутах, а в коллекции Blocks наличие определенных блоков, внешних ссылок и их состояние, то надо как-то представить содержимое и модели и коллекции Blocks. Вот я и выбрал элемент TreeView, который может красиво показывать любое дерево вложенности.
Мне надо, указав нужное наименование свойства (приписанного, из динамических свойств) или атрибута, подсветить все элементы дерева, которые содержат данное свойство и показать где оно заполенено и чем. Если есть не заполненные графы - показать отдельно.
Ткнув в элемент дерева увидеть его в модели. Создав список всех свойств и наименований атрибутов, поочередно проверить их на предмет прохождения через фильтр. Для каждого свойства - свой фильтр. Может еще расширенные данные показывать, или приписанные данные из словаря - пока не ведаю.
Моя цель - создание инструмента, который бы мне быстро помог заполнить все незаполненное и проверить все на предмет корректности. Только после этого в бой вступает тяжелая артиллерия и создается спецификация.
Миниатюры
Нажмите на изображение для увеличения
Название: аудитор.jpg
Просмотров: 800
Размер:	41.5 Кб
ID:	31437  

Последний раз редактировалось Supermax, 04.01.2010 в 18:39.
Supermax вне форума  
 
Непрочитано 04.01.2010, 23:35
#16
Кулик Алексей aka kpblc
Moderator

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


Supermax, ты опять не туда сворачиваешь, по-моему.
Во-первых, копиями ничто там не является (разберись наконец с понятиями описания блока и вхождения блока - это принципиально разные вещи). Во-вторых, фраза
Цитата:
Сообщение от Supermax Посмотреть сообщение
Метку приписывать бесполезно, она во внешней ссылке соответствует метке в файле внешней ссылки.
Что подразумевается под "меткой"? Handle? Тут есть два варианта: либо хендл объекта в источнике повторяется в файле-получателе, либо нет. В первом случае возможно дублирование хендлов (только что такое видел, сам сначала не поверил), либо хендлы объектов в файле-сборнике будут меняться (и такое я тоже получал). В первом случае, можно сказать, нереально получить объект по хендлу, т.к. получение объекта по хендлу будет возвращать "не тот объект", либо сам хендл будет "не тот" со всеми вытекающими. Для примера в новом файле создай пару отрезков и выполни
Код:
[Выделить все]
(alert (vla-get-handle (vlax-ename->vla-object (car (nentsel)))))
или
Код:
[Выделить все]
(alert (cdr (assoc 5 (entget (car (nentsel))))))
что то же самое. Потом файл сохрани и в новом файле нарисуй 3-4 отрезка и окружности, вставь внешней ссылкой предыдущий файл и снова выполни код. Наверняка у тебя хендл поменяется. А если нет, то проверяй хендлы уже нарисованных объектов.
Поэтому подход hwd с использованием ObjectID и OwnerID не только правилен, но и единственно возможен (для гарантированно верной работы, конечно).
Далее.
Цитата:
Сообщение от Supermax Посмотреть сообщение
Если проводить аудит блоков
Ты собираешься проводить аудит описаний блоков или их вхождений? Потому что проверять наличие определенных свойств (не путать со значениями динамических свойств!) надо в описаниях блоков, а данных в атрибутах - во вхождениях.
Цитата:
Сообщение от Supermax Посмотреть сообщение
создание инструмента, который бы мне быстро помог заполнить все незаполненное и проверить все на предмет корректности
А вот это уже из разряда ненаучной фантастики, особенно для варианта работы с внешними ссылками: ты заменить какой-то параметр, может быть, и заменишь. До первой перезагрузки ссылки.
---
Возвращаясь к первоначальному вопросу:
Цитата:
Сообщение от Supermax Посмотреть сообщение
Ну скажем, где коллекция Layouts принадлежит коллекции Dictonaries, а не документу, как это намалевано в хелпе?
Код:
[Выделить все]
_$ (setq  adoc (vla-get-ActiveDocument (vlax-get-acad-object)))
#<VLA-OBJECT IAcadDocument 01f1f158>
_$ (vlax-dump-Object adoc)
; IAcadDocument: An AutoCAD drawing
; Property values:
; <...>
;   Layers (RO) = #<VLA-OBJECT IAcadLayers 072f8a7c>
;   Layouts (RO) = #<VLA-OBJECT IAcadLayouts 072f8acc>
;   Limits = (0.0 0.0 420.0 297.0)
; <...>
_$
Цитата:
Сообщение от Supermax Посмотреть сообщение
А где лежат все остальные наборы элементов других листов, не текущего и не предидущего перед текущим? Мне что, надо лист сделать текущим, чтобы добраться до его элементов?
Нет, делать не надо.
Код:
[Выделить все]
(defun test (/ blk)
  (vl-load-com)
  (vlax-for layout (vla-get-layouts
                     (vla-get-activedocument (vlax-get-acad-object))
                     ) ;_ end of vla-get-layouts
    (princ
      (strcat
        "\nLayout Name : "
        (vla-get-name (setq blk (vla-get-block layout)))
        "\nLayut count : "
        (vl-princ-to-string (vla-get-count blk))
        ((lambda (/ res)
           (vlax-for ent blk
             (setq res (cons ent res))
             ) ;_ end of vlax-for
           (setq res (mapcar
                       (function
                         (lambda (x)
                           (strcat "\n** ObjectName : "
                                   (vla-get-objectname x)
                                   "\n** ObjectHandle : "
                                   (vla-get-handle x)
                                   ) ;_ end of strcat
                           ) ;_ end of lambda
                         ) ;_ end of function
                       res
                       ) ;_ end of mapcar
                 ) ;_ end of setq
           (if res
             (strcat
               "\nLayout Contents : "
               (apply (function strcat) (mapcar (function strcat) res))
               ) ;_ end of strcat
             "\nLayout is empty"
             ) ;_ end of if
           ) ;_ end of lambda
         )
        ) ;_ end of strcat
      ) ;_ end of princ
    ) ;_ end of vlax-for
  (princ)
  ) ;_ end of defun
Вот и все... Остальные посты, каюсь, проглядел "по диагонали" - много с телефона не наглядишь...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.01.2010, 15:08
#17
Supermax

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


aka kpblc, не надо юзать темы по телефону! Это надо записать в правила форума. Ты не только по диагонали смотрел, а еще и штрих-пунктиром.
1. Это hwd использует ObjectID и Handle, а я ObjectID и OwnerID.
2. Есть коллекция Blocks основного документа, а еще есть коллекция Blocks в XRefDatabase блока внешней ссылки и вот там лежат не вхождения, а копии, абсолютные, до последнего бита, из коллекции Blocks основного документа. Кроме блоков *Paper_Space и *Model_space, разумеется. Эти блоки родом из этой внешней ссылки, поэтому их мы тут и видим, но их ObjectID и OwnerID указывают на принадлежность этих блоков к основной коллекции Blocks. Поэтому их мой любимый макрос и запузырил вместо ветки у внешней ссылки в корнь коллекции Blocks.
3. Если ты поколупаешь эту XRefDatabase, и в частности обратишь внимание на Handle элементов из *Model_space, то убедишся, что их Handle не принадлежит активному документу, где уже есть такие Handle, но у совсем других элементов, и (vla-HandleToObject надо делать не с act-doc, а с XRefDatabase, который и есть act-doc для своих элементов.
А вот ObjectID у элементов входящих в XRefDatabase внешней ссылки глобальный и уникальный для всей сборки из всех элементов, включая и внешние ссылки. Поэтому (vla-ObjectIDToObject act-doc хххххххххх) добывает любые элемнты из любого уровня вложенности и из XRefDatabase внешних ссылок.
4. Я собираюсь проводить аудит всех блоков, и вхождений, и копий, и оригиналов. Каждому виду свои проверки.
Ну, зачем проверять вхождения - понятно, а вот коллекцию зачем проверять? - Отвечаю: Любой блок можно сделать безимянным, тобишь стереть в коллекции оригинал. Ну так вот, это первая проверка. Вторая - опись базы самой коллекции и в частности не примененных блоков. Сколько, какие, что из себя представляют и естественно чистка с локализацией ненужного.
5. Я не собираюсь заменять параметры у блоков. Мне надо только проверять, чтобы в свойствах блока (динамических) небыло значения Custom. Чтобы атрибуты были нужные и чтобы они были заполнены.
6. Первоначальный вопрос был:
Цитата:
Может у кого есть реальное дерево вложенности?
Ну скажем, где коллекция Layouts принадлежит коллекции Dictonaries, а не документу, как это намалевано в хелпе?
В частности коллекция Layouts входит в коллекцию Dictonaries, то есть является ее дитем, хотя указатель на нее мы можем найти во многих элементах объектной модели. В хелпе, там где структурная схема, ей ноги нарисовали от самого документа.
Вот бы настоящую схемку сваять
7. С листами я давно разобрался. см пост #3
Supermax вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Объектная модель Автокада (настоящая)

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужна 3D модель человека для Автокада niki Поиск литературы, чертежей, моделей и прочих материалов 13 02.04.2013 14:30
Расчетная модель каркасного здания со стеновым заполнением aldt Расчетные программы 5 12.03.2012 08:45
Как оптом сохранить все чертежи в формате 14-го автокада? Соня AutoCAD 26 20.03.2011 14:59
Предложения по расчетным моделям сооружений aldt Расчетные программы 8 06.07.2009 17:53
Проектирование КЖ в объеме. Haos Другие CAD системы 265 20.06.2009 22:50