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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Попытался сделать автоматическое составление спецификации по

Попытался сделать автоматическое составление спецификации по

Ответ
Поиск в этой теме
Непрочитано 16.05.2007, 09:18 #1
Попытался сделать автоматическое составление спецификации по
mmmx
 
Москва
Регистрация: 06.07.2006
Сообщений: 42

Попытался сделать автоматическое составление спецификации по чертежу.

В общем, ничего сложного она из себя не представляет: если у блока есть описание
(а также у блоков, вложенных в него), то программа их показывает для выбранных блоков,
позволяет отредактировать, скопировать.

Проблема для меня только в том, где держать это описание блока.
Я решил этот вопрос с помощью пояснения к блоку (Block.Comments), и на основе этого и сделал программку....

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


Не поможете, как приаттачить текстовые данные к блоку? (с помощью словарей, что ли... Не очень хорошо в этом разбираюсь)

Или может, можно как-то отключить уничтожение комментария блока при его вставке в другой чертеж?


Был бы очень благодарен!
Программка получилась вполне нужная, да вот из-за того, что недоглядел вовремя, бестолковая...
Просмотров: 16500
 
Непрочитано 16.05.2007, 09:23
#2
shnn

Инженер
 
Регистрация: 18.02.2005
Самара
Сообщений: 747


Я думаю Вы ищете атрибуты блока. Создаются командой attdef.
shnn вне форума  
 
Автор темы   Непрочитано 16.05.2007, 09:32
#3
mmmx


 
Регистрация: 06.07.2006
Москва
Сообщений: 42


Я поясню:
Необходимое мне описание должно иметь как минимум, два поля:
"Обозначение" и "Количество". Еще желательно "Наименование".
Количество строк - переменное для каждого блока, смотря сколько позиций он в себя включает.

Например:

Код:
[Выделить все]
"Обозн." "Наим." "Кол."
76786 Шкаф 1шт
34234 Дверь 1шт
98787 Петли 2шт
87687 Полка 3шт
Аттрибуты... То есть создать нужное количество аттрибутов, содержащих, к примеру, по одной строке? А потом поиском их все собрать?... Боюсь, это просто неудобно, да и строки реально длиннее, мне кажется, они не влезут в допустимый размер текста аттрибута...
mmmx вне форума  
 
Непрочитано 16.05.2007, 09:41
#4
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


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

Подсчет "количества" - дело самое простое. Примеры этого всегда входили в Автокад - планчик офиса с компьютерами.

Сложности в ведении базы оборудования и изделий. Основные трудозатраты получаются не в подсчетах, а в формировании документов, написании точных и длинных "формулировок".
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 16.05.2007, 09:49
#5
mmmx


 
Регистрация: 06.07.2006
Москва
Сообщений: 42


ShaggyDoc, я с вами полностью согласен.
Вилы хотя бы в том, что блок можно разбить!... (Не то, что можно, а даже временами нужно, и это будет происходить с частичной потерей информации). На данный момент я иду на компромисс '"кривость" реализации' / 'легкость реализации', если своими словами.

Количество блоков мне считать не нужно. Мне нужно считывать приаттаченную к ним информацию. В технологии присваивания и хранения этой информации у меня и вопрос. [/quote]
mmmx вне форума  
 
Непрочитано 16.05.2007, 10:05
#6
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


А приаттачивать надо не посредством атрибутов, а в виде расширенных данных, которые можно присоединить к любому примитиву. Причем, в расширенных данных не само описание изделия, а только ссылка на его характеристики (лучше в БД, хотя это могут быть и любые файлы).

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

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

Код:
[Выделить все]
(ru-xdata-write-for-ent ename xdata_list app_name)
(ru-xdata-read-for-ent  ename app_name)
(ru-xdata-rem-for-selection selection app_name is_show_msg)
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 16.05.2007, 10:24
#7
mmmx


 
Регистрация: 06.07.2006
Москва
Сообщений: 42


Да, это отличная идея!
Вообще у меня есть мысль в БД хранить описание блока (типа dxf), чтобы отрисовывать его по факту вставки... Но не уверен, что это правильно.

Просто у меня некоторые сложности с этими расширенными данными...
mmmx вне форума  
 
Непрочитано 16.05.2007, 10:42
#8
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Полность согласен с ShaggyDoc. Похожий вариант разрабатывали здесь http://www.autocad.ru/cgi-bin/f1/boa...31596eW&page=1 Почитай, думаю найдешь много для себя полезного. Там данные хранятся в словарях. Сами ф-ции опубликованы, начиная с поста
VVA (2007-01-25 12:24:59) и называются
DictAddToEnameByName
DictGetFromEnameByName
DictRemoveFromEnameByName

Правда значения словарей - текст. Но можно их заменить ф-циями
vlax-ldata-* либо Набор функций для хранения данных в словарях Петра Лоскутова
На работе я обычно примитивы помечаю расширенными данными, чтобы можно было быстро отфильтровать через ssget [типа (ssget "X" ’((0 . "CIRCLE") (-3 ("APP1")("APP2"))))]
Ф-ции добавления Расширенных Данных можешь посмотреть здесь
http://www.autocad.ru/cgi-bin/f1/board.cgi?t=34219yU
_add_txt_dictxd
_get_txt_dictxd
_del_txt_dictxd
VVA вне форума  
 
Непрочитано 16.05.2007, 10:58
#9
VetalBY


 
Регистрация: 16.05.2005
г. Минск
Сообщений: 276


Если данные хранить в словарях, то они не смогут попасть в текущий чертеж при вставке блока из другого чертежа. Хранить надо либо в расширенных данных, либо в невидимых атрибутах. В атрибутах хорошо тем, что по желанию их можно отобразить и визуально осмотреть план на предмет ошибок (опечаток).
VetalBY вне форума  
 
Автор темы   Непрочитано 16.05.2007, 11:00
#10
mmmx


 
Регистрация: 06.07.2006
Москва
Сообщений: 42


Спасибо за информацию! К сожалению, на лиспе мне делать что-то тяжело. Но я учту все вышесказанное!

Попробую аттачить данные таким способом: http://www.autocad.ru/cgi-bin/f1/board.cgi?t=28538Na

А по-хорошему, потом попытаюсь сделать, как советовал ShaggyDoc.
mmmx вне форума  
 
Непрочитано 16.05.2007, 11:50
#11
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


>VetalBY Если хранителем словаря выступает объект, а не (NAMEDOBJDICT), то данные хранятся в описании объекта следуют всюду за ним .
Сохрани данные в словаре объекта
Код:
[Выделить все]
(vlax-ldata-put (vlax-ename->vla-object(car(entsel "\nВыберите объект"))) "TEST" (getstring t "\nВветите текстовый текст:"))
Скопируй объект в другой чертеж и проверь

Код:
[Выделить все]
(princ (strcat "\nВы ввели текст: " (vlax-ldata-get (vlax-ename->vla-object(car(entsel "\nВыберите объект"))) "TEST")))
VVA вне форума  
 
Непрочитано 16.05.2007, 13:18
#12
VetalBY


 
Регистрация: 16.05.2005
г. Минск
Сообщений: 276


м-да, работает, это я по незнанию ляпнул , пардон
надо будет разобраться...
VetalBY вне форума  
 
Автор темы   Непрочитано 16.05.2007, 13:42
#13
mmmx


 
Регистрация: 06.07.2006
Москва
Сообщений: 42


Ничего не работает...
Попробовал метод SetXData / GetXData - данные не переносятся при вставке блока с этими данными!

Похоже, выход - только отдельная внешняя БД?
mmmx вне форума  
 
Непрочитано 16.05.2007, 14:00
#14
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от mmmx
Ничего не работает...
Попробовал метод SetXData / GetXData - данные не переносятся при вставке блока с этими данными!

Похоже, выход - только отдельная внешняя БД?
VVA показал пример с ldata. Разные вещи.

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

На какие-только ухищрения не идут ради кажущейся простоты работы с блоками. Где-то в Download лежит проект вентиляции в 3D - сделан очень неплохо. Но автор каждый элемент воздуховода превращал в блок, да еще с именем, которое соответствовало полному наименованию элемента. "Сизифов труд" - ради того, чтобы потом сосчитать штуки.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 16.05.2007, 14:39
#15
mmmx


 
Регистрация: 06.07.2006
Москва
Сообщений: 42


Вопрос в другом: где мне хранить данные, по которым я должен искать информацию в БД, если они не держатся ни в комментах блока, ни в расширенных данных (XData)? Только привязка к имени блока остается?
mmmx вне форума  
 
Непрочитано 16.05.2007, 14:50
#16
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от mmmx
Вопрос в другом: где мне хранить данные, по которым я должен искать информацию в БД, если они не держатся ни в комментах блока, ни в расширенных данных (XData)? Только привязка к имени блока остается?
У всех держатся, а у тебя не держатся? VVA привел краткий и понятный пример. Вместо "текстового текста" - текст ссылки по собственному разумению.

Давать советы по VBA противоречит уставу моей конфессии.
ShaggyDoc вне форума  
 
Непрочитано 16.05.2007, 15:00
#17
lee


 
Регистрация: 28.02.2004
43
Сообщений: 1,796
<phrase 1=


ADT - Property Set Definitions - Shedule Tables

читаю тему и все более убеждаюсь, что на голый автокад не перейду никогда
lee вне форума  
 
Непрочитано 16.05.2007, 15:05
#18
VetalBY


 
Регистрация: 16.05.2005
г. Минск
Сообщений: 276


Конечно держаться не будут, так как ты цепляешь данные к ссылке на блок (BlockReference), а не к описанию блока (BlockTableRecord). Понятно, что цеплять к описанию блока нет никакого смысла. Так вот при вставке из ДЦ, ДЦ берет только описание блока, но никак ни его ссылку - в твоем случае из ДЦ брать не имеет смысла. Через драг-дроп должно работать, только блок разбить надо после вставки (блок в блоке - может ты не тот блок проверял).
VetalBY вне форума  
 
Автор темы   Непрочитано 16.05.2007, 18:07
#19
mmmx


 
Регистрация: 06.07.2006
Москва
Сообщений: 42


Цитата:
VetalBY: Конечно держаться не будут, так как ты цепляешь данные к ссылке на блок (BlockReference), а не к описанию блока (BlockTableRecord). Понятно, что цеплять к описанию блока нет никакого смысла. Так вот при вставке из ДЦ, ДЦ берет только описание блока, но никак ни его ссылку - в твоем случае из ДЦ брать не имеет смысла. Через драг-дроп должно работать, только блок разбить надо после вставки (блок в блоке - может ты не тот блок проверял).
А, вот в чем дело... Спасибо, буду пробовать!
mmmx вне форума  
 
Непрочитано 16.05.2007, 18:52
#20
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


>mmmx
Некоторые данные храню в гиперссылке. Думаю, что и в VBA не проблема их туда записать.

На лиспе выглядит так
Код:
[Выделить все]
(DEFUN mip-put-hyperlink ( ENAME URLDescription )(vl-load-com)
 (if (eq (type ENAME) 'ENAME)(setq ENAME (vlax-ename->vla-object ENAME)))
  (vlax-for hyp (vla-get-hyperlinks ENAME)(vla-delete hyp))
  (vla-add (vla-get-hyperlinks ENAME) "about:blank" URLDescription))


;|=============== Команда HYP ================================================
Заносит введенное описание объекта всем выбранным примитивам как гиперссылку
Включение/отключение показа гиперссылок см. команды
_HYPERLINKOPTIONS (ГИПЕРСВОЙСТВА)|;
(defun C:HYP ( / sset hyptxt)(vl-load-com)  
(setq hyptxt (getstring t "\nОписание объекта <выход>: "))
(setq hyptxt (VL-STRING-TRIM " " hyptxt))
(if (and (/= hyptxt "")(setq sset (ssget "_:L")))
 (foreach item (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex sset)))) 
   (mip-put-hyperlink item hyptxt)))(princ))
Использовать лисп из VBA можешь через SendCommand.

>ShaggyDoc
Цитата:
Вместо "текстового текста"
Хотел по русски, а вышло масло масляное
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Попытался сделать автоматическое составление спецификации по

Размещение рекламы