Автоматическая спецификация на Delphi
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

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

Автоматическая спецификация на Delphi

Ответ
Поиск в этой теме
Непрочитано 24.10.2007, 17:09 #1
Автоматическая спецификация на Delphi
goa_wert
 
Регистрация: 24.10.2007
Сообщений: 14

Идея автоматической спецификации лежит на основе подсчёта всех блоков, находящихся в пространстве модели (modelspace).
Идея не нова, но вменяемой реализации пока не видел.

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

Код:
[Выделить все]
block:=acad.ActiveDocument.Blocks.Item(i);
blockname:=block.Name;
Однако этот вариант отпал - надо знать колличество.
Тогда начал делать так:
Код:
[Выделить все]
items:=acad.ActiveDocument.ModelSpace.Item(i);
item_name:=items.ObjectName;
В итоге получал что то вроде:
acDbLine или acDbBlockReference

т.е в Итоге я могу посчитать количество абсолютно всех блоков скупом. А вот как теперь зная, что текущий объект - это вхождение блока достать его имя?

з.ы. Может уже есть готовые решения, чтоб я зря время не тратил?
Пробовал в 2008 автокаде Извлечь Атрибуты. Да - показывает кол-во блоков, но как-то долго..глючно... А так я бы и экспорт в эксель загнал бы сразу....
Просмотров: 7061
 
Непрочитано 24.10.2007, 21:43
#2
ShaggyDoc

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


Цитата:
Идея не нова, но вменяемой реализации пока не видел.
И не увидишь. Потому что идея - порочна. Подсчет количества блоков это НЕ "автоматическая спецификация". Это всего лишь подсчет количества блоков - пусть с сортировками и прочим.

То же на LISP сделано множество раз. Delphi для этого самый неподходящий инструмент. Вот оформление спецификаций (БД, редактирование в форме или сетке, справочники, формирование отчета, печать и т.п.) - для этого Delphi, пожалуй, наилучший инструмент. И зачем для Delphi еще какая-то "эксель"? Она сама по себе в 100 раз лучше. Или в 200 - для оформления спецификаций. Экспорт в Excel тоже легко между делом выполняется - как ТНП из отходов основного производства.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 25.10.2007, 10:04
#3
goa_wert


 
Регистрация: 24.10.2007
Сообщений: 14


Цитата:
То же на LISP сделано множество раз
Поделитесь ссылкой на сабж, если не трудно

Делфи как раз и выбрал для оформления спецификаций. Т.е. алгоритм такой:
Связь Делфи с автокадом -> Чтение блоков и их подсчёт -> Формировании на основе прочтённых данных спецификации -> Экспорт в эксель уже готовой сформатированной спецификации...

Последний раз редактировалось Кулик Алексей aka kpblc, 25.10.2007 в 10:16.
goa_wert вне форума  
 
Непрочитано 25.10.2007, 11:43
#4
ShaggyDoc

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


goa_wert, алгоритм - наоборот.

1. Не связь Delphi с Автокадом, а AutoCAD с Delphi.
2. Не чтение блоков, а поиск любых примитивов (блок частный случай), у которых имеется ссылка на таблицу и запись в БД.
3. Формирование спецификации не на основе "прочитанных" данных, а из БД. В спецификации может быть множество позиций, никак не отраженных в чертеже, а также имеющихся в чертеже, но не в виде блоков. С добавлением необходимых позиций. По каким-то позициям "Кол" может быть извлечено и из чертежа.
4. Печать спецификации из Delphi. Факультативно - экспорт в Excel не сформатированной спецификации, а содержимого DataSet.

Ссылки на LISP я не держу (сам пишу). Найдете поиском по форуму.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 25.10.2007, 13:48
#5
goa_wert


 
Регистрация: 24.10.2007
Сообщений: 14


Ну может и так. Мне вот только немного не понятен пункт 2.
Это получаеться что в чертеже есть своя база данных которая хранит информацию о каждом примитиве?
goa_wert вне форума  
 
Непрочитано 25.10.2007, 13:48
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431


См. расширенные данные и (или) пользовательские словари.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.10.2007, 15:07
#7
goa_wert


 
Регистрация: 24.10.2007
Сообщений: 14


А может кто-то всё таки подскажет как в делфи реализовать это:
Цитата:
А вот как теперь зная, что текущий объект - это вхождение блока достать его имя?
Я пытался сделать так:
Код:
[Выделить все]
for i:=0 to a.ActiveDocument.ModelSpace.Count-1 do
   begin
     Current_Item:=a.ActiveDocument.ModelSpace.Item(i);
     if Current_Item.EntityName='AcDbBlockReference' then
       begin
         BlockRef:=Current_Item;
         Form1.ListBox2.Items.Add(BlockRef.Name);
       end;
      end;
Однако при компиляции возникла ошибка в строке: BlockRef:=Current_Item; - мол разные типы переменных (IAcadBlockReference и IAcadEntity)
goa_wert вне форума  
 
Непрочитано 25.10.2007, 15:30
#8
VVA

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


В свое время было опубликовано Алексеем на autocad.ru. Считает и динамические блоки по EffectiveName
Код:
[Выделить все]
(defun c:blockcount (/ adoc selset res name) 
  (vl-load-com) 
  (setq adoc (vla-get-activedocument (vlax-get-acad-object))) 
  (if (setq selset (ssget '((0 . "INSERT")))) 
    (progn 
      (foreach blk 
               (mapcar 'vlax-ename->vla-object 
                       (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset))) 
                       ) ;_ end of mapcar 
        (setq name (cond 
                     ((and (vlax-property-available-p blk 'isdynamicblock) 
                           (= (vla-get-isdynamicblock blk) :vlax-true) 
                           ) ;_ end of and 
                      (vla-get-effectivename blk) 
                      ) 
                     (t (vla-get-name blk)) 
                     ) ;_ end of cond 
              ) ;_ end of setq 
        (if (member name (mapcar 'car res)) 
          (setq res (subst (cons name (1+ (cdr (assoc name res)))) 
                           (assoc name res) 
                           res 
                           ) ;_ end of subst 
                ) ;_ end of setq 
          (setq res (append res (list (cons name 1)))) 
          ) ;_ end of if 
        ) ;_ end of foreach 
      (princ "\nИмя\tКоличество") 
      (foreach item res 
        (princ (strcat "\n" (car item) "\t" (vl-princ-to-string (cdr item)))) 
        ) ;_ end of foreach 
      (princ) 
      ) ;_ end of progn 
    ) ;_ end of if 
  ) ;_ end of defun
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 25.10.2007, 15:38
#9
goa_wert


 
Регистрация: 24.10.2007
Сообщений: 14


2 VVA - Спасибою Буду разбираться.
По поводу своего-же вопроса:
Цитата:
Однако при компиляции возникла ошибка в строке: BlockRef:=Current_Item; - мол разные типы переменных (IAcadBlockReference и IAcadEntity)
Решил сам. Нужно сделать так
Код:
[Выделить все]
BlockRef:= IDispatch(Current_Item) as IAcadBlockReference;
p.s. У меня к сожалению форум на autocad.ru не работает...

Последний раз редактировалось goa_wert, 25.10.2007 в 15:52.
goa_wert вне форума  
 
Непрочитано 25.10.2007, 15:38
#10
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431


> #7 : Так тебе дельфя английский языком сообщает, что ты работаешь с разными типами данных - пытаешься сравнивать описание блока и обычные примитивы. Могу сказать только одно: справка по объектной модели acad'a должна быть прочитана от корки до корки.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.10.2007, 06:42
#11
ShaggyDoc

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
> справка по объектной модели acad'a должна быть прочитана от корки до корки.
Верно. Причем прочитана в прямом и обратном направлении, несколько раз. И всегда открыта справка acadauto.chm.

Из Delphi с AutoCAD можно работать только через объектную модель. Так же работает встроенный в AutoCAD VBA. Но он хоть встроен внутрь.

Работу через объектную модель из внешнего приложения можно сравнить с управлением марсо-луноходами с Земли. Можно, но неудобно. И с ограничениями. Нет в объектной модели свойства или метода - и ничего не сделаешь. А там далеко не все есть, и работа с объектами далеко не всегда эффективна. Многое объектными методами нельзя сделать в принципе.

Обычная ошибка "дельфинов" - основываясь на своем хорошем знании Delphi и слабом знании AutoCAD пытаются делать свое приложение "главным".
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 26.10.2007, 17:17
#12
goa_wert


 
Регистрация: 24.10.2007
Сообщений: 14


А можно ли сделать связку ObjectARX+Excel ?
Меня привлекает то, что можно делать Автокадовские менюшки и панели инструментов...
В Делфи такой фичи не нашел.

з.ы. Не знаю как на счёт неудобства и невозможности выполнения некоторых функций - пока не встречал...
з.з.ы. Это вторая програмка которую пишу. Первую писал год назад, которая значительно ускорила создание монтажных чертежей (автоматическая прорисовка переходов, отводов, шаровых кранов, фильтров), но время идёт вперед и наша контора постепенно переходит на 3D. И первая прога отпала за не надобностью... Но год - очень славно послужила
з.з.з.ы. У меня что знание AutoCAD, что Delphi где-то на троечку....И мне всё равно какое приложение "главное". Для меня важен результат

Последний раз редактировалось goa_wert, 26.10.2007 в 17:26.
goa_wert вне форума  
 
Непрочитано 26.10.2007, 19:01 Спецификации в Excel - это очень удобно.
#13
Бриг


 
Регистрация: 17.10.2004
Сообщений: 175


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
И зачем для Delphi еще какая-то "эксель"? Она сама по себе в 100 раз лучше. Или в 200 - для оформления спецификаций.
Спецификации во Всемогущем Excel - это здорово. И очень удобно.
Бриг вне форума  
 
Непрочитано 26.10.2007, 20:46
#14
ShaggyDoc

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


Цитата:
Сообщение от Бриг Посмотреть сообщение
Спецификации во Всемогущем Excel - это здорово. И очень удобно.
Ага, еще бы про "всемогущий Word" написали. Многие в нем и делают. В спецификациях "Всемогущему Excel" нечего перемножать и складывать. А "база данных", которую в Excel можно сделать - самая примитивная и абсолютно ни от чего не защищенная.

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

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

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

Цитата:
А можно ли сделать связку ObjectARX+Excel ?
ObjectARX нужен исключительно для работы с AutoCAD. Вообще-то это набор библиотек. А среда программирования - MS VC++ (разных версий). Естественно, что в программах, разрабатываемых в такой мощной среде, можно сделать связку с Excel. Но зачем козе баян?

Цитата:
Меня привлекает то, что можно делать Автокадовские менюшки и панели инструментов...
В Делфи такой фичи не нашел.
А при чем здесь Delphi или еще "кто-то"? Все, что есть в объектной модели - доступно и через Delphi. "Фичу" надо искать не в Delphi, а в AutoCAD.
Цитата:
мне всё равно какое приложение "главное". Для меня важен результат
Если "все равно", то и результата можно не получить.
ShaggyDoc вне форума  
 
Непрочитано 27.10.2007, 10:16 И в автокаде делают
#15
Бриг


 
Регистрация: 17.10.2004
Сообщений: 175


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Ага, еще бы про "всемогущий Word" написали. Многие в нем и делают.
И в автокаде делают до сих пор. И не жалуются.

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

Зачем усложнять то, что еще и в простоте на понятно? Спецификация в Excel снимает столько проблем, что многим профессиональным программистам (которые проектируют "спецификацию" с нуля и думают, что сейчас у них все заработает) и не снилось.
Бриг вне форума  
 
Непрочитано 27.10.2007, 14:44
#16
lee


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


Цитата:
Сообщение от goa_wert Посмотреть сообщение
Идея автоматической спецификации лежит на основе подсчёта всех блоков, находящихся в пространстве модели (modelspace).
Идея не нова, но вменяемой реализации пока не видел.
поставь Autodesk ADT (Architecture) и не изобретай велосипед. Вменяемых реализаций он не видел !!!
lee вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Автоматическая спецификация на Delphi

Реклама i


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рамки А4...А1 и СПЕЦИФИКАЦИЯ по данным файлов Autodesk Inventor Бриг Прочее ПО от Autodesk 19 03.06.2009 10:38
спецификация арматуры в автокаде-знает ли кто либо? Misha Kaplan Прочее. Программное обеспечение 9 26.03.2007 19:57
Спецификация и field Вадим AutoCAD 2 07.03.2006 22:02
Delphi and AutoCAD John Ch. Программирование 4 31.01.2004 13:58