Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Создание спецификации автоматически (Дубль2)
Диалог специалистов АВОК > ФАЙЛОТЕКА СПЕЦИАЛИСТА > Программы, расчеты
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
Supermax
Внимание! Все сообщения в данной теме должны строго соответствовать предмету обсуждения.
Вопросы справочного харрактера, не влияющие на ход рассуждений по данной проблеме и ответы на такие вопросы, существуют только на последней странице! Сообщения эмоционального харрактера, разговорного обмена репликами, и т.п, также существуют только на последней странице.



Очень прошу отозваться того модератора, который готов взять шефство над данной темой.
Чтобы не обременять модератора частыми профилактическими мероприятиями по зачистке темы, готов взять на себя обязанность по сообщению ему через функцию "Доложить" о сообщениях, не представляющих по моему мнению никакого интереса. НО! не настаиваю на выполнении действия по их удалению.
В случае появления существенных разногласий между мною (инициатором темы) и модераторм, оставляю за собой право прекратить участие в обсуждении и если мне на этот момент будет доступна функция удаления своих сообщений, предварительно уведомив модератора - удалять их.
Мои сообщения, что бы они не содержали, разрешаю удалять по любому поводу.


И так. На данный момент мною создается программный продукт (макрос к программе AutoCAD), позволяющий при определенных условиях, обрабатывать чертежи, или модели в DWG формате с последующим автоматическим созданием листов спецификаций и заполнением листа ресурсов программы Microsoft Project.

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

Предшествующая версия макроса, позволяющая производить подсчет блоков по их имени, а также подсчет общего колличества длин, площадей и объемов с переводом в метры, метры2 и метры3 представлена ниже. Результаты данного подсчета транслируются автоматически в Word или Excel.

Размер файла 151 КБ
e.o.l.
с учётом персонального интереса к данной теме, готов помогать по мере возможностей и в соответствии с правилами данного форума
Supermax
Общая концепция:

Модель содержит:
– слои, простые примитивы (линии, плоскости, солиды), отдельные
атрибуты, сложные примитивы (блоки, группы атрибутов).

Требования к модели:
- наименование слоев не имеет значения,
- наименование блоков тоже не имеет значения (хотя лучше, чтобы совпадало с наименованием изделия).

Назначение слоев:
- содержать примитивы, по которым считаются длины, площади и объемы

Назначение блоков:
- скомпонованные изделия или материалы. Единица измерения указана в свойствах блока, метод расчета в атрибутах блока. Содержат графическое представление формы изделия или символ материала, свойства изделия или материала и атрибуты блока.
Тип блоков - всегда динамический. Не динамические блоки считаются технологическим группированием элементов чертежа.
изменено 5.10.2007г.

Назначение атрибутов блока:
- Определять принадлежность данной единицы изделия или материала к проекту и описывать параметры этой принадлежности. По выбранному методу расчета, (содержащимся в одном из атрибутов группы), по данным параметров примитивов, находящихся в одном слое с этой группой, образуют метод определения параметров и количества материала данного типа.

Например: В слое, в котором трасса трубопровода представлена линиями (полилиниями, 3Dполилиниями, сплайнами, дугами) лежит динамический блок, где из графики есть только условное обозначения трубопровода. В свойствах этого блока (назовем его "виртуальный материал") указаны все свойства материала, в том числе и единица измерения. В атрибутах этого блока атрибут с именем (строка "Tag") "метод_расчета" и значением (строка "Value") содержит запись, выраженную в условных величинах (см. ниже) – (сумма всех длин 3Dполилиний деленная на 1000), в другом динамическом блоке – ( сумма объемов всех солидов данного слоя деленная на 9156,24 (сечение 108 трубы в мм2) деленная на 1000 и все это умноженное на удельный вес 1-го погонного метра утеплителя.), в третьей – (вычисленная длинна в метрах деленная на 2, и результат штуки).

Таким образом, опираясь на данные свойств и атрибутов динамического блока отвечающего за материал по данным элементов принадлежащего этим атрибутам слоя вычисляем параметры «виртуальных изделий и материалов»

Уже написан (далее в теме) макрос, который создает и редактирует сразу целую группу атрибутов (чтобы с привязками и комплектностью не мучаться). В AutoCAD-е все делается по одной штуке. Хотя он слегка устарел, но в кодах можно изменить назначение атрибутов. Я его отредактирую, когда разберусь с полным комплектом этих атрибутов.
Единицы измерения длин и объемов значения не имеют, поскольку формулы составляются теми, кто их использует. Например Англичане в модели насторенной на футы и дюймы будут получать длины в этих дюймах и по формуле делить их или умножать на те числа, которые им нужны.

Назначение блоков:
- Штучные, видимые на чертеже и мониторе объекты, являющиеся изделиями или материалами. Изделия - могут лежать где угодно. Материалы в тех слоях, в которых лежат примитивы по которым считается расход данного материала.

Назначение отдельных атрибутов:
Отдельно стоящие атрибуты системой не обрабатываются.

Значение символов ".txt" в атрибуте "МЕТОД_РАСЧЕТА":

- Атрибут, если у него в значении "Prompt" есть сочетание символов ".txt" то есть расширение со ссылкой на текстовый файл, это так называемый "сложный атрибут".
Если такого в данной строке не найдено и запись не соответствует формату формулы, то такой блок выбраковывается.

Например - кирпичная кладка.

В атрибуте "МЕТОД_РАСЧЕТА", может содержать только расчет объема кирпичной кладки из такого-то кирпича, таким-то раствором, с такой-то степенью армирования. Если атрибут связан ссылкой на текстовый файл, то в файле, на который есть ссылка в атрибуте указаны все составляющие данный материал суббматериалы. Арматура сечением таким-то (расход на данный вид кладки), Арматура других сечений, Проволка вязальная, раствор марки такой-то (расход на такой тип кладки - зависит от выбранного типа кирпича), Кирпич тако-то (расход на данный вид кладки) и т.п. При составлении спецификации субматериалы прописываются сразу за позицией генерального материала.

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


Набор требуемых файлов:

Файлы сложных атрибутов *.txt - Содержат сведения о составе и методе расчета материалов из которых состоит генеральный материал. Например: "Кирпичная кладка"

gostb_pg.shx – Шрифт, используемый при черчении таблицы и штампов.

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

Макрос2.lsp – Блок конвертации результатов расчета для передачи данных в другую программу (в частности Project). Также может быть заменен на что-нибудь другое.

Макрос1.lsp – Основное рабочее тело программы.

Таблица очередности.xls – Файл Excel в которм определены все параметры, как сортировки, так и вывода данных. Редактируется пользователем по своему усмотрению.

Даю на рассмотрение и обсуждение файл с таблицей очередности сортировки и параметрами заполнения таблицы. Возможно будет добавлен третий лист, для определения компоновки даных в MS-Project.

Отредактировано полностью 11 октября 2007 года.
Размер файла 17,5 КБ.
OVKT
Весьма советую перенести сюда ФАЙЛЫ с бывшей ветки.

Моё мнение (которое можно удалить, что сейчас модно, особенно в этой теме), состоит в том, что мы ломимся в открытую дверь.
Как посчитать количество кранов, фитингов или данфоссов? Надо сделать такие блоки с правильными ИМЕНАМИ, на каждый диаметр свой. Составить чертёж строго из правильно наименованных блоков.
Далее волшебная команда BCOUNT. Там предложат обвести окно или посчитать на всём чертеже. Результат: список блоков, тождественный списку применённых элементов.
И всё. Далее заполняем вручную Word'овский шаблон. См. мой сайт.
Зачем мне (лже) автоматизация? Чужой почерк неприемлем для другого кадра. Всё равно что взять у коллеги чужую спецификацию, вырезать без проверки и вставить себе.
Тем более: как же Ваша спецификация будет работать у "всех производителей", если у меня не заработало ничего правильно?
Предлагаю сделать так: если к июлю-2007 ничего не получится, работу по глобальной автоматизации спецификации свернуть.
Примечание: ранее была свёрнута разработка "стандарта запретов" на черчение в Автокаде, с 2005 года работа на возобновлена.
Эту тему ждёт та же участь. То, что интересно активистам, окажется совершенно неинтересно инженерам на местах.
Я же советовал: сделать макросы для Excel, которыми набираются строки 1-м щелчком на отдельном листе. Вот это инженеры оценят, а всеобщую спецификацию по шаблону "свыше" - НИКОГДА!
Supermax
Про файлы:
Если кому-то нужны файлы или сообщения из старой темы
Говорите какие и алле – они тут.

Только одного имени уже, к сожалению, не хватает. Началось все с того, что сметный отдел потребовал вес изделий. Второй раз я этот кошмар не переживу! Потом начался второй кошмар – поиски в смете-ру эквивалентных позиций оборудования. Оказалось, что 70% просто не с чем сравнивать. Применили опцию «По счету». Ко мне заявились и стали требовать эти самые счета на, аж 150 позиций. Я раскидал спецификацию по 5 крупным фирмам комплектующим строительство (Сантехкомплект в частности и несколько специфичных). Там оказалось есть далеко не все, а на многие позиции только заказ, да и цен пока не знают. Всю инфу отдал начальству и в сметный отдел, там она благополучно скончалась, а через месяц вдруг срочно опять понадобилась! Хорошо, что я в проджекте все набил и ссылки оставил. А сколько мне понадобилось времени, чтобы все это найти и набить? – НЕДЕЛЯ!
Пошли согласовывать ИТП, а мне дают замечание – заменить спаренные насосы на два отдельных! Добавить и там и сям краников, манометров. А один, очень продвинутый представитель эксплуатирующей организации даже захотел поставить параллельно основному теплообменнику отопления, второй, запасной! (еле отбились!). Монтажка слава богу в 3D. Вставил, добавил маркировки и опять распечатал. Листов спецификаций – 4. Все позиции сдвинулись.
Кроме того, что в штуках, очень много того, что в метрах и кубометрах. Когда делаешь трассировку трубопровода по зданию, и утеплитель, и крепления, и краска (если трубы красить надо), и строительный раствор (штроба замазывать) и строительный мусор (от штробления стен). Все это никто не рисует и в 3D не ваяет! Провел линии, или 3Dполилинии и умножил на рассчитанный коэффициент. А сколько таких коэффициентов ты знаешь? Их что, каждый раз сидеть и вычислять? А трубы между сантехнической арматурой, что тоже блоками оформлять? Их все время, то удлинять, то укорачивать приходиться, и сколько у тебя труб заданного диаметра только по их объему и можно определить! (Правда в 2007 каде у солида, вытянутого по пути появилась длинна!).
Supermax
В Excel-евском файле умерли позиции ограничения по X и Y
Добавлены позиции Х заголовков разделов
Переведены названия имен атрибутов в верхний регистр
Отредактированы значения центровки по Х текста столбцов
Отредактированы 16.03.2007 положения стратегии по сложным атрибутам

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

Отредоктирована концепция построения чертежа. В ней появились "Сложные атрибуты"

Изменено 16.03.2007
Supermax
Сюда (вот на это самое место, постоянно его редактируя) я буду вставлять тело программы.
Я пишу на AutoLISP-е. Если среди аудитории есть те, кто тоже на лиспе работает - отзовитесь. Очень нужны, как критики, так и помощники. Сейчас бьюсь над сортировкой атрибутов.

Дополнение:
Пока я не выясню, юридическую сторону вопроса (см. ниже), я повременю сюда что либо выкладывать. НО! тем, кто мне помогает, буду отсылать по почте.
Supermax
Даю на обсуждение правила заполнения атрибута "МЕТОД_РАСЧЕТА"

Файл отреставрирован в соответствии с изменившейся концепцией. 30.5 КБ
Supermax
Даю на обсуждение пример атрибутов виртуальных материалов и изделий

Файл 43 КБ
kpblc
Позвольте и мне уж высказаться (Bers указал на тему).
Несколько сначала замечаний (предложения будут позже wink.gif)
0. Макросом тут не обойдешься.
1. Подсчет блоков по имени сам по себе малодостаточен. Кроме того (сейчас не имею возможности проверить dvb-файл, но не думаю, чтобы там была эта проверка введена), штатные средства (тип bcount) не позволяют считать количество динамических блоков (не ведется обработка свойства EffectiveName, а дин.блоки выглядят для стандартного лиспа как анонимные и исключаются из обработки).
2. Не рекомендовал бы завязываться на MS Office - он может быть попросту не установлен на клиентской машине. Вместо него может быть поставлен OpenOffice. Я б рекомендовал брать за основу xml либо txt формат. Учитывая, что xml допускает самое различное написание, можно сделать xml, который распознается и Excel'ем, и OO Calc'ом вполне адекватно.
3. Рисование может выполняться в неметрической системе единиц; либо в метрах. Поэтому вариант деления полученной длины на 1000 может выдать некорректный результат. Рекомендовал бы использовать БД (оформленную как угодно - как xml, как mdb, как sql - все едино, небольшая разница будет только при разработке механизма запросов).
4. "Кошмар" был предсказуем теоретически. ИМХО: не надо за сметчиков - планировщиков - экономистов выполнять их работу. Та же цена может меняться по сотне раз за месяц. И что, каждый раз переделывать? В спецификации должно быть только количество, имя, может быть, уникальный ID, и все - минимум информации. Результат выводить в тот же txt определенного формата, который и импортировать уже Сметой.ru или каким-либо иным софтом. Это вопрос десятый.
5. И, наконец, последнее. Если автору интересно, через неделю - две я по новой открою тему у себя на блоге с софтом CADWare (он посвящен аналогичным вопросам, там проблем сейчас очень много, в процессе решения они).

Теперь предложения.
Вся проблема на самом деле не в том, чтобы посчитать или прочитать данные, а в том, чтобы их записать в примитивы либо файл. При этом добиться безупречной работы. Одно дело оформить прямоугольник и на выноске написать что это вент.отверстие, другое - сделать его блоком и положить на определенный слой, и третье - это засунуть "внутрь" этого блока дополнительные данные (я не спец, поэтому пример может быть не очень ярким). Обработать "неоткрытые" файлы из какого-то каталога, добившись "неслетения" ни AutoCAD'a, ни лиспа (а то можно получить странные глюки). Поддерживать все версии своего ПО, добиваясь полной совместимости. Оформить результаты выполнения таблицей прописанного формата (который, кстати, может быть и изменен) с фиксацией высоты строк и таблицы. Вставлять таблицу в форматку. Автоматически разбивать таблицу на куски с максимальной высотой, например, в 20 строк (кстати, atable вроде как собирается автор добивать на эту тему).

Автору также порекомендовал бы прочитать "САПР на базе AutoCAD - как это делается" за авторством Зуева С.А., Полещука Н.Н. при участии Лоскутова П.В. Вроде бы на ozon.ru еще была. Система ruCAD ориентирована, насколько я понял, именно для подобных задач. Так что и ее поглядеть не помешает. Даже в "книжной" версии очень многое сделано. То, что там были найдены баги и глюки самими разработчиками, нисколько не умаляет ее ценности. То, что ShaggyDoc более здесь не появляется, конечно, огромный минус sad.gif Я не он, но чем смогу - тем помогу smile.gif Работаю на vlisp, VB.

Цитата
А трубы между сантехнической арматурой, что тоже блоками оформлять?

Можно и блоками. А можно и отрезками / полилиниями, засунув внутрь этих примитивов специальным образом сформированные данные. Которые тот же лисп прочитает на ура.

P.S. В течение ближайшей недели меня не будет, так что пишите в e-mail либо ПМ, когда вернусь обратно - постараюсь ответить всем.
P.P.S. Я бы рекомендовал по максимуму не завязываться на какую-то конкретную версию AutoCAD'a. Начать, например, с 2002 и просто отключать работу в более ранних версиях (выполняется элементарной проверкой (atof (getvar "acadver"))).
Supermax
Отвечаю по пунктам:
1. Не понял, о какой проверке идет речь. В выложенной старой версии макроса считаются любые блоки. Подсчитывается количество блоков с одинаковым именем и это имя и его количество прописываются в таблицу. Да, если у вас в поле выборки попали динамические блоки, которые вы «пошевелили», то появляется вместо имени *U1….N Но не надо забывать, что динамический блок типа «окно». Которое можно шевелить, после шевеления уже перестает быть тем начальным окном, имя которого несло все, что об этом окне можно было сказать. Поэтому такие блоки надо после «шевеления» заключать в простой блок с новым именем «окна»! При обработке новой версией написанной на Лиспе, имя блока вообще не имеет значения, только для идентификации совпадений и подсчета количества. Поскольку параметры атрибутов на каждый блок можно менять, то и имя там тоже будет как параметр.
2. MS Office в старой версии макроса – постольку, поскольку. В новой версии результат будет выводится только в Layout в том виде, в котором будет запрограммирован в дополнительной подпрограмме Лиспа, в нашем конкретном случае - ПО ГОСТУ. Файл с ориентировками последовательности и компоновки расчета, скорее всего будет не *.xls, а два или три *.csv их легче обрабатывать, хотя я до конца еще не решил.
3. Методу расчета наплевать на единицы измерения. Если вы чертите в дюймах, то будьте добры и метод расчета корректировать. А если вам надо начерченное в мм перевести в футы, то и в методе расчета ставьте соответствующе число. Деление на 1000 всего лишь перевод миллиметров, в которых нарисован чертеж в метры. Нужны сантиметры? – делите на 100. И база данных чего?
4. При разработке проекта (я имею в виду не бумагу), все, кто в нем участвуют являются лишь исполнителями предписанных им функций. Все должны стремится к одной цели и писать программу только для облегчения работы, например расчетчика, поплевывая на все, что после меня, не дальновидно и не красиво. Цена на материал в программу и не входит, но ссылка на позицию в каталоге (если таковой имеется) – обязательна. После чего и до прайса добраться будет не трудно. Экспорт данных – отдельная лиспина Макрос2 именуемая. Их разновидностей могет быть (а скорее всего и будет) много.
5. И ниже по тексту. С таблицами CAD-а при заполнении бланка пока не связываюсь.
Все книжки у меня есть, и их наработки я видел (краем глаза). Принцип построения чертежа завязан на СУБД программы. Вляпались, одним словом.

Файл отчерчивания таблицы спецификации со всеми штампами 5,63 КБ
(если кому надо могу сказать как сделать кнопкой с автоматическим созданием Layout-а)
Supermax
Обращаюсь к организаторам форума.
Вот здесь в этот самый момент (если все пойдет удачно) рождается некий программный продукт, который затем должен приобрести статус «Free Download Software». Чтобы подарить кому-нибудь, что-нибудь, надо этим обладать. Хорошо, если я сам сижу, пишу, и никому ничего не показываю. Написал, пошел, оформил авторство и потом иди и дари права, поскольку ты ими обладаешь. Но если ты еще ничего не написал, а только пишешь, то никаких прав ты пока и не оформишь. А тот, кто стоит у тебя за спиной, которого ты не видишь, ждет, пока ты все это напишешь. Как только тебе остается пару очевидных пассов руками, он, быстренько хватает текст проги и бежит регистрировать. После этого все, что тут написано, юридически будет считаться нарушением авторских прав.
Я в состоянии все сделать втихаря, но результат будет кривой и одноглазый. А делать открыто, как я и вознамерился, используя интеллектуальный потенциал «окружающей среды», чревато тем, что мы с вами окажемся в дураках. Как решить эту проблему? Очень нужна консультация юриста. У вас есть форум, содержание которого, юридически, есть база данных. Базы данных охраняются законом. У вас открытая база данных, которую читают все. Как сделать так, чтобы никто не мог оформить авторские права на то, что опубликовано здесь ДО ТОГО! Даты создания файлов не рассматриваются, поскольку легко меняются. Если бы это была публикация – все просто. Нотариально заверяется дата ее выпуска. Но поскольку текст в теме все время девиирует, нотариально заверить можно только дату создания темы. Если прийти в нотариальную контору с таким делом, там все сойдут с ума. Необходим нотариальный надзор. Когда речь идет о процессе создания чего либо и есть опасение, что во время этого процесса кто либо может воспользоваться элементами этого процесса не законно, нотариус, как представитель государства, может удостоверить по окончании процесса или при возникновении инцидента, что материал находящийся в данной теме, на данном сайте является первоисточником.

В соответствии со ст. 35 Основ законодательства Российской Федерации о нотариате нотариусы совершают следующие нотариальные действия:

1. Удостоверяют сделки, в том числе с недвижимостью;
2. Выдают свидетельства о праве на наследство и праве собственности на долю в общем имуществе супругов.
3. Налагают и снимают запрещения отчуждения имущества.
4. Свидетельствуют верность копий документов и выписок из них.
5. Свидетельствуют подлинность подписи на документах.
6. Свидетельствуют верность перевода документов с одного языка на другой.
7. Удостоверяют факт нахождения гражданина в живых.
8. Удостоверяют факт нахождения гражданина в определенном месте.
9. Удостоверяют тождественность гражданина с лицом, изображенным на фотографии.
10. Удостоверяют время предъявления документов.
11. Передают заявления физических и юридических лиц другим физическим и юридическим лицам.
12. Принимают в депозит денежные суммы и ценные бумаги.
13. Совершают исполнительные надписи.
14. Совершают протесты векселей.
15. Предъявляют чеки к платежу и удостоверяют неоплату чеков.
16. Принимают на хранение документы.
17. Совершают морские протесты.
18. Обеспечивают доказательства.

Обращаю внимание на пункты 10 и 18.

После реакции, данное сообщение будет удалено.

Интересно, среди читателей данного форума случайно нотариусов нет?
Supermax
Произошли изменения в правилах заполнения атрибута «МЕТОД_РАСЧЕТА»
Я отказался от обычного представления математических выражений и разрешил вписывать в строку выражения AutoLISP-а. например сложение (+ А1 3.5 17 21) означает сумма значений переменной А1 и чисел 3.5, 17, 21.
Макрос не будет проверять на корректность то, что написано в этой строке и будет пытаться ее выполнить, даже если вы ею запускаете внешнюю программу.
НО! Прежде, чем совершить попытку выполнить данное выражение, будет проверено наличие таких атрибутов как «НАИМЕНОВАНИЕ» и «ЕДИНИЦА_ИЗМ». Далее на экран будет выводится менюшка, в которой будет записано, какая группа, в каком слое и полное содержание строки значения атрибута «МЕТОД_РАСЧЕТА». Если программа при выполнении этой задачи зависнит, или выдаст ошибку и прекратит функционирование, на экране останется «след» по которому можно легко найти виновника этой трагедии.

Решен вопрос с определением "основного" набора атрибутов. В листе Excel-я, те наименования атрибутов, что требуют обязательного присутствия в группе должны выделяться цветом шрифта (любым, кроме черного). Три позиции - Наименование, Единица измерения и Метод рачета, являются обязательными всегда.

По просьбе общественности шрифт 4,7 КБ
kpblc
Сразу по лиспу несколько замечаний.
1. Что делать тем несчастным, у которых не AutoCAD 2006, либо установлен он по другому пути?
2. Что делать пользователям русских версий (это к вопросу о подчеркивании)
3. Что делать, если пользователь нажал Esc? (Это к вопросу об обработчике ошибок)?
4. Что делать, если фонт установлен не по указанному пути либо его нет?
В общем и целом я бы лисп полностью переписал. На несколько функций его разбить - отдельно создание текстового стиля, отдельно - таблицу. Оформить все в отдельную команду со своим обработчиком ошибок.
<Код снесен за ненадобностью. kpblc>
---
Удалось немного посмотреть dvb файл, но что-то я его логику не очень понял. В качестве совета - менять имена контролов по умолчанию на что-то более информативное. Например, CommanButton26 - на btnExportToWord.
Кроме того, там не проверяется - может быть, Excel / Word уже запущены. Какой смысл тогда создавать еще один экземпляр приложения? Не отслеживается ошибка создания объекта Word'a (он может быть не создан; версия может быть "не та" ну и так далее). DVB сам по себе интересен, но я бы на него не завязывался (вроде бы уже говорил почему).
---
Насчет последнего поста. Если завязываться на БД (а она сюда так и просится), то весь вопрос фактически сводится к тому, чтобы сформировать нормальный запрос. Если БД нет, то мне остается только посочувствовать...
Supermax
Е-кылы-мыны! Нельзя-ж так людей пугать! Я чуть со стула не упал.
Критика справедливая. НО! фонтик идет в комплекте со всеми файлами, вот проверку его наличия организовать не мешает. Отрисовку таблицы можно заменить DWT файлом, но только таким,, имя которого намертво забито в макрос. И проверочку на его наличие.
ОПЯТЬ БАЗА!!! Что за база??? Сколько можно меня этими базами мучать??? База чего??? Текстовых стилей, или вы хотите собрать коллекцию бирочек от всяких разных изделий? Некоторые вот фантики коллекционируют, да все жалуются, что такие конфеты перестали выпускать, а новые уже даже видеть не могут.
Короче. Если и нужна база, то только не изделий и тем более не их параметров. Я это как тот, кто ЕЛ! эти самые устрицы, говорю. Я создал такую базу. Очень много деталей по отдельности храню НО! - увы не пользуюсь. И не потому, что туда влом лезть, просто я беру уже ранее созданный проект и копирую от туда не только какой-то вшивый теплообменник, а всю его обвязку, с кранами, болтами, фланцами, рамами (руки жалко дальше перечислять). ПОНЯЛ? Для одного дома, я даже умудрился целую стену с узлом учета скопировать. А мне упорно предлагают по одной детальке, по тихоньку, не спеша, каждый раз, а... У мня этих проектов скопилось - уйма. Мне даже не жалко их в Интернет выставлять, что я и делаю на DWG.RU, Чертежи-ру, и здесь.
Набирать атрибуты нужного тебе элемента - пока реальность. Но в будущем, я намерен (а предварительное согласие уже есть) возложить на самих производителей этих изделий. Солиды они уже выложили. Могу ссылку дать, и винчестер у тебя лопнет от их количества. Ты себе не представляешь ощущения радиолюбителя, попавшего на склад радиодеталей, где он может взять, что угодно. Или сладкоежки, устроившегося на шеколадную фабрику. Вот сделать макрос, или прогу, которая позволит быстро и легко. какой ни будь девушке сидеть и набивать данные каталога в атрибуты - дело стоящее.

Если речь идет про подчеркивание в названии атрибутов, то это для того, чтобы было только одно слово. Не я это придумал, Автокад так устроен. Не хочет в названии атрибута видеть пробелы. А вот в строке привязки, я с этими пробелами уже намучался. Не видны они нихрена. Особенно в конце. А из за этого, макрос расценивает эти надписи, как принадлежащие к разным группам. Вот я и рекомендую их не допускать. Точки ставьте, крючечки, ТОЛЬКО НЕ ПРОБЕЛЫ.
В строке с данными атрибута тоже желательно не своевольничать. Например атрибут "НАИМЕНОВАНИЕ", что лежит в блоке "U1" в данных содержит название изделия "Болт М-8 L=80" таких болтов на плане не счесть. У этого блока своя точка вставки и все остальное, что в нутри. НО! Вот приходит момент и надо в чертеж вставить целый массив блоков из другого чертежа, а там тоже есть блок "U1" только его кто-то подредактировал (точку вставки например заменил). Вставляем и БАЦ! все болты старые заменились на новые и убёгли в даль не виданную.
Чтобы таких эксцессов не происходило, имена блоков надо при копировании проверять на схожесть и если чё переименовывать. А вот атрибут "НАИМЕНОВАНИЕ" - чтобы наоборот совпадал у всех.

Устал я однако. попозже еще пословоблудю.
Отдохнул.

Отвечаю по пунктам:
1. Установить AutoCAD-2008 (шутю). Вообще-то я пишу макрос к AutoCAD-у на AutoLISP-е может быть в процессе понадобится запускать еще и VBA, пока не уверен. Но, что делать тем, у кого вообще и компьютера нет? Даже не знаю что сморозить. а про путь, так надо как в п.4 я написал сделать.
2. Учть Английский (шутю). Ну с подчеркиванием мы вроде разобрались?
3. Ну почему Esc? Люди обычно на клаву кофе проливают, или особенно часто у нас в офисе, где системники на полу стоят, любят ножкой в кнопку ресет попадать. Я вот попытался проанализировать, во что может вытечь обработка строки формул атрибута "МЕТОД_РАСЧЕТА" и даже немного начал писать и newconfus.gif В общем, где-то, что-то и не помешает, а в целом можно ограничится всплывающей панелью с надписью огромными буквами "НЕ ДЫШИ!"
4. Фонт гостовский, но не это главное, главное, что под него размеры шрифта установлены. В разных клеточках они разные. Особенно ширина. Взять и сделать для всех надписей один стиль - труба получится. А делать несколько, так не проще просто указать на параметр. Адрес я забил не подумавши, торопился. Надо было с начала вызвать командой этот адрес. Есть такая. Сама говорит где лежит указанный файл.
Supermax
Не могу не пожаловаться. Потом сотру. Язык программирования - вещь не такая уж и универсальная, не сравнить с обычным, человеческим языком. Создание функций, одно из основных возможностей языка и к сожалению в некоторых случаях единственная возможность реализовать поставленную задачу. Я понимаю работу, где целая страница текста программы, но когда три слова и будь добр к тексту свой программы добавляй шапочку с каким-то гадом - зла не хватает. Такую функцию по другому может и не создать. Нам что надо всех разработчиков AutoLISP-а поименно с должностями перечислять? Программа болше на хелп смахивает чем на программу. иной раз на одну единственную строку проги приходится 15 строк хелпа.
А эти гады. Книжку написали, в ней и на диске к ней лиспы развернули, у нотариуса зарегистрировали, и теперь что ни напиши - под суд. За нарушение авторских прав.
Supermax
О необходимости запуска Excel повторно. Как показала практика, когда имеешь дело с запуском "со стороны" приложения, то бывает всякое. Даже кад слетает. Если уже открыто приложение, то в нем может быть открыт файл, который пока не сохранен и игры с этим приложением чреваты летальным исходом этому файлу. Потом, у меня два монитора и работа с двумя приложениями очень удобна. К сожалению ни эксель, ни автокад не позволяют выносить на второй монитор свои окна. Но слава богу, эксель можно открывать дважды. а вот с кадом сложнее. приходится устанавливать на машине два разных када, чтобы работать с двумя чертежами на двух мониторах. Из практики скажу сразу. Посчитал я один файл и вывел все в эксель, потом посчитал второй файл и вывел все на другой эксель и сравнил два результата только не на одном мониторе, а на двух - удобно до жути. Я теперь без второго монитора работать просто не могу. А также не могу работать на трехкнопочной мышке. У меня логитех 510 с 8 кнопками.
Supermax
Уважаемый kpblc полазил я по вашему сайту - красиво. Не скажете ли мне, имеется ли у вас опыт извлечения из таблицы Excel не только содержимого текста ячеек (это я и сам могу), а еще и стиль шрифта, цвет заливки, и пр? Очень надо. Я хотел бы как нибудь выделить ячейку, в которой стоит обязательный параметр для проверки наличия данного атрибута в группе. Нельзя же допускать, чтобы в группе атрибутов не было например атрибутов "НАИМЕНОВАНИЕ" или "ЕДИНИЦА_ИЗМ".

Если я не преодолею этот Рубикон, придется либо в текст вставлять знак и его потом искать, либо отказываться от Excel и делать специальную программу для составления этих двух (а то и трех) листов настроек.
Правда есть еще предложение проверять наличие всего комплекта, но что-то это мне не нравится. В принципе, при простых работах, имени, единицы измерения и метода расчета (который создает данные в колонку количества) вполне достаточно. Кому и сколько достаточно, можно спорить до хрипоты. Проще сделать такую возможность. Там где много атрибутов, то есть есть такие атрибуты, которые участвуют в МС-Проджект-е и которые в спецификацию не входят, но нужны обязательно, надо же их где-то отмечать?
Supermax
Все! С цветом, стилем шрифта разобрался.
Если шрифт в таблице будет не черный тобишь 0.0 то этот атрибут будет искаться в наборе, а если черный (что по умолчанию всегда, то только те атрибуты, что выделены в таблице жирной рамкой.
Ну у вас еще не выделены разумеется. Атрибуты в ячейках D10, H10, I10 ищутся обязательно, а все остальные только если буквы в них "покрасили".

Только быстро не читайте, а то ничего не поймете!

А также я могу тип шрифта ставить такой, какой установлен в экселе в данную конкретную ячейку. Но думаю, что гостовский лучше. Хотя для других иностранных нужностей, может так и надо. Каким шрифтом заполнил ячейки в таблице определения очередности, таким шрифтом эти позиции и будут заполнены в спецификации.
Supermax
В нашем полку прибыло.

Макрос, который делает сразу группу атрибутов по трем вариантам ГОСТов

Перед загрузкой, переписать библиотечный файл AcFocusCtrl16.dll в корень AutoCAD-a
Старый с начала сохранить под другим именем, а потом, когда все заработает - убить.


www.dll-files.ru/dll/a_7.html

По умолчанию, в значениях атрибутов вставлены названия атрибутов.
Пустых строк не приемлет. Ставьте прочерк.

Если вы вставляете атрибуты в уже созданный блок, после вставки наберите комманду ATTSYNC (по умолчанию Select), нажмите Enter и укажите на блок, или блоки. Опять нажмите Ener.
Атрибуты будут видны в Properties.
Supermax
Ну, чтобы вы не искали.
kpblc
> Supermax : К сожалению, я не имею качественного опыта работы с Excel'ем через lsp. На dwg.ru Евгений Елпанов показывал код, которым мои пользователи иногда работают, но объяснить логику кода я не могу. Если хотите - могу поискать тему.
Я б не связывался с Excel'eм по причинам, которые я уже озвучил. Тут же есть еще несколько проблем - в частности, запрашиваемые (и, соответственно, сводимые в таблицу) данные могут быть самыми разными; их состав может меняться. В БД подобные дела решаются вводом дополнительных полей в таблицу и организацией запросов. А эта тема уж столько раз решалась теми же Флемингами, что там остается только пользоваться отлаженным кодом и не мучаться smile.gif
И вот еще, хотелось бы высказаться по поводу цветов, шрифтов и проч. Не думаю, что ограничивать эту свободу правильно. Рано или поздно найдется любитель, который такую систему порушит не задумываясь. Если использовать vlax-ldata-* функции, в любой примитив можно засунуть свои данные. Которые потом и прочитать и обработать. У меня так много решено - и пользователю не видно, и от дурных действий предохраняет. Разбил блок? Сам виноват. Поменял цвет / тип / вес линии / слой - ну и ладно, программные данные подобным образом пользователь не затронет. Следовательно, читаться будет как и раньше. И запросы составляться тоже wink.gif
Supermax
Да я уже разобрался с Excel-ем. Намертво! Есть такая замечательная команда как vlax-dump-object позволяющая получить полную распечатку свойств и по запросу, перечня применяемых к объекту методов. Файл Excel - это как матрешка, где в одной вложена другая, а то и несколько. Так же устроены и остальные файлы Оффиса. Все очень легко вскрывается и читается.
А что касается отрицания применения, то сэр, не выскажете ли вы свои предложения, как альтернативу. Только поточнее. Меня интерисует как пользователя, как я смогу менять по своему усмотрению последовательность компановки листа спецификации? А точнее, что и зачем должно следовать и состав, того, что должно быть в спецификации указано.
А как разработчик, я...
тут меня прервали. Так о чем это я. А, ну да, так вот, как разработчик, я очень не хочу заморачиваться решением таких задач, как определение названия шрифта, состав обязательных атрибутов, расположение результатов расчета на листе. Даже отрисовку рамки в составе основного тела проги, упаси бог меня, вставить. Я понимаю, что легче стать в позу и сказать всем:
1. Пограмма только для Русских!
2. Только для инженеров - проектировщиков!
3. Только для инженеров проектировщиков ОВ и ВК!
4. Только для спецификаций по ГОСТ 21.110!
5. Считает программа только те детали, которые вы внесли в базу!
6. Распечатывает только в составе таком-то и порядке таком-то!
N. И еще пару десятков ограничений и циркулярных предписаний.

На сколько все стало бы проще! Но я такую бы прогу не купил и даже даром не взял.
Supermax
Что касается расширенных данных:

Да можно. У атрибутов уже есть строка привязки. Которая доступна прямо в автокаде.
Привязать данные к примитиву (выражаясь научно), можно только написав маленький макрос для этих целей. НО! Кроме проблемы группирования атрибутов в "свободном плавании" я никаких не вижу задач, которые нужно решать с помощью привязки. Может вы поделитесь своими мыслями?
kpblc
Честно говоря, я хотел бы попробовать посмотреть на готовое и собранное решение. Чтобы по нему уже высказываться. Поскольку сейчас понять общую логику приложения я не в силах.
Заодно предложение определиться с терминологией:
"Группирование" для меня это объединение нескольких примитивов (возможно, сложных) в объект "GROUP" (фактически команда _group).
Атрибуты - это примитивы типа ATTDEF (если они лежат не внутри блока) либо ATTRIB (для варианта доступа к ним изнутри блока).
"Привязка" - это режим объектной привязки (системная переменная osmode).
"Строка привязки" - :?:
---
Добавлю. dll-ки менять не могу в силу разных причин. Использую ADT 3.3, ADT 2005 Eng, ADT 2006 Rus, ACAD 2007 Eng, ADT 2007 Rus, сейчас подумывю об установке ACAD2008 (а частично мои пользователи вообще сидят на ACAD 2005 LT). И что мене прикажете делать? Я не знаю что и как там было поменяно в этой dll-ке, что, как мне кажется, вызывает достаточно опасений - достаточно вспомнить русификаторы, менявшие штатные кадовские dll. Задача о показе собственных свойств примитива не так проста, насколько мне известно, и требует достаточно качественного arx.
---
про (vlax-dump-object) я в курсе. Вопрос: а насколько информативным будет сообщение типа:
Код
(vlax-dump-Object svr t)
; _cIni: nil
; Property values:
; Methods supported:
;   GetIniString (2)
;   WriteIniString (3)
При условии, что документации нет? Логически можно попытаться догадаться о последовательности аргументов, но кто гарантирует правильность (за исключением разработчика)? Тут-то еще достаточно просто, всего 2-3 аргумента, достаточно очевидных. Но это разовая ситуация...
---
Теперь насчет "отрицания применения" smile.gif
Мои предложения сводятся фактически к некоторым постулатам, которые я для себя вывел (бОльшая часть подчерпнута из "САПР на базе") и по которым пишу свои приложения:
1. Приложение должно работать всегда и везде. Не выбивая систему в непонятное состояние.
2. По максимуму учитывать варианты нескольких версий.
3. Данные, используемые программно, должны быть скрыты от пользователя по максимуму. Любая привязка к "человеческому фактору" чревата.
Остальные не настолько важны для данной задачи.
Цитата
как разработчик, я очень не хочу заморачиваться решением таких задач, как определение названия шрифта, состав обязательных атрибутов, расположение результатов расчета на листе. Даже отрисовку рамки в составе основного тела проги, упаси бог меня, вставить.

А придется. Особенно учитывая вариант падения веса файла раз этак в 10 после снесения десятка-другого текстовых и размерных стилей. Учитывая вариант задачи типа "в фоновом режиме открыть все файлы из указанного каталога, относящиеся к данному проекту; посчитать общее количество труб, тройников, переходов и болтов для крепежа арматуры; вывести результат в таблицу или многострочный текст" почти всеми этими задачами заниматься все равно придется.
Наверное, я "встал в позу", не буду спорить, но моим клиентам пока хватает того, что они получают.
Цитата
1. Пограмма только для Русских!
Ага, поскольку остальным она ехало-болело.
Цитата
2. Только для инженеров - проектировщиков!
Не-а, не только. Также для СДО, ПТО, фин.отдела...
Цитата
3. Только для инженеров проектировщиков ОВ и ВК!
Опять-таки мимо - АР, АС, ОВ, ВК, ЭО, ТП...
Цитата
4. Только для спецификаций по ГОСТ 21.110!
Понадобится - сделаю все что хотите, только расскажите чего надобно smile.gif
Цитата
5. Считает программа только те детали, которые вы внесли в базу!
Не внесли в базу, а вставили используя написанный софт. Все же разница есть.
Цитата
6. Распечатывает только в составе таком-то и порядке таком-то!
И не подумаю регламентировать. Клиенту надо - значит надо. Делается, тестируется и отдается на откуп.
Цитата
N. И еще пару десятков ограничений и циркулярных предписаний.
Нафиг предписания! Программно соблюдаются настройки, программно же засовываются (невидимо для пользователя) все необходимые данные и т.п. Проще использовать написанный софт, чем работать руками.
Цитата
Привязать данные к примитиву (выражаясь научно), можно только написав маленький макрос для этих целей.

Я б не стал так категорично утверждать. Ниже - 2 функции по записи ldata в примитив и чтению этих данных. Они настолько просты? Не сказал бы. Используются глобальные переменные, несколько библиотечных функций ну и так далее. Зато в любой момент я с любого примитива могу получить программно забитые в него данные. И работа с другими файлами в этом смысле меня не пугает совершенно smile.gif
Код
(defun _kpblc-ent-ldata-add (ent data-list append-data / exist_data res)
     ;|
*    Функция внесения дополнительных данных в примитив либо словарь.
*    Параметры вызова:
*    ent  примитив, в который вносятся данные. Если примитив -
*      пространство модели, то создается глобальный словарь
*      с именем *kpblc-regname* и данные вносятся в него
*    data-list    вносимые данные
*    append-data    t - заменять полностью
*      nil -> только указанные пары (заменить либо добавить)
*    Возвращаемое значение:
*    полный список доп.данных или nil, если невозможно записать.
*    Примеры вызова:
(_kpblc-ent-ldata-add (vlax-ename->vla-object (car (entsel))) '(("block" . "data1")) t)
=============================================================================|;
 (if (or (eq ent *kpblc-model*)
  (and (= (type ent) 'str)
       (= (strcase ent) (strcase *kpblc-regname*))
       );_ end of and
  );_ end of or
   (setq ent *kpblc-regname*)
   (setq ent (_kpblc-conv-ent-to-vla ent))
   );_ end of if

 (if (and (not append-data)
   (setq exist_data (_kpblc-ent-ldata-get ent))
   );_ end of and
   (setq data-list (append data-list exist_data))
   );_ end of if
 (vl-catch-all-apply '(lambda () (vlax-ldata-delete ent *kpblc-appname*)))
 (foreach item    (_kpblc-list-dublicates-remove data-list)
   (if    (not (member (car item) (mapcar 'car res)))
     (setq res (append res (list item)))
     );_ end of if
   );_ end of foreach
 (vlax-ldata-put ent *kpblc-appname* res)
 );_ end of defun

(defun _kpblc-ent-ldata-get (ent)
     ;|
*    Функция возвращает дополнительные данные, записанные в примитив (либо nil,
* если их нет)
*    Параметры вызова:
*    ent    указатель на примитив
*    Примеры вызова:
(_kpblc-ent-ldata-get (vlax-ename->vla-object (car (entsel))))
=============================================================================|;
 (if (or (eq ent *kpblc-model*)
  (and (= (type ent) 'str)
       (= (strcase ent) (strcase *kpblc-regname*))
       );_ end of and
  );_ end of or
   (setq ent *kpblc-regname*)
   (setq ent (_kpblc-conv-ent-to-vla ent))
   );_ end of if
 (if (vlax-ldata-get ent *kpblc-appname*)
   (_kpblc-conv-list-to-lowcase
     (_kpblc-conv-list-to-pointlist
    (vlax-ldata-get ent *kpblc-appname*)
    );_ end of _kpblc-conv-list-to-pointlist
     );_ end of _kpblc-conv-list-to-lowcase
   );_ end of if
 );_ end of defun

P.S. Пробовал приаттачить rar или zip, чего-то не срослось. Разбираться сейчас некогда sad.gif
kpblc
Да, вот еще. Процитирую кусочек темы http://www.autocad.ru/cgi-bin/f1/board.cgi?t=17698zE :
Цитата
[Re:] Alan (2005-07-06 17:43:35)
>potapovich (2005-07-06 15:50:40)
В двух словах.
1.Используем для чертежей Акад 200х. Блоки оборудования имеют код марки, остальная информация в базе.
2.База проектов и оборудования реализована на MS Acces.
3.Позволяется прогой считать с указанного чертежа (через СОМ-сервер) количество и марки блоков или дополнить в итерактивном режиме при работе программы с базой оборудования.
4.Генератор отчета формирует по объекту и заголовкам спецификацию. Можно на принтер или в pdf.
5.Инструкция 16 стр., считая вместе с титулом. Так что можно прочесть.
Если что-то не понятно пишите.
Выслал Вам скриншоты и образец выходного документа.

Добавлено: в качестве камешка в огород баз данных и общей методики их применения: http://cadmaster.ru/articles/35_sogl_rabota.cfm Хотя там и упоминаются решения CS, да и не со всеми высказываниями лично я согласен, но почитать рекомендую. Особенно предпоследнюю часть.
Supermax
Да, согласен, надо с начала о формулировках договорится.

«Группирование» - объединение несколько скажем не примитивов, а объектов в группу по какому-то признаку.
Объединять можно путем сборки объектов в один сложный (команда _group)
Объединять можно путем привязки к каждому составляющему группу объекту расширенных данных в виде строки букв или цифр.
Объединять атрибуты, можно установив общее значение для всех входящих в группу атрибутов в строке Prompt.
Можно группировать путем размещения в отдельном слое
Можно группировать путем объединения в блок
Можно группировать выделением цветом
Можно группировать расположением по оси Z (что к стати я и делаю, строя модель здания).

«Привязка» - сцепление одних данных с другими. Режим объектной привязки имеет отношение к общей терминологии только в плане установки связи данных о координатах расположения с остальными данными объекта.

У царя, например атрибутом его царской власти, является скипетр и держава, а также плащ с горностаем.
В модели Автокада атрибутом может быть что угодно, чего угодно. Можно назначить атрибутом блока текст в котором в начале указано имя и расположение блока.
И т.д.

С показом свойств примитива следующее:
Примитив должен иметься в наличии либо в самом файле AutoCAD-а, либо в зоне досягаемости (должен быть активирован доступ к файлу, где расположен объект).
Если это кадовский примитив, то его надо с начала превратить во vla-объект, чтобы возвращаемое значение было #<VLA-OBJECT ТУТ_КАКАЯ_ТО_ХРЕНЬ И_ТУТ_ТОЖЕ>

(vlax-dump-object (vlax-ename->vla-object (car (entsel "выберите объект"))) T)

Потом углубляемся

(vlax-dump-object (vlax-get-property (vlax-ename->vla-object (car (entsel "выберите объект"))) 'Application) T)

Потом еще глубже

(vlax-dump-object (vlax-get-property (vlax-get-property (vlax-ename->vla-object (car (entsel "выберите объект"))) 'Application) 'ActiveDocument) T)

И т.д.

А это (vlax-dump-Object svr t) ??? наверное переменная?
Ну по поводу Лиспа, погуторим как-нибудь в другой теме. Только свисни в какой.

На счет отрицания применения.
1. Приложение должно работать всегда и везде. Не выбивая систему в непонятное состояние. – За, двумя руками.
2. По максимуму учитывать варианты нескольких версий. – Смутно понимаю о чем речь, но я ведь SUPERMAX , значит за все, что MAX.
3. Данные, используемые программно, должны быть скрыты от пользователя по максимуму. Любая привязка к "человеческому фактору" чревата.
Начну с заду. «Человеческий фактор» чреват там, где есть опасение, что не корректное поведение может серьезно навредить делу. Вот в AutoCad-е данные, которые используются программно, такие как настройки стилей, форматов, сценариев открыты пользователю, как в специальных окнах редактирования, так и в текстовой форме, а именно в файлах, которые можно редактировать с помощью блокнота.
Мало того, вы имеете право общаться с программой программно. А что можно написать в командах? Да такое, что сотрет к черту весь винчестер.

Я лишь использую Excel как такое окно, которое лучше СУБД-ешного файла в плане умственной доступности основной массы проектировщиков, а также лучше простого текстового файла тем, что есть ячейки, разделяющие информацию. Можно конечно сделать свой «маршрутизатор», но тут есть одно маленькое обстоятельство. Я контачу с иностранными фирмами, которые производят некоторое, очень популярное у нас в стране оборудование и прога ДОЛЖНА работать по DIN, а это значит, что текст как всплывающих окон, так и маршрутизация данных при распечатке должен быть легко переводим. Особенно маршрутизатор, поскольку содержимое во многих ячейках 1:1 переписывается в лист спецификации. Для всплывающих окон я сделаю англоязычный вариант (хотя простым блокнотом легко можно все изменить хоть на китайский).

Я очень рад, что мои ироничные ограничения вас все-таки чем-то не устраивают.
Ну ехало-болело допустим многим, шахтерам например, сталеварам, покорителям горных вершин и т.п. а вот для СДО, ПТО, фин.отдела... АР, АС, ОВ, ВК, ЭО, ТП... и.т.п. очень даже болело-ехало. И не только в России, а еще Украине, Белоруссии, США, Израиле, Канаде и странах ЕЭС. Смешно? - Это пока вам от них заказ за очень большие деньги не упал. Строят тут, а отчитываются там. Штампы вот изучать приходится. А заполнять их как приятно, без знания языка, обалдеть! А так, Атрибуты их, бланк их, файл с маршрутизацией «по их усмотрению» - тоже их. Все это делаю не я, а ИХ девушки. А я только ваяю и с нашими проектировщиками воюю.
Все НАШИ проблемы после разрешения ИХ проблем автоматически умирают.
И какие угодно бланки, в каком угодно порядке, каким угодно шрифтом (ну нет у меня в программе установленного шрифта, только импортируемое значение из маршрутизатора).
Не разбирался с вашей функцией, но даже невооруженным взглядом видно, что макрос не большой.
Да, привязать можно, но зачем? И что?
По следующему сообщению:
Ну вляпались ребята в СУБД, очевидно. Их судьба теперь все элементы, всех производителей вносить в эту базу и таскать ее за собой.
Код марки вставить – вставили, а остальные параметры (которых к стати раз, два и обчелся) в БАЗУ поместили. Обалдеть! А формат этой базы их собственный, хоть и на MC Acces выполнен. И теперь их формат надо как ГОСТ или DIN утвердить (всего лишь).
Ну про стандарт оформления документации, особенно про толщину линий и выбор шрифта – сколько проектировщиков, столько и мнений. А предпоследний опус очень особенно вот это:
- Но откуда возьмется и как должна быть размещена информация для работы смежников? Конечно, всю информацию по использованному оборудованию можно хранить прямо в модели в качестве атрибутов. Но тогда при регенерации очередного вида (а ведь нередко модель содержит сотни и даже тысячи различных компонентов) будет работать не человек, а кофейный автомат.
Как красиво описано! Какие сравнения! Какой слог! Особенно про «кофейный автомат» мне понравилось. К стати ты не знаешь о чем это они?
Я расставил оборудование и отдал электрикам. Они клацнули по насосу и увидели его мощность, прицепили к нему провода и потянули, куда им надо. Я чего-то не догоняю наверное? О какой информации идет речь? Сделали отдел САПР и пытаются натянуть штаны через голову, вот что это.
kpblc
Оставлю, наверное, пока за бортом расширенные данные, словарные данные и прочую лабуду - это тема немного отдельного разговора.
А чем отличается в предлагаемой терминологии привязка и объединение? Если и то, и другое выглядит (да, наверное, и реализовывается) одинаково практически?
Цитата
У царя, например атрибутом его царской власти, является скипетр и держава, а также плащ с горностаем.
Означает ли это, что каждый, схвативший скипетр, державу и плащ с горностаем, становится царем? Если да, то я пошел копить деньги на плащ wink.gif
Имя и расположение блока определяется его конкретной вставкой и делать для этого лишние телодвижения, думаю, ни к чему (через entget -> группы 2, 10, 51 и 210; для vla-представления - name, insertionpoint, rotation, normal). Не всегда надо преобразовывать примитив в vla-представление. Если честно, иногда это даже лишнее. DXF Reference пока никто не отменил, насколько мне известно wink.gif
Цитата
А это (vlax-dump-Object svr t) ??? наверное переменная?

svr - Это указатель на СОМ-сервер, созданный из-под акада и с которым я работаю на данный момент. Свое творение, принципиально было важно показать, что методы могут иметь несколько параметров, типы данных которых сразу не скажешь, покумекать надо.
Цитата
«Человеческий фактор» чреват там, где есть опасение, что не корректное поведение может серьезно навредить делу. Вот в AutoCad-е данные, которые используются программно, такие как настройки стилей, форматов, сценариев открыты пользователю, как в специальных окнах редактирования, так и в текстовой форме, а именно в файлах, которые можно редактировать с помощью блокнота.
Мало того, вы имеете право общаться с программой программно. А что можно написать в командах? Да такое, что сотрет к черту весь винчестер.

Я говорю про следующее: например, есть вставка блока (неважно какого). Мне (точнее, лиспу) по барабану, на каком слое, каким цветом и каким типом (или весом) линии он нарисован. Через (_kpblc-ent-ldata-get) я получу, что этот блок содержит в себе, к примеру, следующие данные:
'(("id" . 65) ("tablename" . "usertbl_EO_EquipLightIntRoof") ("spec_name" . "Светильник потолочный") ("conn_ent" . "16F4"))
Что бы пользователь с блоком ни делал (кроме удаления и разбития, конечно), эти данные он не сможет ни удалить, ни поменять. Зато я в любой момент буду знать, что мне для составления спецификации достаточно будет сформировать запрос к БД к таблице usertbl_EO_EquipLightIntRoof примерно такого типа:
Код
select * from usertbl_EO_EquipLightIntRoof where ((([id]=65)));

И получить полные данные об этой единице оборудования. Удалив из них ненужное, можно и таблицу любого состава делать.
Цитата
Я лишь использую Excel как такое окно, которое лучше СУБД-ешного файла в плане умственной доступности основной массы проектировщиков, а также лучше простого текстового файла тем, что есть ячейки, разделяющие информацию

Я в свое время пробовал несложную БДшку нарисовать в Excel'e. Да, все очевидно. Но количество ограничений меня выбило из колеи. А также скорость работы. То, что оно удобно, не всегда означает, что оно правильно. Работа с БД (даже в табличной форме) дает как правило более быстрый и простой в масштабировании решения результат. А написать междумордие (интерфейс) - это задача программиста.
Таскать БД за собой совершенно не обязательно (мало того, вредно). Достаточно положить ее на сервер, прописать права доступа и пользователей. Все, дальнейшая работа выполняется уже по мере надобности. И ничего лишнего.
Supermax
Ни Grundfos, ни DRV, ни Caprari, ни Varimex, ни Ballomax, ни Ballorex, ни Giacomini, ни еще столько же раз по столько, не будут заполнять твою базу!!!! А только у Grundfos-а более 9000 наименований продукции! Да не отсохнет твоя рука, да не вытекут твои глаза!
В чертеже только ОДИН насос, а чтобы вставить в спецификацию его данные надо иметь а) – сервер, б) – базу на нем, в) - наличие в этой базе данного насоса. Grundfos (а я в этом уверен) оформит свои изделия в виде блоков с атрибутами, а все СУБД-шники будут игнорировать эти атрибуты, вставлять еще один свой с номером элемента в базе и записывать в эту базу то, что уже и так есть в блоке! А чтобы чертеж без их базы посчитать было нельзя – сотрут все атрибуты производителя. 9000 раз будут переписывать в базу и 9000 раз чистить каждый блок. Зато вокруг этой базы, сервера и правил пользования этим хозяйством разведут целый штат «специалистов» и будут, как первый отдел оформлять допуск и проверять на проф. пригодность!

Уважаемый kpblc, Excel я как базу не использую. В Excel-е я разместил перечень разделов и последовательность их вывода при подсчете элементов спецификации. Я это называю «маршрутизатором». Данная фигня показывает данным по какому маршруту им двигаться при складывании в спецификацию. Также в Excel-е я разместил в некоторых ячейках цифры, которые регламентируют расположение и форму выводимых данных в данном столбце, чтобы пользователь мог сам регулировать местоположение и ширину данных в столбце.

Атрибут детали, не есть сама деталь! Атрибут власти, не есть сама власть!

Могу дать совет всем сотрудникам и начальникам отделов САПР (систем автоматизированного проектирования). Есть такое понятие как информационная технология. Есть такое понятие как сопровождение информационной технологии. Самое главное занятие сотрудников отдела САПР – это не сидение на базе, а совершенствование информационных технологий и внедрение их в практику работы института. Люди AutoCAD-ом пользоваться не умеют, рамки и штампы в модели строят. В некоторых подразделениях с кульманом никак не расстанутся, а сапровцы выбивают себе сервер с рейдмассивом, штатные должности, оклады и премии. Все это прикрывают аргументом о необходимости имения единой базы данных элементов и поскольку она ОГОГО требуют прав администратора по доступу к ней.

На сайтах производителей будут лежать виртуальные копии производимой ими продукции со всеми атрибутами. По Интернету будут гулять тысячи моделей, которые сами по себе есть исчерпывающая база данных на те элементы, которые в этих моделях есть, а в институтах с мощным серваком, амбициозным руководством отделов автоматизации, эти модели будут отвергаться как вражеские и к применению не допускаться.

Флаг вам в руки господа! Но нам не по пути.
kpblc
Раз не по пути, то тогда всего хорошего.
Guest
>Supermax
Не хотелось бы называть это битвой гигантов.
Не вижу у Supermax"а:
широты мы"шленния в этом вопросе;
знания альтернативных способов;
низкое качество ЛИСП"а и т.д.
Несколько лет назад мы у себя ходили по подобно Вашему пути.
Всё делали на ЛИСПе, спецификации в Автокаде (часть проекта ВК, ОВ, ТХ).
Кстати говоря чертить ЛИСПом не к чему, вставляй ранее сделанный блок,
а заполняй ЛИСПом. Быстрее на порядок и правильнее.
Разговор идёт о 9-ти позиционных спецификациях оборудования.
Спецификации элементов на чертеже (типа окна-двери,
экспликацию помещений..) делаем другим способом.
Чтобы не быть голословным могу прислать прогу выполнения спецификаций оборудования,
о которой упоминалось в посте kpblc"а.
Взгляните, покритикуйте, оцените, сравните...
Alan
Supermax
Выкладываю монтажную схему (в старом варианте блоков, то есть с именами и усе).

8,21 МБ
Supermax
Что вы опять завели шарманку по поводу примитивного лиспика отчерчивания рамки, с критикой низкого качества которого я давно согласился. И сам же написал то, что вы тут только что предложили. Почитайте выше. На счет широты взглядов, это следует понимать так, что ежели я не согласен с позицией централизации свойств объектов, то я значит не широко вижу? А может наоборот уважаемый Guest? Я пытаюсь взглянуть на ситуацию в целом, учитывая не только интересы отдельной прослойки инженеров, а еще не забываю об источнике информации и проблемах этого источника.
Что касается Лиспа - вы не заметили, что я выкладываю макросы на VBA? А пытаюсь написать на Лиспе только потому, пишу макрос к AutoCAD-у, а Лисп его родное чрево. Да, может я буду выпадать из Лиспа в VBA, может буду выпадать еще куда нибудь. Какая разница? Напишу, перепишу, еще раз напишу и т.д.
Со вставкой блока рамки и штампа, еще раз повторюсь согласен на все 100. Я даже его постараюсь сделать динимическим.
Разговор идет не только о 9-ти позиционной спецификации, а еще по ISO 7573:1983 и DIN 6771-2-1987, да и ГОСТ не только 21.110, а и 2.106 со всеми формами.
И макросу будет наплевать, какую рамку чертит внешнее приложение и как чертит тоже. И текст располагаться бутет в том месте, в котором ему пользователь укажет. И не надо мне говорить, что кто-то не понимает что *.xls файл формируется пользователем (а то и совсем не пользователем, а тем кто написал отрисовку штампа) только один раз.
Если вы думаете, что я не знаю что такое экспликация оконных и дверных проемов, то глубоко заблуждаетесь. И даже сделав экспликацию оконных и дверных проемов, вы обязаны все позиции этой экспликации отразить в спецификации. А вот вы спецификацию смешали с экспликацией помещений!
kpblc-а я уважаю и даже понимаю его проблемы, но вы не поняли самого главного (или поняли, но делаете вид, что не поняли), здесь идет битва не гигантов (о чем речь и не шла) а о подходе к правилам отрисовки элементов чертежей. Одни (то есть я в гордом одиночестве) говорят, что блок должен быть с полным комплектом атрибутов, А другие (то есть kpblc) хотят, чтобы блок содержал только позицию в базе. Я противник такого разделения информации а вы?

p.s. Макрос отчерчивания рамки со штампом может и примитивный, и даже кривой и одноглазый, только что-то я не вижу нигде похожего макроса. Может ссылочку дадите, а еще лучше напишите то, что достойно с вашей точки зрения и сюда положите. Я в Макрос3.xls на него ссылочку дам. А если людям не понравится ваша версия, они свою сварганят и ссылочку подправят.
Supermax
Есть реальная проблема.
Как переставлять в списке атрибутов, отображаемых в свойствах блока, эти самые атрибуты местами?
Они отображаются в обратном порядке от того, что был при их создании. То есть, последний созданный атрибут находится в первой строке свойств. Редактирование дает только видимость, вроде бы переставляет, но после двух, трех вхождений в свойства, некоторые атрибуты перемещаются сами по себе. А если блок создать заново, то даже отредактированные атрибуты все равно выстраиваются в той последовательности, в которой они были созданы в самом начале. Даже не они, а те, с которых они скопированы. Время создания тут ни причем, порядок определяется расположением атрибутов в базе рисунка.

КАК ИХ В ЭТОЙ БАЗЕ МЕНЯТЬ МЕСТАМИ???
Guest
Все очень просто: порядок отображения атрибутов (как правило) определяется последовательностью их создания, и ничем иным. Перестраивать блоки надо.
Supermax
Мой великий помощник Сергеев Дмитрий в данный момент пишет макрос на VBA, который по существующей группе атрибутов создает ее точную копию, только путем не копирования а создания новых атрибутов с начинкой старых в порядке по которому расположены старые атрибуты по оси Y. То есть если надо вставить атрибут в список, раздвигаете атрибуты, вставляете новый, нажимаете на кнопку, обводите старую группу и получаете новую. А старую грохаете.
Как напишет - выложу.

А пока король сезона - насос Grundfos Какой-то там с полным комплектом атрибутов!

Не, не все, забыл вставить ссылку на страничку в сайте производителя и ссылку на поставщика.
Вот макрос сделаем и испытаем.

Дружные аплодисменты!!!
Supermax
Кто сказал, что динамические блоки могут быть только 2D?
Вот вам пример 3D динамических блоков.
Трубы ППУ от 57 до 159 диаметров.
Кто в 3D строит теплотрассы - пригодятся.

Файл 84 КБ.
Supermax
Причем заметьте господа, что если у динамического блока изменлся параметр, то и имя изменилось, а если параметр стал опять прежний, то и имя тоже станет прежним.
Например:
Изначально был динамический блок с установленной начальной длинной 1000мм. и именем Труба_ППУ_76. Изменили длинну до 11000мм. Имя стало к примеру +U430. Скопировали трубу и изменили длинну новой трубы на 5000мм. Имя тоже изменилось и стало +U450, опять к примеру.
Опять скопировали трубу (что 5 метров длинною) и установили длинну нового участка 11000мм. Имя этой трубы стало такоеже как и у первой трубы длинною 11000мм. +U430!
Таким образом, посчитав все блоки с одинаковым именем и прочтя длинну любого из них, получаем труба такая-то длинной такой-то столько-то.
kpblc
Цитата(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 версии тоже. А там дин.блоков нет.
Supermax
О! А я уже тебя оплакал. Думал, вот, был у меня единственный собеседник, обиделся почему-то на меня и ушел «своей дорогой».
Слава богу, ты не покидаешь меня в абсолютном моем одиночестве. Тут ведь одни приведения шастают. Качают, иногда улюлюкают и исчезают. А я один тут сижу и все сам делаю.
Вот и сейчас предлагаю вниманию публики блок уже представленного выше насоса, только с динамическими атрибутами. А также анализ поведения такого блока.
Все, у кого AutoCAD 2005, 2004 и ниже – сушите весла.

Да, можно создать жесткий аналог производимой продукции. Вот стоят прокладки BUBE на таком насосе, значит и насос с такими прокладками, а также жестко заданными параметрами двигателя, материала корпуса, материала крыльчатки, типа присоединения и пр. переменными параметрами – один. Сколько сочетаний, столько и блоков насосов.
Но есть и другой способ – это установка в блоке динамических атрибутов.
Кстати, у динамических атрибутов, в свойствах блока кроме падающих меню с выбором параметра есть еще одно очень полезное свойство – «только для чтения».
Установленные производителем данные должны быть защищены от случайного изменения. Нет, изменить их можно, но это надо залезть в блок, затем залезть в таблицу установок, а это уже случайностью не назовешь.
Блок, снабженный динамическими атрибутами, которые не меняют геометрию объекта, также как и блок, где геометрия меняется, при изменении параметра любого из свойств доступных к выбору меняет значение точечной пары с DXF кодом (2 . *). НО! Если блок один, то есть, нет в чертеже другого, такого же - имя не меняется. При внесении изменений в обычные атрибуты имя также не меняется.
Таким образом, можно смело нумеровать позиции через простые атрибуты и на подсчет блоков это не повлияет, а если у вас есть параметр, который должен быть учтен при подсчете – оформляйте его динамическими атрибутами.

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

ВНИМАНИЕ! При создании блока, после завершения процесса упаковки его атрибутами и сохранения файла, блок в рисунке – убить! Если блок необходим, то его надо только вставлять через функцию Insert. Это относится только к первому (исходному блоку), поскольку при его создании, вставляя новые атрибуты, постоянно происходит смена имени блока в Модели, а параллельно в базе чертежа тоже происходит изменение конфигурации блока, но без изменения имени. При вставке в пространство Модели блока из базы получаются два абсолютно одинаковых блока, но только с разными именами.

P.S. Мне теперь столько переделывать!
kpblc
Я не хочу говорить, почему твой подход я не могу назвать полностью правильным и неоспоримым - тема свалится во флуд.
Свой пост я проверял на конкретном файле и на конкретном блоке, среда проверки - 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

Но! Это для конкретной вставки. Как получить то же самое из описания блока, я не разбирался. А тебе, я так чуйвствую, придется smile.gif
Supermax
От подхода у меня пока только рожки да ножки, так что оценивать еще нечего.
Я пока уточняю среду для анализа. Некоторые макросы еще не весь замысел. По последнему облому (в смысле динамических атрибутов), так вообще кое что рухнуло.
Ты мне тут про свой пост все толкуешь, и о проверке всего и вся, так не затруднит еще раз свою позицию осветить, а то я тоже тебя с трудом понимаю.
Теперь с именами.
Свойство 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/
kpblc
Суть моей позиции достаточно просто (кстати, 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
Твой перл в моей интерпритации.

(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
kpblc
Цитата(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 такого лично я не наблюдал.
kpblc
Предыдущий ответ - мой. У меня авторизация что-то не сработала. На всякий случай повторю:
> 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
Прога ушла в копилку. Спасибо. Следующая задача, с которой я уже справился, это маркировка в атрибутах изделия.
Ты заешь, что во многих изделиях есть такая кака, как маркировка, которая состоит из набора символов, каждый из которых есть переменная величина с количеством от двух, до целой кучи значений. Количество вариантов маркировки равно количеству переменных перемноженных на количество других переменных и результат на количество третьих переменных, и результат ….. Ну ты понял.
Двери, окна, насосы Grundfos, трубы ППУ и многое другое. В атрибутах изделия есть и сама маркировка, и расшифровка отдельных ее переменных.
При изменении некоторых параметров меняется не только геометрическая форма, но и появляются дополнительные атрибуты изделия, как статические (только для чтения, динамические и динамические с возможностью изменения геометрии блока). В общем раскрываются такие возможности…! НО! Без проги, помогающей заполнять дин. Атрибуты – очень и очень гиморно создавать такую крутизну.
Если хочешь, расскажу как это получается.

Вот маленький пример, как это сделать в динамическом блоке.
файл 1.8 МБ.
Supermax
К стати о птичках:
Я в этом файле накопировал штук 50 блоков, а размер файла при этом сократился до 1.74 МБ. ХА, ХА, ХА!

Сейчас решаю вопрос, куда вставлять длинну?

Вот есть труба ППУ. Она заказывается в штуках. То есть, Труба такая-то, длинной такой-то, штук столько-то.
Сделана труба дин. блоком. И название есть и маркировка, только длинна - динамический параметр, да еще и очень большого количества вариантов. До 5500 возможных длин с шагом 5 мм.
Вставлять длинну в "Примечание"? или в следующую строку после "Наименование"?
Как выделить этот параметр описания свойств изделия из остального списка и указать, куда он должен быть вставлен?
Просится под "Наименование", поскольку логично звучит "Труба такая-то, L= столько-то".
Наверное в маршрутизаторе надо к ячейке "Наименование" приклеить перечень наименований атрибутов, имя и значение которых надо "склеивать" со значением атрибута "Наименование"?

Как думаешь?

Вот, слегка отредактировал.
kpblc
Специально запустил 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

И разбирай дальше список. Предупреждаю сразу - код качественно протестировать не могу (попросту мало времени). Так что это на твоей совести.
С назначением динамических свойств я не воевал. Сильно подозреваю, что это надо работать со словарями. Время надо, которого почти нет sad.gif
---
Добавлено: немного отредактировал код - одну функцию забыл в локальные засунуть.
kpblc
И все же насчет заполнения динамических свойств я бы крепко подумал. Смотри: допустим, администратор системы (обзовем его так, а на самом деле это просто человек, который выполняет работы общего характера) каким-то манером добавил, удалили заполнил или отредактировал - в общем, изменил характеристики. Теперь все пользователи этой системы должны получить актуальные версии этого блока. А если в файле такой дин.блок уже вставлен? Тогда AutoCAD при вставке (насколько я понял) будет брать имеющееся описание, не опрашивая "библиотечный" элемент. То есть отслеживать такие ситуации надо программисту.
Какие в связи с этим проблемы лично я вижу:
1. Надо переименовать имеющиеся динамические блоки либо каким-то иным способом "забрать" с них всю информацию - точка вставки, нормаль, масштабы по осям, слой, пространство вставки и так далее. При этом надо не забыть про возможные внешние ссылки, внутри которых тоже может быть этот дин.блок. Также обработать блоки (никто не помешает дин.блок поместить внутрь другого блока).
2. Разблокировать и разморозить слои
3. Удалить все вхождения этого блока.
4. Удалить описание этого блока.
5. Импортировать по новой блок
6. Вставить новую версию блока в соответствии с параметрами, полученными в п.1.
7. Вернуть состояние слоев.
При всем при этом надо в случае ошибки в любом месте вернуть файл обратно.
И теперь самый главный вопрос: а когда это делать? В момент открытия файла? Если "да", то простое выполнение такого лиспа затормозит открытие файла раза в 2-3, не меньше.
Соответственно надо получить полное описание "текущей версии" блока в текущем файле и сравнить ее с версией в библиотеке. И только после этого уже идти в п.1 и дальше.
Просто открыть файл библиотеки тебе не удастся - лисп прекратит свое выполнение в момент активации другого файла. То есть надо устанавливать SDI в 0, потом через ObjectDBX-интерфейс (который еще тоже прописать надо) получать доступ к библиотечному файлу, брать с него описание блока, и сравнивать с имеющимся описанием дин.блока. Потом не забыть закрыть фай библиотеки.
Причем делать это надо независимо от того, где лежит библиотека - локально или на серваке. Головняк, одним словом.
---
P.S. Естественно, всю дорогу ИМХО.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.