|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
29.12.2009, 16:48 | #1 | |
Объектная модель Автокада (настоящая)
Руководитель фирмы
Москва
Регистрация: 28.03.2007
Сообщений: 1,831
|
||
Просмотров: 6849
|
|
||||
По идеологии Автокада листы, модель, внешние ссылки представляют собой блоки.
Код:
__________________
Как использовать код на Лиспе читаем здесь |
||||
|
||||
Не, 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" глюки были. Открыл чистый файл и там поэксперементировал. Все путем. Три листа-три папира. Гуляют правда, но это не беда. Последний раз редактировалось Supermax, 29.12.2009 в 18:39. |
||||
|
||||
>Supermax
Я сейчас делаю нечто подобное (во всяком случае одна из деталей): Открывается окошко, в котором изначально имеется корневая ветвь BlockTable далее от неё танцую: модель листы и всё содержимое на них. Данные динамически меняются в зависимости от того, добавляется ли объект в файл, изменяется или удаляется. Такая визуальная иерархия, мол у кого откуда ноги растут... Только я пишу средствами .Net. Если будет интересно - результаты выложу, как только в более-менее удобоваримый вид приведу.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
|
||||
Конечно интересно. Это окошко только начало. Справа будет таблица со свойствами блока и атрибутами (даже можно будет их из этой таблицы менять). Будет поиск по данным и анализ заполненности атрибутов.
Для начала надо дерево правильно разворачивать. В коллекции Blocks есть еще и внешние ссылки, а у них своя база. Свои Blocks и ModelSpace. Вот, бъюсь над этим кусочком. Жалко дерева нет перед глазами (хотя елка - тоже дерево). |
||||
|
||||
Цитата:
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: Последний раз редактировалось hwd, 29.12.2009 в 19:11. |
||||
|
||||
Ага, так значит ты тоже за то, чтобы информация об изделии, которое представлено графикой, находилась в самом файле с этой графикой?
Я динамические блоки для этого использую и называю такую графику "виртуальными изделиями", а такие свойсва "приписанными свойствами". Куда бы файл не перекочевал, он является носителем информации об изделиях в нем указанных. Правда в случае с динамическими блоками - можно и без специальных программ посмотреть свойства блока и увидеть "приписанные свойства". Но, в случае с 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. |
||||
|
||||
Я не заморачивался с такими вопросами и, честно говоря, из написанного не многое понял.
Касательно визуального представления структуры файла - главное (имхо) чтобы было наглядно представлено кто кому родитель. На вскидку созданное мною визуальное древо выглядит примерно так (результат получен программно): Как видим, в древе я объединяю примитивы по подгруппам в соответствии с их типом, дабы было некоторое подобие порядка, а те, в свою очередь, располагаются в составе записей таблицы блоков (как это визуально и видно)... На мой взгляд так удобней читается содержимое.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: Последний раз редактировалось hwd, 30.12.2009 в 00:41. |
||||
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
|
Offtop: Supermax
а на кой ляд пользователю такое растение? ему глубоко наплевать в каком *паперспейсN лежит его блок, он его видит на чертеже и доволен. Такое дерево помойму только програмисту для отладки годится. пользователь будет рад увидив наподобии этаж 1 |-помещение 1 | |-стол | |-стул | |-помещение 2 | |-елка | |-стол | | |-водка 0.7 х2 | |-стул | | |-снегурочка ............ ты предлагаешь ему самому организовывать подобное паперспейсами и хрефами? Последний раз редактировалось zamtmn, 30.12.2009 в 01:28. |
|||
|
||||
Данное "растение" как раз и предназначено для того, чтобы в конечном счёте пользователь мог получать ведомости типа:
Цитата:
Ну и, конечно же, результаты запросов можно будет сохранять в таблицах автокада. Причем будет добавлена возможность создания своеобразных стилей таблиц, в которых заранее будут сформированы "шапки". п.с. Во всяком случае, мне всё это видится именно так. Возможно Supermax в своём решении всё видит иначе.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: Последний раз редактировалось hwd, 30.12.2009 в 10:31. |
||||
|
||||
Цитата:
п.с. интерфейсы 2009/2010 автокадов сделаны в WPF (во всяком случае графическая часть) - в этом можно убедиться программно, просмотрев какие сборки загружены в основной процесс автокада.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: Последний раз редактировалось hwd, 30.12.2009 в 10:33. |
||||
|
||||
Регистрация: 26.10.2009
Сообщений: 55
|
hwd, Что, просто стандартный wpf, без сторонних инструментов. Здорово, надо переползать. А какую версию NET используешь?
Надеюсь тема будет развиваться, и open-source результат будет ). Столкнулся с проблемой обработки событий изменений на чертеже. События Database: ObjectAppended, ObjectErased, ObjectReappended, ObjectUnappended, ObjectModified, ObjectOpenedForModify. Толком не разобрался что, когда, зачем происходит. А еще достают вспомогательные элементы при манипуляциях на чертеже. Их нужно фильтровать отдельно. При вкл. динамичности, что происходит, вообще атас. |
|||
|
||||
да
для wpf должна быть не ниже 3.0. я использую 3.5. Не знаю, посмотрим. Если все будут переползать на облачные вычисления и настольные приложения отойдут в мир иной - то вряд ли, хотя аналогия wpf для интернета - SilverLight (урезанный вариант WPF). Цитата:
чем дальше, тем страшнее...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: Последний раз редактировалось hwd, 30.12.2009 в 13:29. |
||||
|
||||
Да... !!! Красочные разговоры пошли, надо будет поддержать.
Опять верну людей на дерево проблем. Есть вот такое дерево: В коллекции, как видите, есть внешняя ссылка, а в ней коллекция Blocks, в которой лежат папирспейсы, моделспейс и блоки, но блоки эти имеют ObjectID и OwnerID коллекции Blocks основного документа, то-есть являются копиями. Машина тупо их в эту коллекцию и вставила (повторно). Я могу их "вернуть" обратно, но мне придется сделать липовую ветку "копии", что делать не хотелось бы, или по примеру hwd приписывать к таким блокам ObjectID и OwnerID. Метку приписывать бесполезно, она во внешней ссылке соответствует метке в файле внешней ссылки. Как я и писал ранее, есть в коллекциях не только блоки принадлежащие этим коллекциям, но и копии из других коллекций. Я в дипрессии и не знаю что с этими копиями делать. Ранее хотел полное дерево вложенноти наваять, а теперь меня вынуждают думать, а это не очень приятно. У меня несколько иная цель создания древаCada. Есть модель и есть коллекция Blocks. Не все блоки из коллекции Blocks есть в самой модели, хотя модель сама, как блок, входит в коллекцию Blocks. Если проводить аудит блоков, то есть проверять их на наличие определенных данных в свойствах и атрибутах, а в коллекции Blocks наличие определенных блоков, внешних ссылок и их состояние, то надо как-то представить содержимое и модели и коллекции Blocks. Вот я и выбрал элемент TreeView, который может красиво показывать любое дерево вложенности. Мне надо, указав нужное наименование свойства (приписанного, из динамических свойств) или атрибута, подсветить все элементы дерева, которые содержат данное свойство и показать где оно заполенено и чем. Если есть не заполненные графы - показать отдельно. Ткнув в элемент дерева увидеть его в модели. Создав список всех свойств и наименований атрибутов, поочередно проверить их на предмет прохождения через фильтр. Для каждого свойства - свой фильтр. Может еще расширенные данные показывать, или приписанные данные из словаря - пока не ведаю. Моя цель - создание инструмента, который бы мне быстро помог заполнить все незаполненное и проверить все на предмет корректности. Только после этого в бой вступает тяжелая артиллерия и создается спецификация. Последний раз редактировалось Supermax, 04.01.2010 в 18:39. |
||||
|
|||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835
|
Supermax, ты опять не туда сворачиваешь, по-моему.
Во-первых, копиями ничто там не является (разберись наконец с понятиями описания блока и вхождения блока - это принципиально разные вещи). Во-вторых, фраза Цитата:
Код:
Код:
Поэтому подход hwd с использованием ObjectID и OwnerID не только правилен, но и единственно возможен (для гарантированно верной работы, конечно). Далее. Ты собираешься проводить аудит описаний блоков или их вхождений? Потому что проверять наличие определенных свойств (не путать со значениями динамических свойств!) надо в описаниях блоков, а данных в атрибутах - во вхождениях. Цитата:
--- Возвращаясь к первоначальному вопросу: Цитата:
Код:
Цитата:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
||||
|
||||
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. Первоначальный вопрос был: Цитата:
Вот бы настоящую схемку сваять 7. С листами я давно разобрался. см пост #3 |
||||
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
нужна 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 |