|
  |
Создание спецификации автоматически (Дубль2), Рассматриваются технология и ее реализация по автоматическому создани |
|
|
Гость_Supermax_*
|
29.3.2007, 10:05
|
Guest Forum

|
Есть реальная проблема. Как переставлять в списке атрибутов, отображаемых в свойствах блока, эти самые атрибуты местами? Они отображаются в обратном порядке от того, что был при их создании. То есть, последний созданный атрибут находится в первой строке свойств. Редактирование дает только видимость, вроде бы переставляет, но после двух, трех вхождений в свойства, некоторые атрибуты перемещаются сами по себе. А если блок создать заново, то даже отредактированные атрибуты все равно выстраиваются в той последовательности, в которой они были созданы в самом начале. Даже не они, а те, с которых они скопированы. Время создания тут ни причем, порядок определяется расположением атрибутов в базе рисунка.
КАК ИХ В ЭТОЙ БАЗЕ МЕНЯТЬ МЕСТАМИ???
|
|
|
|
Гость_Guest_*
|
29.3.2007, 11:17
|
Guest Forum

|
Все очень просто: порядок отображения атрибутов (как правило) определяется последовательностью их создания, и ничем иным. Перестраивать блоки надо.
|
|
|
|
Гость_Supermax_*
|
29.3.2007, 13:07
|
Guest Forum

|
Мой великий помощник Сергеев Дмитрий в данный момент пишет макрос на VBA, который по существующей группе атрибутов создает ее точную копию, только путем не копирования а создания новых атрибутов с начинкой старых в порядке по которому расположены старые атрибуты по оси Y. То есть если надо вставить атрибут в список, раздвигаете атрибуты, вставляете новый, нажимаете на кнопку, обводите старую группу и получаете новую. А старую грохаете. Как напишет - выложу. А пока король сезона - насос Grundfos Какой-то там с полным комплектом атрибутов! Не, не все, забыл вставить ссылку на страничку в сайте производителя и ссылку на поставщика. Вот макрос сделаем и испытаем. Дружные аплодисменты!!!
|
|
|
|
Гость_Supermax_*
|
5.4.2007, 17:09
|
Guest Forum

|
Кто сказал, что динамические блоки могут быть только 2D? Вот вам пример 3D динамических блоков. Трубы ППУ от 57 до 159 диаметров. Кто в 3D строит теплотрассы - пригодятся. Файл 84 КБ.
|
|
|
|
Гость_Supermax_*
|
5.4.2007, 18:31
|
Guest Forum

|
Причем заметьте господа, что если у динамического блока изменлся параметр, то и имя изменилось, а если параметр стал опять прежний, то и имя тоже станет прежним. Например: Изначально был динамический блок с установленной начальной длинной 1000мм. и именем Труба_ППУ_76. Изменили длинну до 11000мм. Имя стало к примеру +U430. Скопировали трубу и изменили длинну новой трубы на 5000мм. Имя тоже изменилось и стало +U450, опять к примеру. Опять скопировали трубу (что 5 метров длинною) и установили длинну нового участка 11000мм. Имя этой трубы стало такоеже как и у первой трубы длинною 11000мм. +U430! Таким образом, посчитав все блоки с одинаковым именем и прочтя длинну любого из них, получаем труба такая-то длинной такой-то столько-то.
|
|
|
|
|
6.4.2007, 12:06
|
CAD Developer
Группа: Участники форума
Сообщений: 409
Регистрация: 6.2.2006
Из: C.-Петербург, Россия
Пользователь №: 2062

|
Цитата(Supermax @ Apr 5 2007, 19:31 ) Причем заметьте господа, что если у динамического блока изменлся параметр, то и имя изменилось, а если параметр стал опять прежний, то и имя тоже станет прежним. Например: Изначально был динамический блок с установленной начальной длинной 1000мм. и именем Труба_ППУ_76. Изменили длинну до 11000мм. Имя стало к примеру +U430. Скопировали трубу и изменили длинну новой трубы на 5000мм. Имя тоже изменилось и стало +U450, опять к примеру. Опять скопировали трубу (что 5 метров длинною) и установили длинну нового участка 11000мм. Имя этой трубы стало такоеже как и у первой трубы длинною 11000мм. +U430! Таким образом, посчитав все блоки с одинаковым именем и прочтя длинну любого из них, получаем труба такая-то длинной такой-то столько-то. Лажа, прости меня, Господи. Сносим все объекты, кроме самого верхнего, чтоб уж точно знать, про что разговор. Заодно и _purge применяем. Код _$ (setq ent (vlax-ename->vla-object (car (entsel "\nЕдинственная труба : ")))) #<VLA-OBJECT IAcadBlockReference2 0d57fd74> _$ (vla-get-name ent) "*U5" _$ (vla-get-EffectiveName ent) "Труба_ППУ_57" Меняем длину с 2000 на 20000 Код _$ (vla-get-name ent) "*U5" _$ (vla-get-EffectiveName ent) "Труба_ППУ_57" Копируем объект. Теперь: Код _$ (setq ent_copied (vlax-ename->vla-object (car (entsel "\nСкопированный объект : ")))) #<VLA-OBJECT IAcadBlockReference2 0d590a64> _$ (vla-get-EffectiveName ent_copied) "Труба_ППУ_57" _$ (vla-get-name ent_copied) "*U11" _$ (vla-get-EffectiveName ent_copied) "Труба_ППУ_57" То, что name меняется, ни о чем не говорит, кроме того, что надо внимательнее читать чужие посты, в том числе и об особенностях работы bcount. А вот теперь внимание, бонус! Код _$ (vla-get-name (vla-item (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object))) (vla-get-EffectiveName ent))) "Труба_ППУ_57" _$ (vla-get-name (vla-item (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object))) (vla-get-EffectiveName ent_copied))) "Труба_ППУ_57" Ни о чем не говорит? --- Добавлено: код работать будет на версиях от 2006 и выше. Для обычных блоков в общем-то EffectiveName можно тоже использовать, но я бы не стал этого делать по причине того, что софт, который я пишу, работать должен и на 2005 версии тоже. А там дин.блоков нет.
Сообщение отредактировал kpblc - 6.4.2007, 12:19
|
|
|
|
Гость_Supermax_*
|
9.4.2007, 12:20
|
Guest Forum

|
О! А я уже тебя оплакал. Думал, вот, был у меня единственный собеседник, обиделся почему-то на меня и ушел «своей дорогой». Слава богу, ты не покидаешь меня в абсолютном моем одиночестве. Тут ведь одни приведения шастают. Качают, иногда улюлюкают и исчезают. А я один тут сижу и все сам делаю. Вот и сейчас предлагаю вниманию публики блок уже представленного выше насоса, только с динамическими атрибутами. А также анализ поведения такого блока. Все, у кого AutoCAD 2005, 2004 и ниже – сушите весла. Да, можно создать жесткий аналог производимой продукции. Вот стоят прокладки BUBE на таком насосе, значит и насос с такими прокладками, а также жестко заданными параметрами двигателя, материала корпуса, материала крыльчатки, типа присоединения и пр. переменными параметрами – один. Сколько сочетаний, столько и блоков насосов. Но есть и другой способ – это установка в блоке динамических атрибутов. Кстати, у динамических атрибутов, в свойствах блока кроме падающих меню с выбором параметра есть еще одно очень полезное свойство – «только для чтения». Установленные производителем данные должны быть защищены от случайного изменения. Нет, изменить их можно, но это надо залезть в блок, затем залезть в таблицу установок, а это уже случайностью не назовешь. Блок, снабженный динамическими атрибутами, которые не меняют геометрию объекта, также как и блок, где геометрия меняется, при изменении параметра любого из свойств доступных к выбору меняет значение точечной пары с DXF кодом (2 . *). НО! Если блок один, то есть, нет в чертеже другого, такого же - имя не меняется. При внесении изменений в обычные атрибуты имя также не меняется. Таким образом, можно смело нумеровать позиции через простые атрибуты и на подсчет блоков это не повлияет, а если у вас есть параметр, который должен быть учтен при подсчете – оформляйте его динамическими атрибутами. Сразу рявкну на любителей поумничать – любые пары (наименование свойства – его значение) декларированных свойств объекта есть его атрибуты, чем бы вы их не создали и как бы не разместили! ВНИМАНИЕ! При создании блока, после завершения процесса упаковки его атрибутами и сохранения файла, блок в рисунке – убить! Если блок необходим, то его надо только вставлять через функцию Insert. Это относится только к первому (исходному блоку), поскольку при его создании, вставляя новые атрибуты, постоянно происходит смена имени блока в Модели, а параллельно в базе чертежа тоже происходит изменение конфигурации блока, но без изменения имени. При вставке в пространство Модели блока из базы получаются два абсолютно одинаковых блока, но только с разными именами. P.S. Мне теперь столько переделывать!
|
|
|
|
|
9.4.2007, 13:59
|
CAD Developer
Группа: Участники форума
Сообщений: 409
Регистрация: 6.2.2006
Из: C.-Петербург, Россия
Пользователь №: 2062

|
Я не хочу говорить, почему твой подход я не могу назвать полностью правильным и неоспоримым - тема свалится во флуд. Свой пост я проверял на конкретном файле и на конкретном блоке, среда проверки - ADT 2006 Rus + SP1, AutoCAD 2007 Eng + SP1, ADT 2007 Rus + SP1. И основная идея моего поста была такова: проверять надо по полной программе. Разберись с понятием "имени" блока. У тебя там такая каша получается - то имя меняется, то нет. Раздели - есть имя блока (vla-get-name blk), есть его эффективное имя (vla-get-effectivename blk). Цитата Сразу рявкну на любителей поумничать – любые пары (наименование свойства – его значение) декларированных свойств объекта есть его атрибуты, чем бы вы их не создали и как бы не разместили! Значит я поумничаю. Опять же, терминологию уточняй - атрибут это атрибут, динамическое свойство это динамическое свойство. Курица не станет крякать, сколько ее ни называй уткой. --- Добавлено: Цитата <...>теперь столько переделывать! Напиши код, который будет проверять соответствие "библиотечного" блока и имеющегося в файле. Голову сломаешь, практически гарантирую. Все надо делать через vla-функции; гарантированно "на ура" разобраться с динамическими свойствами не получится. Для примеру: Код ;|Вот так можно получить конкретные значения всех динамических свойств конкретной вставки блока|; (defun test (/ ent res) (if (and (setq ent (car (entsel "\n Select dyn block <Cancel> : "))) (= (cdr (assoc 0 (entget ent))) "INSERT") (= (vla-get-isdynamicblock (setq ent (vlax-ename->vla-object ent))) :vlax-true );_ end of = );_ end of and (setq res (mapcar '(lambda (x) (cons (vla-get-description x) (vla-get-value x)) );_ end of lambda (vlax-safearray->list (vlax-variant-value (vla-getdynamicblockproperties ent)) );_ end of vlax-safearray->list );_ end of mapcar );_ end of setq );_ end of if res );_ end of defun Но! Это для конкретной вставки. Как получить то же самое из описания блока, я не разбирался. А тебе, я так чуйвствую, придется
Сообщение отредактировал kpblc - 9.4.2007, 15:00
|
|
|
|
Гость_Supermax_*
|
9.4.2007, 16:35
|
Guest Forum

|
От подхода у меня пока только рожки да ножки, так что оценивать еще нечего. Я пока уточняю среду для анализа. Некоторые макросы еще не весь замысел. По последнему облому (в смысле динамических атрибутов), так вообще кое что рухнуло. Ты мне тут про свой пост все толкуешь, и о проверке всего и вся, так не затруднит еще раз свою позицию осветить, а то я тоже тебя с трудом понимаю. Теперь с именами. Свойство Name: Описание: Имя
Свойство EffectiveName Описание: Оригинальное имя блока.
DXF код 2 Описание: Имя (атрибута, блока и т.п.)
(vla-get-name blk) – не имя блока, а функция технологии ActiveX «vla-get» примененная к совйству «name» объекта «blk» читающая значение этого свойства. Тоже самое и с (vla-get-effectivename blk). Оригинальное имя изменить можно, переименовав блок. Но не нужно, поскольку оригинальное имя необходимо только при выборе блока из базы и вставке его в чертеж. Оно должно быть по возможности не многобуквенно и понятно. Имя, то, которое просто имя, и то самое, которое указывается в точечной паре с DXF кодом 2, и то самое по которому считается количество элементов в чертеже в динамических блоках по началу такое же как и оригинальное, но при изменении динамических параметров естессно меняется на *Unnn где nnn номер зависящий от параметров динамического блока. Два одинаковых по динамическим параметрам блока имеют один и тот же nnn (за исключением описанной мною ситуации при его создании).
Да, каша. Я ее, что ли придумал? Вот «чистый лист», в нем один единственный динамический блок. Смотрим его «прайс-лист». (entget (car (entsel)))
Select object: ((-1 . <Entity name: 7ec16040>) (0 . "INSERT") (330 . <Entity name: 7ef80cf8>) (5 . "1360") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "Спецификация") (370 . 5) (100 . "AcDbBlockReference") (66 . 1) (2 . "Насос_TPED_Grundfos_65-120-2") (10 1460.98 1314.86 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
Комментарии: Значение свойства Name – соответствует оригинальному имени блока.
Пошевелили динамический параметр. Select object: ((-1 . <Entity name: 7ec16040>) (0 . "INSERT") (5 . "1360") (102 . "{ACAD_XDICTIONARY") (360 . <Entity name: 7ec16088>) (102 . "}") (330 . <Entity name: 7ef80cf8>) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "Спецификация") (370 . 5) (100 . "AcDbBlockReference") (66 . 1) (2 . "*U4") (10 1460.98 1314.86 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
Комментарии: Значение свойства Name – изменилось на «*U4». Что вполне понятно, поскольку данный блок не такой, как тот, что в базе.
Еще раз пошевели. Select object: ((-1 . <Entity name: 7ec16040>) (0 . "INSERT") (5 . "1360") (102 . "{ACAD_XDICTIONARY") (360 . <Entity name: 7ec16088>) (102 . "}") (330 . <Entity name: 7ef80cf8>) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "Спецификация") (370 . 5) (100 . "AcDbBlockReference") (66 . 1) (2 . "*U4") (10 1460.98 1314.86 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
Комментарии: Значение свойства Name – Осталось прежним «*U4», что тоже вполне понятно, поскольку блок в чертеже один.
Вернули все значения в прежнее состояние. Select object: ((-1 . <Entity name: 7ec16040>) (0 . "INSERT") (5 . "1360") (102 . "{ACAD_XDICTIONARY") (360 . <Entity name: 7ec16088>) (102 . "}") (330 . <Entity name: 7ef80cf8>) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "Спецификация") (370 . 5) (100 . "AcDbBlockReference") (66 . 1) (2 . "*U4") (10 1460.98 1314.86 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
Комментарии: Значение свойства Name – Осталось прежним «*U4», что уже не вполне понятно, поскольку блоку возвращены его родные значения по умолчанию, хотя с точки зрения логики – зачем менять, раз блок в единственном количестве?
Вставили из базы еще один такой же блок и посмотрели его параметры и параметры блока, что после возврата модификации динамических параметров.
Новый блок. Select object: ((-1 . <Entity name: 7ec16628>) (0 . "INSERT") (330 . <Entity name: 7ef80cf8>) (5 . "1415") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "Спецификация") (370 . 5) (100 . "AcDbBlockReference") (66 . 1) (2 . "Насос_TPED_Grundfos_65-120-2") (10 1981.67 869.867 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
Старый с восстановленными параметрами как у исходного. Select object: ((-1 . <Entity name: 7ec16040>) (0 . "INSERT") (5 . "1360") (102 . "{ACAD_XDICTIONARY") (360 . <Entity name: 7ec16088>) (102 . "}") (330 . <Entity name: 7ef80cf8>) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "Спецификация") (370 . 5) (100 . "AcDbBlockReference") (66 . 1) (2 . "*U4") (10 1460.98 1314.86 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
Комментарии: Сложилась ситуация, когда в чертеже два абсолютно одинаковых по параметрам блока, но с разными именами. Попробуем сделать ATTSYNC с начала блоку с (2 . "Насос_TPED_Grundfos_65-120-2")
Вот его данные (для сокращения места все кроме точечной пары с кодом 2 буду стирать) (2 . "Насос_TPED_Grundfos_65-120-2")
Теперь ATTSYNC блоку старому, с измененными в начале параметрами, а потом восстановленными. (2 . "*U5")
Комментарии: Сколько ни делай ATTSYNC блоку вставленному из базы его точечная пара (2 . "Насос_TPED_Grundfos_65-120-2") не меняется. А у блока, что после реанимации постоянно с каждым ATTSYNC прибавляется на единицу.
Если скопировать много таких блоков, то после ATTSYNC любого из них (2 . "*U5") изменится у всех (кроме исходного) на (2 . "*U6") и т.д.. Если бы исходного блока в чертеже не было, то все было бы логично, поскольку с каждым ATTSYNC вы перезаписываете вхождение блока, а в памяти, должно сохранятся прежнее значение, для возможности отката. А так, просто не знаю что делать. Скорее всего все динамические блоки буду проверять на соответствие их имени "*Unnn" и если не соответствует, то автоматически менять любой дин параметр, а потом его сразу восстанавливать. Таким образом все станет на свои места.
А ты говоришь «У тебя там такая каша получается - то имя меняется, то нет.»
Теперь с атрибутами. Цитирую: А.И. Чуприн, В.А. Чуприн AutoCAD 2005 Platinum Edition
Блоки с атрибутами. С любым блоком можно связать атрибуты блока – текстовую информацию, которая может изменяться при вставке блока в рисунок. С ее помощью можно выполнять надписи к блокам, ее можно выводить в отдельный файл для использования в электронных таблицах, базах данных или как исходный материал для создания различного рода спецификаций.
Конец цитаты.
Как ты думаешь, если эту текстовую информацию вывести в отдельный файл, она перестанет быть атрибутом каких-то конкретных блоков? (Тьфу, вот и я уже путаюсь. Не блоков, а изделий, которые обозначены этими конкретными блоками). Я считаю, что не перестанет. А в каком виде и с помощью каких средств она существует не имеет совершенно никакого значения для определения атрибут это или нет.
Вот перед тобой блок насоса, ну не меняются в этом графическом примитиве его свойства, а в описании меняются не свойства примитива «blk», а указываются атрибуты реального, живого насоса! Это ты все время путаешь атрибуты примитивов с атрибутами их живых прототипов.
Атрибуты примитивов это то, что выше в свойствах. Точки вставки, цвет, слой и прочая мутотень. И эти описанные свойства есть атрибуты этого примитива!
А то, за что ты так переживаешь, то есть за AttributeReference – это не атрибут, а объект AutoCAD-а предназначенный для удобного хранения информации, также как объекты Text и Mtext не сам текст, а его оболочка! Да, для удобства пользования оболочки назвали также как и их содержимое, но я называю вещи своими именами и стараюсь вернуть понимание своих читателей и одного писателя к начальному, исходному понятию значения термина «атрибут».
P.S. Динамическое свойство изделия, представленное в его виртуальной копии в виде описания этого свойства – есть атрибут этого изделия, чем бы это описание не было создано. Пока я это писал, вижу ты тоже не сидел. Пока почитай это, а я поколдую с AutoCAD-ом
Добавлено - 17:40 Ты не перживай, я активно использую ActiveX. Вот сейчас буду с его помощью потрошить Lookup Parameter и Lookup Action/
|
|
|
|
|
9.4.2007, 17:28
|
CAD Developer
Группа: Участники форума
Сообщений: 409
Регистрация: 6.2.2006
Из: C.-Петербург, Россия
Пользователь №: 2062

|
Суть моей позиции достаточно просто (кстати, ShaggyDoc в "САПР на базе..." ее отлично описал, я попробую кратенько. 1. Приложение выполняет свою работу и не оставляет систему в невнятном для пользователя виде (возвращаются системные переменные назад, закрываются ненужные файлы, возвращается представление и тому подобное, удаляются временные примитивы, закрывается коннект к базам данных или интернету, если он был открыт ну и так далее). 2. Приложение должно корректно работать с указанных разработчиком версиях. При попытке запуска в любой другой версии оно должно выдавать соответствующее предупреждение и не мутить воду. Либо вообще отказываться устанавливаться. 3. Приложение обязано работать в любых условиях. В случае несоблюдения каких бы то ни было условий, необходимых для ее работы, оно должно корректно завершаться (см.п.1) 4. Эксплуатация приложения должна быть удобной для пользователя, простой и понятной. Это к вопросу о последнем блоке. Я, как не спец, могу запросто так скомбинировать доступные динамические параметры, что такого насоса просто не будет 5. Приложение должно работать на любых вертикальных решениях, основанных на acad.exe (ADT / MDT etc) независимо от пути их установки и прав пользователя. Также допускается работа приложения в среде AutoCAD LT при условии, что туда можно загрузить lisp (а это возможно). Также приложение не должно быть привязано к какой бы то ни было жестко заданной папке: пользователь должен иметь право установить приложение по пути z:\a_vot_ne-buded\ili\budet\работать\но\я\не.хочу - а приложение все равно будет выполнять возложенные на него задачи. 6. Удаление приложения должно оставлять машину в чистом виде; создававшиеся СОМ-серверы должны быть корректно деинсталлированы и разрегистрированы; файлы приложения должны лежать в строго определенном месте и не пытаться прописываться в системные папки, исключая случаи регистрации системных ocx-элементов (таких, например, как TruDBGrid и ему подобных). === Не менее принципиальные вещи: - сделать полностью универсальную прогу не под силу никому. И пытаться нечего. - прога должна корректно читать как минимум ту информацию, которая вставлена при помощи "дружественного" софта (попытка прочитать значение узловой выноски, созданной с помощью, например, MechaniCS, при условии отсутствия ObjetEnabler'a, обречена на фиаско). Все, что сверх того - отдельный бонус, за отдельные деньги и за отдельное время. === Теперь дальше. Динамические блоки - это порождение 2006й версии. И работать с ними лучше всего через activex-представления. Аналогичным образом ситуация обстоит и с таблицами и их стилями. Но! Нужность DXF я не отрицаю! Далее. Предлагаю следующую терминологию, иначе мы постоянно будем цапаться на ровном месте: === Описание блока. Может быть только одно. Блок = вставка блока. Имеет такие же свойства, как и любой другой примитив, а также конкретные значения текстовых атрибутов и динамических свойств. Атрибут = ATTRIB / ATTDEF = текстовый примитив, входящий в описание блока и для каждой вставки его могущий принимать различные значения. Динамическое свойство = параметр динамического блока. Свойство примитива: слой, тип, вес линии... === Почему я этого так настойчиво добиваюсь: не далее как сегодня мне в аську постучался хороший знакомый. Так мы с ним минут 20, наверное, выясняли - что ему надо: работать со вставками блоков или с описаниями блоков.
|
|
|
|
Гость_Supermax_*
|
9.4.2007, 18:34
|
Guest Forum

|
Твой перл в моей интерпритации.
(vl-load-com) (defun test (/ ent res) (if (and (setq ent (car (entsel "\n Select dyn block <Cancel> : "))) (= (cdr (assoc 0 (entget ent))) "INSERT") (= (vla-get-isdynamicblock (setq ent (vlax-ename->vla-object ent))) :vlax-true) ) (setq res (mapcar '(lambda (x) (cons (vla-get-PropertyName x) (vlax-variant-value (vla-get-value x)))) (vlax-safearray->list (vlax-variant-value (vla-getdynamicblockproperties ent))) ) ) ) res );_ end of defun
|
|
|
|
|
10.4.2007, 11:37
|
CAD Developer
Группа: Участники форума
Сообщений: 409
Регистрация: 6.2.2006
Из: C.-Петербург, Россия
Пользователь №: 2062

|
Цитата(Supermax @ Apr 9 2007, 19:34 ) Завтра подробнее напишу про свои чаяния, а пока твой перл в моей интерпритации.
(vl-load-com) (defun test (/ ent res) (if (and (setq ent (car (entsel "\n Select dyn block <Cancel> : "))) (= (cdr (assoc 0 (entget ent))) "INSERT") (= (vla-get-isdynamicblock (setq ent (vlax-ename->vla-object ent))) :vlax-true) ) (setq res (mapcar '(lambda (x) (cons (vla-get-PropertyName x) (vlax-variant-value (vla-get-value x)))) (vlax-safearray->list (vlax-variant-value (vla-getdynamicblockproperties ent))) ) ) ) res );_ end of defun
До скорого. Не очень понял разницу между моим и твоим кодами... Единственная строка - (vl-load-com), но она в 2006 уже не является обязательной. 2005-й иногда еще не подгружает ее моментально, но в 2006 такого лично я не наблюдал.
|
|
|
|
|
11.4.2007, 10:15
|
CAD Developer
Группа: Участники форума
Сообщений: 409
Регистрация: 6.2.2006
Из: C.-Петербург, Россия
Пользователь №: 2062

|
Предыдущий ответ - мой. У меня авторизация что-то не сработала. На всякий случай повторю: > Supermax: убедил. Но тогда можно и так получать (более внятные ИМХО результаты): Код ;|Вот так можно получить конкретные значения всех динамических свойств конкретной вставки блока|; (defun test3 (/ ent res loc:conv-to-value) (defun loc:conv-to-value (value / res) (setq res (cond ((= (type value) 'safearray) (setq res (mapcar 'loc:conv-to-value (vlax-safearray->list value))) ) ((= (type value) 'variant) (setq res (mapcar 'loc:conv-to-value (vlax-variant-value value))) ) (t value) );_ end of cond );_ end of setq res );_ end of defun
(if (and (setq ent (car (entsel "\n Select dyn block <Cancel> : "))) (= (cdr (assoc 0 (entget ent))) "INSERT") (= (vla-get-isdynamicblock (setq ent (vlax-ename->vla-object ent))) :vlax-true );_ end of = );_ end of and (setq res (mapcar '(lambda (x) (cons (if (= "" (vla-get-description x)) (vla-get-propertyname x) (vla-get-description x) );_ end of if (loc:conv-to-value (vlax-variant-value (vla-get-value x))) );_ end of cons );_ end of lambda (vlax-safearray->list (vlax-variant-value (vla-getdynamicblockproperties ent)) );_ end of vlax-safearray->list );_ end of mapcar );_ end of setq );_ end of if res );_ end of defun
|
|
|
|
Гость_Supermax_*
|
11.4.2007, 14:35
|
Guest Forum

|
Прога ушла в копилку. Спасибо. Следующая задача, с которой я уже справился, это маркировка в атрибутах изделия. Ты заешь, что во многих изделиях есть такая кака, как маркировка, которая состоит из набора символов, каждый из которых есть переменная величина с количеством от двух, до целой кучи значений. Количество вариантов маркировки равно количеству переменных перемноженных на количество других переменных и результат на количество третьих переменных, и результат ….. Ну ты понял. Двери, окна, насосы Grundfos, трубы ППУ и многое другое. В атрибутах изделия есть и сама маркировка, и расшифровка отдельных ее переменных. При изменении некоторых параметров меняется не только геометрическая форма, но и появляются дополнительные атрибуты изделия, как статические (только для чтения, динамические и динамические с возможностью изменения геометрии блока). В общем раскрываются такие возможности…! НО! Без проги, помогающей заполнять дин. Атрибуты – очень и очень гиморно создавать такую крутизну. Если хочешь, расскажу как это получается. Вот маленький пример, как это сделать в динамическом блоке. файл 1.8 МБ.
|
|
|
|
Гость_Supermax_*
|
11.4.2007, 15:02
|
Guest Forum

|
К стати о птичках: Я в этом файле накопировал штук 50 блоков, а размер файла при этом сократился до 1.74 МБ. ХА, ХА, ХА! Сейчас решаю вопрос, куда вставлять длинну? Вот есть труба ППУ. Она заказывается в штуках. То есть, Труба такая-то, длинной такой-то, штук столько-то. Сделана труба дин. блоком. И название есть и маркировка, только длинна - динамический параметр, да еще и очень большого количества вариантов. До 5500 возможных длин с шагом 5 мм. Вставлять длинну в "Примечание"? или в следующую строку после "Наименование"? Как выделить этот параметр описания свойств изделия из остального списка и указать, куда он должен быть вставлен? Просится под "Наименование", поскольку логично звучит "Труба такая-то, L= столько-то". Наверное в маршрутизаторе надо к ячейке "Наименование" приклеить перечень наименований атрибутов, имя и значение которых надо "склеивать" со значением атрибута "Наименование"? Как думаешь? Вот, слегка отредактировал.
|
|
|
|
|
12.4.2007, 9:02
|
CAD Developer
Группа: Участники форума
Сообщений: 409
Регистрация: 6.2.2006
Из: C.-Петербург, Россия
Пользователь №: 2062

|
Специально запустил ADT 2006 Rus и твой файлик. А вот теперь вопрос: а на фига мучаться с получением? Если можно сделать так: Код (defun test4 (/ selset tmp tmp_assoc tmp_dyn res loc:conv-to-value loc:getdynvalues res) (defun loc:conv-to-value (value / res) (setq res (cond ((= (type value) 'safearray) (setq res (mapcar 'loc:conv-to-value (vlax-safearray->list value))) ) ((= (type value) 'variant) (setq res (mapcar 'loc:conv-to-value (vlax-variant-value value))) ) (t value) );_ end of cond );_ end of setq res );_ end of defun
(defun loc:getdynvalues (ent) (mapcar '(lambda (x) (cons (if (= "" (vla-get-description x)) (vla-get-propertyname x) (vla-get-description x) );_ end of if (loc:conv-to-value (vlax-variant-value (vla-get-value x)) );_ end of loc:conv-to-value );_ end of cons );_ end of lambda (vlax-safearray->list (vlax-variant-value (vla-getdynamicblockproperties ent) );_ end of vlax-variant-value );_ end of vlax-safearray->list );_ end of mapcar );_ end of defun
(defun loc:nth-number (item lst) (1- (- (length lst) (length (member item lst)))) );_ end of defun
(if (setq selset (ssget "_X" '((0 . "INSERT")))) (foreach item (vl-remove-if-not '(lambda (x) (= (vla-get-isdynamicblock x) :vlax-true)) (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset))) );_ end of mapcar );_ end of vl-remove-if-not (if (member (vla-get-name item) (mapcar 'car res)) (setq res (subst (cons (vla-get-name item) (append (list (cons "count" (1+ (cdr (assoc "count" (cdr (assoc (vla-get-name item) res)) );_ end of assoc );_ end of cdr );_ end of 1+ );_ end of cons );_ end of list (loc:getdynvalues item) );_ end of append );_ end of cons (assoc (vla-get-name item) res) res );_ end of subst );_ end of setq (setq res (cons (cons (vla-get-name item) (cons (cons "count" 1) (loc:getdynvalues item)) );_ end of cons res );_ end of cons );_ end of setq );_ end of if );_ end of foreach );_ end of if res );_ end of defun И разбирай дальше список. Предупреждаю сразу - код качественно протестировать не могу (попросту мало времени). Так что это на твоей совести. С назначением динамических свойств я не воевал. Сильно подозреваю, что это надо работать со словарями. Время надо, которого почти нет  --- Добавлено: немного отредактировал код - одну функцию забыл в локальные засунуть.
Сообщение отредактировал kpblc - 12.4.2007, 15:00
|
|
|
|
|
13.4.2007, 12:38
|
CAD Developer
Группа: Участники форума
Сообщений: 409
Регистрация: 6.2.2006
Из: C.-Петербург, Россия
Пользователь №: 2062

|
И все же насчет заполнения динамических свойств я бы крепко подумал. Смотри: допустим, администратор системы (обзовем его так, а на самом деле это просто человек, который выполняет работы общего характера) каким-то манером добавил, удалили заполнил или отредактировал - в общем, изменил характеристики. Теперь все пользователи этой системы должны получить актуальные версии этого блока. А если в файле такой дин.блок уже вставлен? Тогда AutoCAD при вставке (насколько я понял) будет брать имеющееся описание, не опрашивая "библиотечный" элемент. То есть отслеживать такие ситуации надо программисту. Какие в связи с этим проблемы лично я вижу: 1. Надо переименовать имеющиеся динамические блоки либо каким-то иным способом "забрать" с них всю информацию - точка вставки, нормаль, масштабы по осям, слой, пространство вставки и так далее. При этом надо не забыть про возможные внешние ссылки, внутри которых тоже может быть этот дин.блок. Также обработать блоки (никто не помешает дин.блок поместить внутрь другого блока). 2. Разблокировать и разморозить слои 3. Удалить все вхождения этого блока. 4. Удалить описание этого блока. 5. Импортировать по новой блок 6. Вставить новую версию блока в соответствии с параметрами, полученными в п.1. 7. Вернуть состояние слоев. При всем при этом надо в случае ошибки в любом месте вернуть файл обратно. И теперь самый главный вопрос: а когда это делать? В момент открытия файла? Если "да", то простое выполнение такого лиспа затормозит открытие файла раза в 2-3, не меньше. Соответственно надо получить полное описание "текущей версии" блока в текущем файле и сравнить ее с версией в библиотеке. И только после этого уже идти в п.1 и дальше. Просто открыть файл библиотеки тебе не удастся - лисп прекратит свое выполнение в момент активации другого файла. То есть надо устанавливать SDI в 0, потом через ObjectDBX-интерфейс (который еще тоже прописать надо) получать доступ к библиотечному файлу, брать с него описание блока, и сравнивать с имеющимся описанием дин.блока. Потом не забыть закрыть фай библиотеки. Причем делать это надо независимо от того, где лежит библиотека - локально или на серваке. Головняк, одним словом. --- P.S. Естественно, всю дорогу ИМХО.
|
|
|
|
Гость_Supermax_*
|
13.4.2007, 13:06
|
Guest Forum

|
Во первых, если элемент библиотечный, то в нем есть атрибут с номером в этой библиотеке и при обработке модели прога просто обязанна обратится в библиотеку за сведениями об этом элементе, но если файл перекочевал на компьютер заказчика или фрилансера, или этот файл содержит элементы других библиотек, но также содержит и собственные сведения, то по принципу субординации считается то, что доступно. Если нет доступа к библиотеке, считаем, то что имеем. При работе с библиотекой, никто ничего не получает, все только берут. Это очень важное отличие. При вставке одноименных блоков AutoCAD ругается и если пользователь слеп и туп, да еще в придачу засланный шпион, то ... ?? У динамических блоков имя тутже меняется само. Было *U9, при вставке в другой лист стало *U12, при повторной вставке из имени *U5 все равно сделало *U12, поскольку параметры длинны одни и теже. Я как не бился, а имена строго соответствуют набору параметров. Ты поиграйся с динблоком трубы, поиграйся. Советую. И все твои лавинообразно сыплящиеся страхи, а заодно и намерения по их устранению самоустранятся. <font size='1' color='#8e8b8b'>Добавлено - 14:09</font> Если кому-то интересно, то вот мои мысли по поводу маркировки изделий: Видов продукции очень много. Среди всех видов, той продукции, которая маркируется достаточно много. Единых правил по составлению маркировки не существует. Разве, что штрих-код. Я рассматриваю маркировку цифро-буквенную. Да, в динамических блоках, методом перекрестных ссылок между свойством блока «Visibility Set» и «Lookup Set» можно создать самоустанавливающуюся позицию маркировки изделия, НО! Этот прием применим только для небольшого количества вариантов маркировки. При количестве более 100, смысла в создании такой громоздкой системы нет. Помимо этого существуют случаи, когда в марку изделия включены такие параметры как длина, высота, объем, площадь, радиус, диаметр и т.п. Эти параметры имеют такое количество вариантов, что создавать дискретную систему их выбора и завязывать средствами динамических блоков просто абсурд. Что делать? Очевидно, что надо каким-то образом «склеивать» имена и значения, или только значения группы атрибутов друг с другом. Подход, который я с начала предложил через файл-маршрутизатор – не правильный. У разных производителей по разным гостам и зарубежным стандартам совершенно разные случаи бывают. Вот например у Мосфлоулайн, в маркировку шаровых кранов входит такой параметр, как высота штока, а в случае труб к названию надо приклеивать и имя, и значение атрибута «L=» то есть длинна такая-то. Я не могу навязывать всем производителям свой файл-маршрутизатор. Но создать такой блок, в котором удобно размещена информация о том, что и с чем склеивать – могу. Я всячески оттягиваю тот момент, когда использование расширенных данных станет единственной возможностью, хочу постараться сделать создание блока доступным для всех пользователей, но чует мое сердце, что настал час использования расширенных данных. С начала о том, «что» склеивать. 1. Значение атрибута «НАИМЕНОВАНИЕ» - Ну вполне понятно, ч то в колонке спецификации, в которой представлено наименование изделия, то есть значение атрибута «НАИМЕНОВАНИЕ», необходимо дополнить это значение еще несколькими дополнительными характеристиками. 2. Значение атрибута «ТИП_МАРКА_ОБОЗНАЧЕНИЕ» - Тоже понятно, что марку не всегда просто прочесть, ее иногда надо и создать. В таком случае значение атрибута «ТИП_МАРКА_ОБОЗНАЧЕНИЕ» является только первым элементом марки, а все последующие берутся только из значений (без имен) других атрибутов. Больше вариантов (в нашем варианте спецификации) я не вижу. Теперь о том, «с чем» склеивать. 1. Все параметры длин, радиусов и пр. линейных значений динамических атрибутов. 2. Некоторые позиции динамических атрибутов дискретного выбора. Тоже, больше вариантов (в нашем варианте спецификации) я не вижу. Теперь о том, «как» склеивать. - Понятное дело, программой, которая предназначена для обсчета модели. И я кажется придумал как это делать. Если в конце значения атрибута с именем «ТИП_МАРКА_ОБОЗНАЧЕНИЕ» или «НАИМЕНОВАНИЕ» стоит многоточие «…» от трех точек и выше, то это означает, что наименование или маркировка не полное и следует к нему добавить то имя атрибута или только его значение, где многоточие стоит перед значением или с него начинается имя. Например: «НАИМЕНОВАНИЕ» - Труба ППУ в металлической оболочке из оцинкованной стали…. «ТИП_МАРКА_ОБОЗНАЧЕНИЕ» - Ст 426х… «Толщина стенки трубы мм.» - …7 «Тип изоляции» - …-1 «Материал утеплителя» - …-ППУ «Материал оболочки утеплителя» - …-М «…. L=» - 11000 После обработки получаем: «НАИМЕНОВАНИЕ» - Труба ППУ в металлической оболочке из оцинкованной стали L=11000 «ТИП_МАРКА_ОБОЗНАЧЕНИЕ» - Ст 426х7-1-ППУ-М Почему спросите длинна приклеилась к имени, а все остальное к маркировке? – все очень просто. У имени четыре точки, и у L= тоже четыре, а у маркировки три. Последовательность склеивания определяется последовательностью расположения. Точки совершенно не мешают визуальному восприятию свойств, в отличии от разных знаков, и несут в себе численное значение, позволяющее оперировать различными позициями атрибутов изделия. Вот файлик с изделиями Мосфлоулайн 1,44 МБ
|
|
|
|
Гость_Supermax_*
|
13.4.2007, 13:46
|
Guest Forum

|
AutoCAD не дает вставлять одноименные динамические блоки. При вставке он заменяет импортируемый объект на собственный. Если из бидлиотеки взят динблок, а затем администратор библиотеки его отредактировал, то вставить его в чертеж можно только если поменять ему имя. Таким образом считаю, что чертеж защищен от "случайных" связей. Предлагаю оригинальное использование оригинального имени - Порядковый номер элемента в базе. Если элемент претерпел изменения, то и номер тоже.
|
|
|
|
|
16.4.2007, 14:31
|
CAD Developer
Группа: Участники форума
Сообщений: 409
Регистрация: 6.2.2006
Из: C.-Петербург, Россия
Пользователь №: 2062

|
Ух, пофлудю! Будет желание - пост стирайте, мне не жалко  Цитата Ты поиграйся с динблоком трубы, поиграйся. Советую. И все твои лавинообразно сыплящиеся страхи, а заодно и намерения по их устранению самоустранятся. А разве только трубы нужны? У меня, например, еще и панели, и плиты, и арматура ОВ, ВК, ЭО на совести болтается, и узловые куски... До хрена всего. Так что труба с моей точки зрения - это один конкретный случай, и не более того. По поводу расширенных данных. Поскольку ты постепенно подходишь к их использованию, сразу хочу предупредить: РД имеют порядочное количество ограничений. Самые главные из них - это ограниченность размера (16 килобайт), который дербанится между всеми приложениями. И второе - это ограничение и некоторая "зарезервированность" ключей. Лучше будет использовать ldata. P.S. Я у себя на блоге наконец-то положил очередную сборку своих лиспов, хочешь - посмотри. Там не все отлажено "на ура", но поглядеть ИМХО можно
|
|
|
|
Гость_Supermax_*
|
16.4.2007, 16:14
|
Guest Forum

|
На последней странице можно что угодно, только народ этого не просек пока. Читать многие умеют, но очень плохо (через слово). Самое главное свои сообщения редактируй вовремя, а то ссылаются на то, чего уже нет. Да и стирай, когда время их пришло+ За предложение спасибо, но я все равно далеко от темы отходить не могу, вот если ты мне скажешь, что там-то и там-то лежит лисп, который в такой-то проблеме мне может помочь, буду благодарен. А то, что толку разбирать тексты, если они не приспособлены для твоих целей? Только время потеряешь. Да, может научишся чему нибудь, но когда в поисковике набираешь ЛИСП, после обвала этих лиспов, что-то ничего разбирать не тянет. По поводу панелей и прочих деталей, могу дать ценный совет - надо к этому делу привлечь ресурс Интернета. Только с начала надо определиться в каком виде тебе это надо. Я думаешь, что просто так над оформлением объекта чертежа бъюсь? Нет. Я сделаю пару, тройку блоков и на DWG.ru выложу с предложением продолжить серию и обменяться результатами. Если каждый сделает по одному блоку, то получит все, которые сделали другие. Выгодно? - Думаю, что еще как выгодно!
|
|
|
|
|
17.4.2007, 7:45
|
CAD Developer
Группа: Участники форума
Сообщений: 409
Регистрация: 6.2.2006
Из: C.-Петербург, Россия
Пользователь №: 2062

|
Оффтоп и злостный флуд: Цитата На последней странице можно что угодно, только народ этого не просек пока. Для справки: у меня на одну страницу выводится сейчас 40 постов, и последняя страница начинается с поста kpblc Отправлено: Apr 9 2007, 14:59 А у тебя как? Цитата Самое главное свои сообщения редактируй вовремя, а то ссылаются на то, чего уже нет. Да и стирай, когда время их пришло Чтобы опять потом нить темы потерялась? Не, я на такое не согласный  Цитата Я сделаю пару, тройку блоков и на DWG.ru выложу с предложением продолжить серию и обменяться результатами. Если каждый сделает по одному блоку, то получит все, которые сделали другие. Выгодно? - Думаю, что еще как выгодно! Ага. Только сколько народу пришлет тебе блоки? Такие предложения возникают с завидной регулярностью, только делиться что-то никто не спешит...
|
|
|
|
Гость_Supermax_*
|
17.4.2007, 9:21
|
Guest Forum

|
Ну, давай мы с тобой будем вместе одну серию долбать и друг с другом обмениваться, а в теме будем констатировать факт произведенного обмена и обсуждать ощущения от процесса несозидания. Ведь на половину сократится объем. Мне тоже надо и прокат, и ЖБ изделия и многое другое. А кто захочет присоединиться - милости просим. Только за ответный трудовой подвиг.
Да кто-ж говорит про темы "с нитью"? Я о флуде базарю. Да и о корректировке, а то глючное сообщение стерто, а ревирансы по поводу его возникновения остались.
|
|
|
|
|
17.4.2007, 13:35
|
CAD Developer
Группа: Участники форума
Сообщений: 409
Регистрация: 6.2.2006
Из: C.-Петербург, Россия
Пользователь №: 2062

|
Ну не сказал бы, что флуд ненужен http://www.forum.abok.ru/index.php?act=ST&...=26&t=17508 - и, елси не трудно, обоснуй свой голос. Я проголосовал против, т.к. не считаю это правильным. Теперь по теме. Видишь ли, я не спец в ОВ, я - программер. Не больше, но и не меньше. Цитата одну серию долбать Да я бы рад, если б хоть что-то понимал в этом деле. ЖБИ, например, я вообще делал без библиотеки блоков, отрисовывая их динамически, с одновременной проверкой актуальности данных - они слишком легко алгоритмизировались, чтобы я прошел мимо такой возможности (правда, у меня на работе почти не встречаются непрямоугольные плиты и панели, так что мне было легче). Прокат можно брать у Геннадия Поспелова на сайте - у него там вроде даже отдельно это вынесено было.
|
|
|
|
Гость_Supermax_*
|
17.4.2007, 14:11
|
Guest Forum

|
Тудыть твою медь! Флуд, или треп, или болтовня естественно нужны, но только для поддержания настроения в текущем моменте. А для всей темы в целом - серьезнейшая помеха читаемости основного материала. Что основное, а что не основное не так уж и важно, даже можно некоторые перлы флуда оставлять, как самые флудливые. НО!!! Начиная с первой страницы и до предпоследней надо по максимуму освобождать текст от трепа! А на последней странице (а она у тебя говоришь аж 40 сообщений) можно хоть голую ... показывать. К стати, почему до сих пор нет смайлика "Вид с зади"? С боку есть, с переди есть, а с зади нет! Непорядок! Да и с низу тоже не помешает, типа упал.
По поводу созидательного процесса: Ты для кого проги пишешь? Для балерин? Или для проектировщиков? Как можно писать проги, если нет у программиста понимания о форме объекта? А если есть, то самый лучший эталон комплектности объекта, это какой-нибудь готовый объект. Вот давай и создадим, хотя бы один. А если у тебя есть в базе что нибудь подходящее - выставь на обсуждение. Если это не эталон - доделаем. А если эталон - будем по нему равняться. Не хочешь - найди кого нибудь из проектировщиков у себя в институте и нагрузи.
Я вот как раз этим эталоном и занят, а то не понятно, прогу вроде пишем, а что она считать будет не имеем. У меня такого проката - как грязи. Да программка удобная, но мне надо 3D c атрибутами. Я после трубы ППУ пару швелеров сделаю.
|
|
|
|
|
17.4.2007, 15:57
|
CAD Developer
Группа: Участники форума
Сообщений: 409
Регистрация: 6.2.2006
Из: C.-Петербург, Россия
Пользователь №: 2062

|
По пунктам: Цитата ы для кого проги пишешь? Для балерин? Или для проектировщиков? Проги пишу для пользователей (и мне глубоко фиолетово - проектировщики они, уборщицы или балерины). Мне пользователи ставят задачи, я их додумываю и потом делаю. Понадобилось им АР-ные чертежи переводить "в подложку" - да пожалуйста. Сказали, чего надо в конце получить, а остальное моя забота. Цитата Как можно писать проги, если нет у программиста понимания о форме объекта? Можно. Достаточно задачу нормально поставить. Хорошая постановка задачи - не меньше 70% решения. Если тебе надо разработать средство для решения, к примеру, такого: "Позволить пользователю многократно вставлять блок, находящийся в библиотеке. Блок в момент вставки динамически отрисовывается рядом с курсором. Атрибуты блоков заполняются автоматически, на основании списка возможных. Библиотека блоков лежит локально, кроме текущего пользователя, к ней никто доступа не имеет" Вот такую задачу я тебе сделаю. Не сразу, еще потерроризирую, но в конце концов сделаю. В этом - моя работа. Вспомни тему "борьбы с сисадминами". Так вот, я - почти сисадмин. Я обязан сделать так, чтобы пользователю было удобно работать, а чем он будет заниматься - простановкой условных обозначений с помощью моих дополнений или в CS рубиться - меня не волнует. Я не обязан знать до тонкостей все вопросы проектирования и программирования. Иначе на меня можно за компанию повесить и вопросы обмена данными ACAD <-> 1C <-> MS Project <-> PDM, и коридоры подметать.
|
|
|
|
Гость_Supermax_*
|
18.4.2007, 18:44
|
Guest Forum

|
Ну, посмотрим, что скажет на это уважаемая публика. 3D динамический блок теплоизолированной трубы Д-159 с атрибутами. В блоке автоматически меняются атрибуты в зависимости от быбираемых параметров свойств. Обратите внимание на маркировку, наименование, вес изделия и пр. параметры. Там, где нет вариантов исполнения, параметры автоматически становятся только для чтения и т. д. Блок легко переносится, копируется, и уже легко перетягивается за метку привязки. Размер файла при использовании динамических блоков вместо солидов практически не увеличивается. В целом есть над чем поработать. Например над упрощением создания блока. Файл 200 кб. Файл вернулся после реставрации. Посыпаю голову пеплом, не тот файл положил. Вот правильный.
Сообщение отредактировал Supermax - 24.4.2007, 14:42
|
|
|
|
Гость_Supermax_*
|
24.4.2007, 14:47
|
Guest Forum

|
Ребята, я случайно не тот файл положил. У меня была старая версия и новая, в разных папках, вот я и перепутал. Сори огромное. Файл поменял. ( на предидущей странице) Чтобы сгладить свою оплошность выкладываю лисп от Полищука Н.Н. Надеюсь он меня не заругает. Раскрытие свойсв динамического блока (к стати этого самого). ; по данным Лазебного А.В., 22.04.07 (vl-load-com) (setq es (car (entsel))) (setq ve (vlax-ename->vla-object es)) (vlax-dump-object ve T) ;#<VLA-OBJECT IAcadBlockReference 0e84068c> ; IAcadBlockReference: Интерфейс AutoCAD для работы с вхождениями блоков. ; Значения свойств: ; Application (RO) = #<VLA-OBJECT IAcadApplication 00d73d3c> ; Document (RO) = #<VLA-OBJECT IAcadDocument 014bb7a8> ; EffectiveName (RO) = "Труба ППУ Д-159" ; Handle (RO) = "940" ; HasAttributes (RO) = -1 ; HasExtensionDictionary (RO) = -1 ; Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 111a9304> ; InsertionPoint = (1751.35 1182.81 0.0) ; InsUnits (RO) = "Миллиметры" ; InsUnitsFactor (RO) = 1.0 ; IsDynamicBlock (RO) = -1 ; Layer = "0" ; Linetype = "ByLayer" ; LinetypeScale = 1.0 ; Lineweight = -1 ; Material = "ByLayer" ; Name = "*U41" ; Normal = (0.0 0.0 1.0) ; ObjectID (RO) = 2130600192 ; ObjectName (RO) = "AcDbBlockReference" ; OwnerID (RO) = 2130644216 ; PlotStyleName = "ByLayer" ; Rotation = 0.0 ; TrueColor = #<VLA-OBJECT IAcadAcCmColor 11135c60> ; Visible = -1 ; XEffectiveScaleFactor = 1.0 ; XScaleFactor = 1.0 ; YEffectiveScaleFactor = 1.0 ; YScaleFactor = 1.0 ; ZEffectiveScaleFactor = 1.0 ; ZScaleFactor = 1.0 ; Поддерживаемые методы: ; ArrayPolar (3) ; ArrayRectangular (6) ; ConvertToAnonymousBlock () ; ConvertToStaticBlock (1) ; Copy () ; Delete () ; Explode () ; GetAttributes () ; GetBoundingBox (2) ; GetConstantAttributes () ; GetDynamicBlockProperties () ; GetExtensionDictionary () ; GetXData (3) ; Highlight (1) ; IntersectWith (2) ; Mirror (2) ; Mirror3D (3) ; Move (2) ; ResetBlock () ; Rotate (2) ; Rotate3D (3) ; ScaleEntity (2) ; SetXData (2) ; TransformBy (1) ; Update ()
; Получаем семейство дианмических свойств (setq DynPrs (vla-GetDynamicBlockProperties ve))
(setq props (vlax-variant-value DynPrs)) (setq lprs (vlax-safearray->list props)) ;(#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f4a64> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f4644> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f4804> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f47e4> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f41c4> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f46a4> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f45a4> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f4684> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f4904> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f4844> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 11190164> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1c64> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1c84> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1ca4> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1cc4> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1ce4> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1d04> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1d24> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1d44> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1d64> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1d84> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1da4> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1dc4> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1de4> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1e04> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1e24> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1e44> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1e64> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1e84> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1ea4> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1f84> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1fa4> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1fc4> ;#<VLA-OBJECT IAcadDynamicBlockReferenceProperty 111f1fe4>) ; количество свойств (setq countPrs (length lprs))
; Проверяем первое (setq pr0 (nth 0 lprs)) (vlax-dump-object pr0) #<VLA-OBJECT IAcadDynamicBlockReferenceProperty 110f4a64> ; IAcadDynamicBlockReferenceProperty: Интерфейс AutoCAD для свойств динамического блока ; Значения свойств: ; AllowedValues (RO) = ("Ст 159х4,5-1-ППУ-ПЭ" "Ст 159х5-1-ППУ-ПЭ" "Ст 159х5,5-1-ППУ-ПЭ" "Ст 159х6-1-ППУ-ПЭ" "Ст 159х7-1-ППУ-ПЭ" "Ст 159х8-1-ППУ-ПЭ" ... ) ; Description (RO) = "" ; PropertyName (RO) = "Visibility" ; ReadOnly (RO) = 0 ; Show (RO) = 0 ; UnitsType (RO) = 0 ; Value = "Ст 159х8-1-ППУ-ПЭ"
; Возможные значения 0-го свойства (setq AlVals0 (vla-get-AllowedValues pr0)) (setq lVals (vlax-safearray->list (vlax-variant-value AlVals0))) ;(#<variant 8 Ст 159х4,5-1-ППУ-ПЭ> #<variant 8 Ст 159х5-1-ППУ-ПЭ> ;#<variant 8 Ст 159х5,5-1-ППУ-ПЭ> #<variant 8 Ст 159х6-1-ППУ-ПЭ> ;#<variant 8 Ст 159х7-1-ППУ-ПЭ> #<variant 8 Ст 159х8-1-ППУ-ПЭ> ;#<variant 8 Ст 159х4,5-2-ППУ-ПЭ> #<variant 8 Ст 159х5-2-ППУ-ПЭ> ;#<variant 8 Ст 159х5,5-2-ППУ-ПЭ> #<variant 8 Ст 159х6-2-ППУ-ПЭ> ;#<variant 8 Ст 159х7-2-ППУ-ПЭ> #<variant 8 Ст 159х8-2-ППУ-ПЭ> ;#<variant 8 Ст 159х4,5-1-ППУ-М> #<variant 8 Ст 159х5-1-ППУ-М> ;#<variant 8 Ст 159х5,5-1-ППУ-М> #<variant 8 Ст 159х6-1-ППУ-М> ;#<variant 8 Ст 159х7-1-ППУ-М> #<variant 8 Ст 159х8-1-ППУ-М> ;#<variant 8 ООО "Виртуальные Строительные Технологии">)
; Список возможных значений всех свойств дин. блока
(setq all-lVals '() k -1) (repeat countPrs (setq k (1+ k) pr-k (nth k lprs)) (setq AlVals-k (vla-get-AllowedValues pr-k)) (setq val-k (vlax-variant-value AlVals-k)) ; проверка правильности индексов массива (м.б. пустой массив) (if (>= (vlax-safearray-get-u-bound val-k 1) (vlax-safearray-get-l-bound val-k 1)) (setq lVals (vlax-safearray->list val-k)) (setq lVals nil) ) (setq all-lVals (append all-lVals (list lVals))) )
; Результат ;((#<variant 8 Ст 159х4,5-1-ППУ-ПЭ> #<variant 8 Ст 159х5-1-ППУ-ПЭ> ; #<variant 8 Ст 159х5,5-1-ППУ-ПЭ> #<variant 8 Ст 159х6-1-ППУ-ПЭ> ; #<variant 8 Ст 159х7-1-ППУ-ПЭ> #<variant 8 Ст 159х8-1-ППУ-ПЭ> ; #<variant 8 Ст 159х4,5-2-ППУ-ПЭ> #<variant 8 Ст 159х5-2-ППУ-ПЭ> ; #<variant 8 Ст 159х5,5-2-ППУ-ПЭ> #<variant 8 Ст 159х6-2-ППУ-ПЭ> ; #<variant 8 Ст 159х7-2-ППУ-ПЭ> #<variant 8 Ст 159х8-2-ППУ-ПЭ> ; #<variant 8 Ст 159х4,5-1-ППУ-М> #<variant 8 Ст 159х5-1-ППУ-М> ; #<variant 8 Ст 159х5,5-1-ППУ-М> #<variant 8 Ст 159х6-1-ППУ-М> ; #<variant 8 Ст 159х7-1-ППУ-М> #<variant 8 Ст 159х8-1-ППУ-М> ; #<variant 8 ООО "Виртуальные Строительные Технологии">) ; (#<variant 8 Теплоизолированная стальная труба Д-159 в полиэтиленовой оболочке ...> ; #<variant 8 Теплоизолированная стальная труба Д-159 в оболочке из оцинкованной стали ...> ; #<variant 8 Custom>) (#<variant 8 Ст 159х4,5-1-ППУ-ПЭ> #<variant 8 Ст 159х5-1-ППУ-ПЭ> ; #<variant 8 Ст 159х5,5-1-ППУ-ПЭ> #<variant 8 Ст 159х6-1-ППУ-ПЭ> ; #<variant 8 Ст 159х7-1-ППУ-ПЭ> #<variant 8 Ст 159х8-1-ППУ-ПЭ> ; #<variant 8 Ст 159х4,5-2-ППУ-ПЭ> #<variant 8 Ст 159х5-2-ППУ-ПЭ> ; #<variant 8 Ст 159х5,5-2ППУ-ПЭ> #<variant 8 Ст 159х6-2-ППУ-ПЭ> ; #<variant 8 Ст 159х7-2-ППУ-ПЭ> #<variant 8 Ст 159х8-2-ППУ-ПЭ> ; #<variant 8 Ст 159х4,5-1-ППУ-М> #<variant 8 Ст 159х5-1-ППУ-М> ; #<variant 8 Ст 159х5,5-1-ППУ-М> #<variant 8 Ст 159х6-1-ППУ-М> ; #<variant 8 Ст 159х7-1-ППУ-М> #<variant 8 Ст 159х8-1-ППУ-М> #<variant 8 Custom>) ; (#<variant 8 ОКП 493600; ТУ 400-24 578-92> #<variant 8 Custom>) ; (#<variant 8 ЗАО "Мосфлоулайн"> #<variant 8 Custom>) ; (#<variant 8 4,5мм.> #<variant 8 5мм.> #<variant 8 5,5мм.> #<variant 8 6мм.> ; #<variant 8 7мм.> #<variant 8 8мм.>) ; (#<variant 8 4,5мм.> #<variant 8 5мм.> #<variant 8 5,5мм.> #<variant 8 6мм.> ; #<variant 8 7мм.> #<variant 8 8мм.> #<variant 8 Custom>) ; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)> ; #<variant 8 Тип 2 (толщина утеплителя 55,5мм.)> #<variant 8 Custom>) ; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)> ; #<variant 8 Тип 2 (толщина утеплителя 55,5мм.)> #<variant 8 Custom>) ; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)> ; #<variant 8 Тип 2 (толщина утеплителя 55,5мм.)> #<variant 8 Custom>) ; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)> ; #<variant 8 Тип 2 (толщина утеплителя 55,5мм.)> #<variant 8 Custom>) ; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)> ; #<variant 8 Тип 2 (толщина утеплителя 55,5мм.)> #<variant 8 Custom>) ; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)> ; #<variant 8 Тип 2 (толщина утеплителя 55,5мм.)>) ; (#<variant 8 4,5мм.> #<variant 8 5мм.> #<variant 8 5,5мм.> #<variant 8 6мм.> ; #<variant 8 7мм.> #<variant 8 8мм.> #<variant 8 Custom>) ; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)> #<variant 8 > #<variant 8 Custom>) ; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)> #<variant 8 > #<variant 8 Custom>) ; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)> #<variant 8 > #<variant 8 Custom>) ; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)> #<variant 8 > #<variant 8 Custom>) ; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)> #<variant 8 > #<variant 8 Custom>) ; (#<variant 8 Тип 1 (толщина утеплителя 41,5мм.)> #<variant 8 > #<variant 8 Custom>) ; (#<variant 8 ПЭ (полиэтилен)> #<variant 8 М (оцинкованная сталь)> #<variant 8 Custom>) ; (#<variant 8 ПЭ (полиэтилен)> #<variant 8 М (оцинкованная сталь)> #<variant 8 Custom>) ; (#<variant 8 ПЭ (полиэтилен)> #<variant 8 М (оцинкованная сталь)> #<variant 8 Custom>) ; (#<variant 8 ПЭ (полиэтилен)> #<variant 8 М (оцинкованная сталь)> #<variant 8 Custom>) ; (#<variant 8 ПЭ (полиэтилен)> #<variant 8 М (оцинкованная сталь)> #<variant 8 Custom>) ; (#<variant 8 ПЭ (полиэтилен)> #<variant 8 М (оцинкованная сталь)>) ; (#<variant 8 ПЭ (полиэтилен)> #<variant 8 Custom>) ; (#<variant 8 Пенополиуретан> #<variant 8 Custom>) ; (#<variant 8 Шт.> #<variant 8 Custom>) ; (#<variant 8 22.391 (кг.)> #<variant 8 24.231 (кг.)> #<variant 8 26.061 (кг.)> ; #<variant 8 27.881 (кг.)> #<variant 8 31.481 (кг.)> #<variant 8 35.031 (кг.)> ; #<variant 8 24.122 (кг.)> #<variant 8 25.962 (кг.)> #<variant 8 27.792 (кг.)> ; #<variant 8 29.612 (кг.)> #<variant 8 33.212 (кг.)> #<variant 8 36.762 (кг.)> ; #<variant 8 26.91 (кг.)> #<variant 8 28.75 (кг.)> #<variant 8 30.58 (кг.)> ; #<variant 8 32.4 (кг.)> #<variant 8 36.0 (кг.)> #<variant 8 39.55 (кг.)> ; #<variant 8 Custom>) (#<variant 8 22.391 х L (кг.)> #<variant 8 24.231 х L (кг.)> ; #<variant 8 26.061 х L (кг.)> #<variant 8 27.881 х L (кг.)> ; #<variant 8 31.481 х L (кг.)> #<variant 8 35.031 х L (кг.)> ; #<variant 8 24.122 х L (кг.)> #<variant 8 25.962х L (кг.)> ; #<variant 8 27.792 х L (кг.)> #<variant 8 29.612 х L (кг.)> ; #<variant 8 33.212 х L (кг.)> #<variant 8 36.762 х L (кг.)> ; #<variant 8 26.91 х L (кг.)> #<variant 8 28.75 х L (кг.)> ; #<variant 8 30.58 х L (кг.)> #<variant 8 32.4 х L (кг.)> ; #<variant 8 36.0 х L (кг.)> #<variant 8 39.55 х L (кг.)> #<variant 8 Custom>) ; nil ; nil ; (#<variant 8 www.mosflowline.ru> #<variant 8 Custom>))
Сообщение отредактировал Supermax - 24.4.2007, 14:53
|
|
|
|
Гость_Supermax_*
|
25.4.2007, 16:44
|
Guest Forum

|
Решил я задачку по «встряске» свежевставленного динамического блока. Дело в том, что в AutoCAD-e есть один глюк. Когда меняешь динамические свойства блока, он переименовывается со значения EffectiveName на *U… , а когда возвращаешь старое значение этих свойств, он на значение EffectiveName не возвращается. Если в это время вставить в чертеж еще один такой же блок, то в чертеже будут два абсолютно одинаковые по всем параметрам (кроме DXF пары 2) блока. У одного имя будет, как и EffectiveName, а у другого *U… Задача была как-нибудь воздействовать на свежевставленный блок, чтобы он в DXF точечной паре 2 сравнялся с существующим *U… Все оказалось очень просто:
(setq es (car (entsel))) (setq ve (vlax-ename->vla-object es)) (setq DynPrs (vla-GetDynamicBlockProperties ve)) (setq props (vlax-variant-value DynPrs)) (setq lprs (vlax-safearray->list props)) (setq pr0 (nth 0 lprs)) (setq val (vlax-variant-value (vlax-get-property pr0 'value))) (vlax-put-property pr0 'value val)
Получилось нечто вроде ATTSYNC только наверное это NAMESYNC Читаем значение свойства value и записываем его же ему же.
|
|
|
|
|
26.4.2007, 11:36
|
Группа: New
Сообщений: 1
Регистрация: 26.4.2007
Пользователь №: 7390

|
На мой взгляд, процесс создания спецификации, а особенно создания выносок с позициями – самая утомительная часть проектирования. И если этот процесс автоматизировать, сэкономленными окажутся как время, так и нервы. В ходе обдумывания этих вопросов пришел к следующему выводу: У меня есть блоки (нединамические). Как правило, блок состоит из самого устройства, так и из сопутствующего фитинга: фланцев или муфт, например. В этих блоках-устройствах есть атрибуты –«Наименование», «№ опросного документа», «Код», в-общем, все графы, которые присутствуют в стандартной 9-графке. Программой я вытаскиваю значения атрибутов и заполняю в template 9-графку. Таким образом в ГОСТовскую спецификацию записывается только «основное оборудование». В excel экспортируются имена блоков, получается ведомость материалов со всеми фланцами, отводами и т.д. Особой программкой считаю рисую и считаю пустотелые трубы, которые потом вручную вбиваю в ведомость. К сожалению, насос Grundfos я оспецифицировать (извиняюсь за неологизм) не смог. Короче, выкладываю LISPы для спецификации, шаблон 9графки и пример участка трубопровода. Для работы нужно прописать в Lispах нужные пути. Предупреждаю, программа еще находится в стадии написания, так что сильно не ругайтесь. Может, быть совместными усилиями что-нибудь сваяем...
Прикрепленные файлы
specif.rar ( 1,05 мегабайт )
Кол-во скачиваний: 161
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
Реклама
ООО «Арктика групп» ИНН: 7713634274
Реклама: ООО «СибСтронг» | ИНН 6670013662 | ERID: 2VtzqvWgxEU
ООО «УНИСПЛИТ» ИНН: 6453155081 erid:2VtzqvybpdW
Реклама: ООО «СЛ-ЛАЗЕР» ИНН 7727447267 | erid: 2VtzquvhFWx
Последние сообщения Форума
|