(изменено: teem0n, 22 сентября 2011г. 18:01:37)

Тема: Создание ведомостей материалов

Здравствуйте!

Нужно создать программу для автоматического заполнения ведомостей использованных материалов (конструктивные элементы моста, если конкретнее).
Хотелось бы услышать комментарии, критику, советы. Может, кто-то делал что-то подобное и поделится опытом/кодом.

Пишу на С++ (соответственно, смотрю в сторону ObjectARX), но если есть аргументы в пользу других инструментов (исходя из постановки задачи) - буду рад выслушать.

На основе того, с чем экспериментировал, родился следующий концепт.
1.Есть база параметрических блоков, из которой пользователь копипастом/с помощью древовидного списка (в идеале) выбирает нужный блок и вставляет его на чертеж. При первой вставке блока спрашивается список типов и количества использованных материалов (список возможных берется из файла, например). Кстати, есть ли возможность в блоке задать произвольное количество атрибутов/таблицу атрибутов?
2.После этого создается табличка, где ведется учет материалов. Соответственно, при копировании блока с заполненными атрибутами к тем значениям добавляются указанные в блоке, а при добавлении на чертеж нового - возможно, добавляются строки в таблице.
3.По специальной команде таблица экспортируется в Word и все несказанно счастливы :) Правда, эта команда, видимо, должна запускаться извне, ибо нужно будет пробегать по все использованным чертежам, но это тонкости.

Опять же, можно плюнуть на динамический расчет таблицы, и по команде пробегать по вставленным блокам, обрабатывать их параметры и обновлять таблицу (или создавать, если нету). Может, так лучше?

Также буду признателен за функции на ARX, применимые к задаче, например:

---выбор блоков в пространстве модели по имени/выбор таблицы по названию
---доступ к параметрам блока

Как-то так. Буду чрезвычайно признателен за помощь!

(изменено: Вильдар, 22 сентября 2011г. 18:59:03)

Re: Создание ведомостей материалов

Концепт реалистичен.
Для какой версии акада пишете?

1. Одна из проблем может быть такая, что невозможно будет разместить на чертеже все блоки, которые необходимы. Это при условии, что у вас плоский чертеж, а не 3d модель. Т.е. бывает, что на основной схеме не отображаютя некоторые элементы, а показываются на сечениях например. Я из гражданско-строительной области. Крупные элементы легко обсчитать с помощью блоков. А вот мелочевку, типа различных профилей, фасонок и прочее, практически невозможно.
Можете посмотреть, как сделан подсчет спецификаций в SPDS GraphiCS. Там используются custom objects, и динамическое заполнение таблиц (тоже custom object). Но опять же, фигня в том, что на плоской схеме бывает невозможно показать все используемые элементы.

1а. Немного не понял, что имеется ввиду под параметрическими блоками? Это та которая в новых акадах появилась (с 2010 кажется). Или имеются ввиду динамические блоки.

1б. Атрибуты в блоках могут быть. Которые пользователь будет видеть в свойствах блока и может менять их значения.

1в. База блоков. Это может быть файлы dwg, рассортированые по папкам, а пользователь через пульт управления вставлять нужный блок из нужного файла. Это самый простой способ. Немного сложнее сделать палитры инструментов. Еще сложнее реализовать свое решение.

2. Динамически заполнять таблицу или по команде, думаю не суть важно. Проще конечно по команде.

3. Пробежаться по чертежам можно и через ARX/NET, и в word записать.

teem0n пишет:

---выбор блоков в пространстве модели по имени/выбор таблицы по названию
---доступ к параметрам блока

Кодом на С++ точно не помогу. Но уверен, что такие вопросы уже решались.

(изменено: teem0n, 23 сентября 2011г. 10:54:28)

Re: Создание ведомостей материалов

Custom object не нравится тем, что им можно полноценно пользоваться только из/с помощью создавшего приложения, как я понимаю.

По поводу блоков - не силен в терминах, к сожалению, работал с AutoCAD 2010 и 2011 - там уже все было :) Такие, которые с параметрами и связями. Если объясните разницу - было бы классно!

Кстати, можно в блоках делать невидимую таблицу и хранить в ней что-то?

1в. А почему сложно? Если средствами С++/MFC пробежаться по файлам, посмотреть блоки и построить список - вроде всего пара функций...

2. Да, я тоже подумал, что лучше так.

У нас основные объекты - мосты, там вроде почти все можно с помощью блоков решить.

(изменено: pan, 23 сентября 2011г. 11:06:05)

Re: Создание ведомостей материалов

C# лучше.

teem0n пишет:

Кстати, есть ли возможность в блоке задать произвольное количество атрибутов/таблицу атрибутов?

При создании динамического блока в редакторе блоков (bedit) можно добавить таблицу блоков (btable).

teem0n пишет:

3.По специальной команде таблица экспортируется в Word...

Лучше в Excel, причем можно создать двустороннюю связь с таблицей AutoCAD.

Re: Создание ведомостей материалов

pan пишет:

C# лучше.

Я его почти не знаю (пару примеров прочитал, осознал), С++ роднее. Да и я на нем уже разобрался, как возиться с Office и .xml (тоже нужен :( ).

При создании динамического блока в  редакторе блоков  (bedit) можно добавить  таблицу блоков  (btable).

А невидимой ее можно сделать?

Лучше в Excel, причем можно создать двустороннюю связь с таблицей AutoCAD.

А зачем?
Если все равно будет пересчитывать программа - то уж лучше сразу в Word и пихать, разве нет?
А то потом еще из Excel данные выдергивать...

Re: Создание ведомостей материалов

teem0n пишет:

А невидимой ее можно сделать?

Таблица блоков (btable) на чертеже отображается в виде треугольной ручки при выделении объекта.
Кроме этого атрибуты могут быть скрытыми.

Re: Создание ведомостей материалов

pan пишет:

Таблица блоков  (btable) на чертеже отображается в виде треугольной ручки при выделении объекта.

Кроме этого атрибуты могут быть скрытыми.

Не, это таблица блоков :)
А если нужна таблица строк? Т е нужно хранить пары параметров вида "строка-строка". Их может быть  произвольное число, но меньше 10, я думаю. 20 параметров заводить - как-то очень глупо :(

Re: Создание ведомостей материалов

teem0n пишет:

По поводу блоков - не силен в терминах, к сожалению, работал с AutoCAD 2010 и 2011 - там уже все былоТакие, которые с параметрами и связями. Если объясните разницу - было бы классно!

Я не силен в параметрике. Сижу на 2008 акаде.
Динамические блоки появились с 2007 года. Параметрика с 2010. Можно ли делать параметрику в блоках не знаю. Пробовать не хочется что-то. Т.к. сижу на 2008.

teem0n пишет:

1в. А почему сложно? Если средствами С++/MFC пробежаться по файлам, посмотреть блоки и построить список - вроде всего пара функций...

Ну Центр Управления (команда _adcentre) это уже готовый встроенный инструмент в автокаде. Я просто предложил. А там, вам решать. Можно сделать свой, целенаправленный. ЦУ все-таки очень общий инструмент.

teem0n пишет:

А если нужна таблица строк? Т е нужно хранить пары параметров вида "строка-строка". Их может быть произвольное число, но меньше 10, я думаю. 20 параметров заводить - как-то очень глупо

Почитайте про Xrecord. Мне кажется это лучше.

Re: Создание ведомостей материалов

Почитайте про Xrecord. Мне кажется это лучше.

Интересная штука. Но ее можно добавить/прочитать только программно, как я понял?

В общем, пойдет на первое время :)

По поводу кода вопрос все еще открыт!  :oops:

Re: Создание ведомостей материалов

Попробовал параметрику в блоках. Да, можно использовать динамику и параметрику совместно. Это крутяк. Но, сижу на 2008  :cry:

Re: Создание ведомостей материалов

Вильдар пишет:

Попробовал параметрику в блоках. Да, можно использовать динамику и параметрику совместно. Это крутяк. Но, сижу на 2008

:) Прогресс шагает по планете!:)

А в принципе, можно сделать какой-то элемент блока невидимым? Я не нашел :(

(изменено: Вильдар, 23 сентября 2011г. 12:29:45)

Re: Создание ведомостей материалов

teem0n пишет:

Но ее можно добавить/прочитать только программно, как я понял?

Да.
Во всяком случае штатной команды для их редактирования нет.

А еще может быть подойдет Xdata, для хранения данных в примитиве.

Re: Создание ведомостей материалов

teem0n пишет:

А в принципе, можно сделать какой-то элемент блока невидимым? Я не нашел

Можно. У любого геометрического примитива есть свойство Visible.
Но нафига это делать. Это неправильно, имхо.
Эта штука используется в команде _IsolateObjects, _UnIsolateObjects, _HideObjects. Смотрбю 2011 акад. Тут  она по делу используется.
А скрывать от пользователя объекты, и хранить в них данные, это изврат. Для этого есть Xrecord.

Re: Создание ведомостей материалов

teem0n пишет:

По поводу кода вопрос все еще открыт!

Принято создавать новую тему по каждому вопросу. В этой обсуждайте стратегию. А отдельные вопросы в отдельной теме. Опять же, если этот вопрос еще не обсуждался.
А с кодом всегда поможет мастер Александр Ривилис :D

Re: Создание ведомостей материалов

teem0n пишет:

А если нужна таблица строк? Т е нужно хранить пары параметров вида "строка-строка". Их может быть произвольное число, но меньше 10, я думаю. 20 параметров заводить - как-то очень глупо

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

(изменено: teem0n, 23 сентября 2011г. 13:14:02)

Re: Создание ведомостей материалов

В Редакторе блоков создаешь скрытые атрибуты (тип - строка), затем таблицу блоков (она так называется), добавляешь туда эти атрибуты попарно, заполняешь таблицу, сохраняешь блок.

Теперь при изменении одного атрибута, будет меняться другой. Значение берется из таблицы блоков.

См. также Мои динамические блоки

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

Блок - Балка ХХХ-ХХХ, параметры - "Арматура 8мм - ХХ тонн, Арматура 10мм - УУ тонн".

Как-то так. Напишите чуть поподробнее, может я не понимаю, как прикрутить это к моей задаче, в AutoCAD новичок еще :oops:  :cry:

А за что баллы начисляются? Кто-то плюсик ставит?

(изменено: pan, 23 сентября 2011г. 14:18:23)

Re: Создание ведомостей материалов

А, ну тогда таблицу не надо, просто скрытые атрибуты.
Например:
Имя атрибута "Арматура_1", значение "Арматура 8 мм"
Имя атрибута "Арматура_1_масса", значение "20 тонн"
Имя атрибута "Арматура_2", значение "Арматура 10 мм"
Имя атрибута "Арматура_2_масса", значение "30 тонн"

....................................................
или лучше:
Имя атрибута "Диаметр_1", подсказка "Диаметр арматуры 1, мм" значение "8"
Имя атрибута "Масса_1", подсказка "Масса арматуры 1, т" значение "20"
Имя атрибута "Диаметр_2", подсказка "Диаметр арматуры 2, мм" значение "10"
Имя атрибута "Масса_2", подсказка "Масса арматуры 2, т" значение "30"

....................................................

Перед вставкой блока ATTDIA=1, получишь стандартное диалоговое окно.
Можно даже ничего на Си не писать  :)  - атрибуты легко извлекаются (dataextraction) в xls, csv, mdb, txt.
Или attout - в текстовый файл.

Re: Создание ведомостей материалов

Перед вставкой блока ATTDIA=1, получишь стандартное диалоговое окно.

А как это сделать? Не умею...

Re: Создание ведомостей материалов

teem0n пишет:

А как это сделать? Не умею...

Сочувствую. Чтобы программировать под AutoCAD нужно его (т.е. AutoCAD) знать.
ATTDIA - системная переменная AutoCAD. В ObjectARX для получения изменения значений системных переменных используются функции acedGetVar()/acedSetVar()

Re: Создание ведомостей материалов

Сочувствую. Чтобы программировать под AutoCAD нужно его (т.е. AutoCAD) знать.

ATTDIA - системная переменная AutoCAD. В ObjectARX для получения изменения значений системных переменных используются функции acedGetVar()/acedSetVar()

Я не волшебник, только учусь. (с)

Спасибо, что подсказали!