Интеграция с AutoCAD 2010, Получение всех размеров

Автор Тема: Интеграция с AutoCAD 2010, Получение всех размеров  (Прочитано 10927 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ArtemАвтор темы

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Всем добрый день!
Пишу интеграцию TDMS с AutoCAD 2010. Суть интеграции заключается в получении количества размеров, которые проектировщики проставляют в пространстве листа. Файл нужно открыть в фоне, получить размеры и закрыть.
Как положено создаю:
Set AcadApp = CreateObject("AutoCAD.Application")
а дальше стопор, как же добраться до коллекции размеров?

В своих поисках дошел до коллекции AcadApp.ActiveDocument.Database.Blocks. Выяснил что там размер представлен в виде массива объектов, но возможности отличить его от соседей не представляется возможным.

Буду благодарен за любую наводку.


Отмечено как Решение Artem 20-10-2014, 17:02:58

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Приветствую на форуме! Начни с того, что посмотри документацию AutoCAD ActiveX/COM: http://adn-cis.org/forum/index.php?topic=909.0
Теперь перейдем непосредственно к тому, что тебе нужно:
1) Открываешь чертеж
Код - Visual Basic [Выбрать]
  1. '.........................................................
  2. Dim db As Object
  3. Set db = GetAcDbxDoc()
  4. db.Open dwgPath ' полный путь к dwg-файлу
  5. '.........................................................
  6. Function GetAcDbxDoc() As Object
  7.     Dim strAcadVersion As String
  8.     With AcadApp
  9.        strAcadVersion = Mid(.Version, 1, 2)
  10.        If CInt(strAcadVersion) < 16 Then
  11.            Set GetAcDbxDoc = .GetInterfaceObject("ObjectDBX.AxDbDocument")
  12.        Else
  13.            Set GetAcDbxDoc = .GetInterfaceObject("ObjectDBX.AxDbDocument." & strAcadVersion)
  14.        End If
  15.     End With
  16. End Function

2) Следующий этап - нужно пройтись по всем листам чертежа, при этом, как я понимаю вкладку Модель/Model, тебе нужно будет пропустить.
Коллекция листов - это db.Layouts.
3) Для каждого листа layout в этой коллекции проверяешь его свойство layout.ModelType и если оно True, то пропускаешь этот лист, т.к. это Модель.
4) Теперь получаешь для листа layout свойство layout.Block. Это коллекция примитивов находящихся на этом листе. Проходишь по всем всем этим примитивам и отбираешь только размеры. Я не знаю все ли типы размеров тебе нужны. Поэтому на всякий случай указываю что их несколько:



5) У каждого размера dim есть свойство dim.Measurement, которое даёт значение размера (почитай в документации). Следует только помнить, что пользователь может вручную исправить это значение. И еще это значение возможно нужно будет сконвертировать из другой системы единиц. Но с этим уже будешь экспериментировать сам.

6) После всего этого чертеж нужно будет закрыть. Если мне не изменяет память, то это:

Код - Visual Basic [Выбрать]
  1. Set db = Nothing

Ну для начала всё. На VBA я не пишу. Так что только на уровне идей.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ArtemАвтор темы

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Спасибо! Разобрался.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Спасибо! Разобрался.
Может тогда поделишься решением? Форум именно для этой цели и предназначен. Заодно может и тебе предложат более эффективное решение.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ArtemАвтор темы

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Вот что получилось:

Код - Visual Basic [Выбрать]
  1. set AcadApp = getAutoCadApplication(true)
  2.  
  3. if not AcadApp is Nothing then
  4.    On error resume next
  5.    err.Clear
  6.    AcadApp.Documents.Open(PathFile)     ' PathFile - Путь к файлу
  7.   if err.Number = 0 Then
  8.       set ActiveDoc = AcadApp.ActiveDocument
  9.       DCount = 0
  10.       ' Проверяем листы:
  11.      for each item in ActiveDoc.Layouts
  12.           If not item.ModelType Then
  13.              for each block in item.Block
  14.                  if block.EntityName = "AcDbRotatedDimension" then DCount = DCount + 1
  15.                  ' Поиск остальных размеров ...
  16.             next
  17.           End If
  18.       next
  19.     else
  20.       msg = msg + "Не удалось открыть чертеж: " & PathFile & vbCrLf
  21.     end if
  22. end if
  23.  
  24. ' После работы необходимо за собой убрать:
  25. if not AcadApp is Nothing then
  26.    if (AcadApp.Documents.Count = 0) then
  27.        AcadApp.Quit()
  28.    end if
  29. end if
  30.  
  31. ' Получение экземпляра AutoCAD
  32. Public Function getAutoCadApplication(bOpen) '*  as AutoCad.Application
  33.   set getAutoCadApplication = Nothing
  34.    On error resume next
  35.    err.Clear
  36.    Set Acad = GetObject(,"AutoCAD.Application")
  37.    If err.Number <> 0 Then
  38.       err.Clear
  39.       if bOpen then
  40.          Set Acad = CreateObject("AutoCAD.Application")
  41.          If Err.Number <> 0 Then
  42.             MsgBox "Не удалось запустить AutoCad!",  vbCritical
  43.             Exit Function
  44.          End If
  45.       end if
  46.    End If
  47.    set getAutoCadApplication = Acad
  48. End Function
« Последнее редактирование: 20-10-2014, 20:06:35 от Александр Ривилис »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
1. Для красивого форматирования кода на форуме:

2. А что по поводу размеров внутри блоков вставленных (и возможно вложенных) в листы? Их обрабатывать в твоей постановке задачи не нужно?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ArtemАвтор темы

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Пока не нужно. Сейчас тестируем и обкатываем интеграцию. По первым тестам возник вопрос, можно ли отключить все события AutoCAD?
Чтобы скрыть появления предупреждений, требующие реакции пользователя?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
можно ли отключить все события AutoCAD?
Такого понятия в AutoCAD нет.
Чтобы скрыть появления предупреждений, требующие реакции пользователя?
Универсального средства для этого нет. Часть из запросов можно подавить при помощи установки системных переменных (например, EXPERT, ATTREQ, ATTDIA). Часть запросов таким образом подавить нельзя. Для подавления диалоговых окон нужно пользоваться хуками из Windows API.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение