Тема: Совместная работа ACAD и Access

Господа профессионалы!
Направьте, пожалуйста на правильный путь!
Есть у меня DB в Access-е и к ней подсоединены ACAD-овские
файлы. Активирую форму, на которой организую ввод необходимой информации, также на этой форме расположен объект ACAD. Хочется, чтобы по нажатию кнопки произошла необходимая прорисовка и обновление объекта ACAD.
Если это возможно, то в общих чертах, что здесь лучше и удобнее применить: очевидно, что по нажатию кнопки надо запустить ACAD, а в нем по событию открытия файла рисовать то, что надо, а потом автозакрываться, или не так? Как лучше передать информацию для прорисовки.

Re: Совместная работа ACAD и Access

В принципе, открывать AutoCAD нет необходимости.
Можно получить доступ напрямую к базе данных чертежа. Для этого следует подключить библиотеку AXDBLib в виде компонента AutoCAD/ObjectDBX Common 16.0 Type Library.
   Привожу имеющийся под рукой пример для вставки окружности, думаю, что нетрудно его интерпретировать под точки...
   И еще. У меня этот фокус удавался только под AutoCAD2004 и выше... Почему так, не разобрался.

Sub Example_AddCircle()
    ' This example creates a circle in model space.
    Dim fName As String
    Dim MainDoc As AxDbDocument
    Set MainDoc = New AxDbDocument
    fName = "D:\Work\DWG\2section.dwg"
    MainDoc.Open fName
    Dim MS As AcadModelSpace
    Set MS = MainDoc.ModelSpace
    Dim circleObj As AcadCircle
    Dim centerPoint(0 To 2) As Double
    Dim radius As Double
    ' Define the circle
    centerPoint(0) = 9309.2111: centerPoint(1) = 3099.5424: centerPoint(2) = 0#
    radius = 28#
    ' Create the Circle object in model space
    Set circleObj = MS.AddCircle(centerPoint, radius)
    MsgBox circleObj.Layer
    MainDoc.SaveAs (fName)
    Set MainDoc = Nothing
End Sub

Re: Совместная работа ACAD и Access

LeonidSN пишет:

И еще. У меня этот фокус удавался только под AutoCAD2004 и выше... Почему так, не разобрался.

Этот фокус работает и под AutoCAD 2002, только там нужен компонент AutoCAD/ObjectDBX Common Object Library (Ver 1.0) и его необходимо зарегистрировать при помощи запуска regsvr32 axdb15.dll (при инсталляции AutoCAD 2002 этот компонент автоматом не регистрируется). Во всяком случае работа в C++ с ним возможна, а в VBA я не проверял.

Re: Совместная работа ACAD и Access

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

Re: Совместная работа ACAD и Access

Если честно, то я вообще не совсем понял где это надо сделать - в Access-е или в ACAD-е.

Re: Совместная работа ACAD и Access

Алексей пишет:

Если можете, подскажите, пожалуйста, как подключаются данные компоненты

Если компонента инсталлирована в системе (а AutoCAD/ObjectDBX Common 16.0 Type Library инсталлируется вместе с AutoCAD 2004...2006), то достаточно внутри AutoCAD запустить VBAIDE и в меню Tools->References выбрать и отметить нужные компоненты.

Re: Совместная работа ACAD и Access

> Алексей
Это нужно сделать в Access, если ты из него собираешься работать с чертежами AutoCAD. Тогда соответственно Tools->Reference и выбор компонент нужно делать в редакторе макросов в Access.

Re: Совместная работа ACAD и Access

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

Set MainDoc = New AxDbDocument

выскакивает ошибка:
Run-time error '-2147024770(8007007e)':
Automation error
Не найден указанный модуль.

Межет у меня в Access-е еще какие-нибудь необходимые настройки не выполнены?
Заранее благодарен!

Re: Совместная работа ACAD и Access

> Алексей
Подключи еще компонент AutoCAD 2006 Type Library и попробуй такой код:

Sub Example_AddCircle()
    ' This example creates a circle in model space.
    Dim fName As String
    Dim AcadApp As AcadApplication
    Set AcadApp = New AcadApplication
    Dim MainDoc As AxDbDocument
    Set MainDoc = GetInterfaceObject("ObjectDBX.AxDbDocument.16")
    fName = "C:\d.dwg" 'имя открываемого dwg-файла
    MainDoc.Open fName
    Dim MS As AcadModelSpace
    Set MS = MainDoc.ModelSpace
    Dim circleObj As AcadCircle
    Dim centerPoint(0 To 2) As Double
    Dim radius As Double
    ' Define the circle
    centerPoint(0) = 9309.2111: centerPoint(1) = 3099.5424: centerPoint(2) = 0#
    radius = 28#
    ' Create the Circle object in model space
    Set circleObj = MS.AddCircle(centerPoint, radius)
    MsgBox circleObj.Layer
    MainDoc.SaveAs (fName)
    Set MainDoc = Nothing
    Set AcadApp = Nothing
End Sub

Я не большой специалист в VBA, но предполагаю, что внутри AutoCAD ссылки на его методы разрешаются автоматически, а в Access необходимы дополнительные телодвижения...

Re: Совместная работа ACAD и Access

На этот раз получилось! Классно!
Но вот снова проблемма: после того как отработала вышеуказанная программка сам файлик "C:\d.dwg" не открывается двойным кликом мыши. Я обнаружил, что в "Диспетчере задач Windows/Процессы" ACAD.exe остается в списке (видимо в этом причина). Но, в то же время, если сначала открыть ACAD, а из него пытаться открыть "C:\d.dwg", то получается с переменным успехом (то нормально откроется, а то только для чтения).
Неужели придется прощаться с ACAD-ом?! Ну очень мне этого не хочется!!!

Re: Совместная работа ACAD и Access

добавь перед
Set MainDoc = Nothing
строку:
MainDoc.Close fName

Re: Совместная работа ACAD и Access

Логично, но это дает ошибку
Object doesn't support this property or method
, да и в раскрывающемся списке .Close не предлагается у меня.

Re: Совместная работа ACAD и Access

> Алексей
Добавь перед

Set AcadApp = Nothing

строку

AcadApp.Quit

Вот так будет логично. :)
А у объекта AxDbDocument действительно нет метода Close.

Re: Совместная работа ACAD и Access

Упс! Наверное правильнее будет так.

Sub Example_AddCircle()
    ' This example creates a circle in model space.
    Dim fName As String
    Dim AcadApp As AcadApplication
    Set AcadApp = New AcadApplication
    Dim MainDoc As AxDbDocument
    Set MainDoc = AcadApp.GetInterfaceObject("ObjectDBX.AxDbDocument.16")
    fName = "C:\d.dwg" 'имя открываемого dwg-файла
    MainDoc.Open fName
    Dim MS As AcadModelSpace
    Set MS = MainDoc.ModelSpace
    Dim circleObj As AcadCircle
    Dim centerPoint(0 To 2) As Double
    Dim radius As Double
    ' Define the circle
    centerPoint(0) = 9309.2111: centerPoint(1) = 3099.5424: centerPoint(2) = 0#
    radius = 28#
    ' Create the Circle object in model space
    Set circleObj = MS.AddCircle(centerPoint, radius)
    MsgBox circleObj.Layer
    MainDoc.SaveAs (fName)
    Set MainDoc = Nothing
    AcadApp.Quit ' завершаем AutoCAD
    Set AcadApp = Nothing
End Sub

При этом всегда запускается новый AutoCAD и в нем проводятся необходимые действия. После чего он закрывается. Если AutoCAD был запущен ранее, то он остается "нетронутым".

Re: Совместная работа ACAD и Access

MainDoc.Close fName

Играл, но не угадал :^D

Re: Совместная работа ACAD и Access

Александр!
Я в замешательстве!
Пришел на работу, а на работе ACAD-2005. Ни черта не работает!!! Я даже не понимаю, как подключать библиотеки!! Дома на ACAD-2004 все было прекрасно!
HELP!

Re: Совместная работа ACAD и Access

> [Re:] Александр Ривилис
Я скорее всего чего-то не понял, но если уж получен указатель на интерфейс ACAD

Set AcadApp = New AcadApplication

, то зачем вообще использовать AxDbDocument?

Re: Совместная работа ACAD и Access

> Пастух
Думаю, что с AxDbDocument должно работать немного быстрее. Хотя принципиальной разницы не вижу и вообще не люблю ни VBA, ни ActiveX. :)

> Алексей
Этот код должен работать и в AutoCAD 2005-2006. Подозреваю, что какая-то из библиотек не зарегистрирована в системе.