Тема: Связь VB с AutoCAD

Подскажите алгоритм связи между двумя програмами.

Re: Связь VB с AutoCAD

1) reate a backup of the folder containing your Visual Basic automation source files.
This ensures that you have a copy of the source files to use with previous releases of AutoCAD, if needed.
2) Open the Project (VBP) file in Visual Basic, and then on the Project menu, click References.
3) In the References dialog box, remove the reference to the type library named acad.tlb, which by default is located in c:\program files\autocad 2002.
4) In the References dialog box, add a reference to the type library named acax16enu.tlb, which by default is located in c:\program files\common files\autodesk shared, and then click OK.
5) If a CreateObject or GetObject function uses a version-independent ProgID, change the function to use a version-dependent ProgID. For AutoCAD 2004, use version-dependent ProgIDs.
For example, if you are using CreateObject for AutoCAD 2004, you replace CreateObject ("AutoCAD.Application") with CreateObject ("AutoCAD.Application.16").
Additionally, if a GetInterfaceObject method uses a version-independent ProgID, the method must be changed to use a version-dependent ProgID.
Note  To use CreateObject, GetObject, or GetInterfaceObject for previous releases of AutoCAD, you use the appropriate version. For example, for AutoCAD 2002, you replace CreateObject ("AutoCAD.Application") with CreateObject ("AutoCAD.Application.15").
6) Save the Project file and recompile it.

Re: Связь VB с AutoCAD

Декларируешь переменные

Public ThisDrawing As AutoCAD.AcadDocument
Public ACAD_APP As Object
Запускаешь функцию
Public Function Connect2Acad() As Boolean
    'Basicly it sets the ThisDrawing public variable to active document
    On Error Resume Next
        If ACAD_APP Is Nothing Then
            Set ACAD_APP = GetObject(, "AutoCAD.Application")
            If Err Then
                MsgBox "AutoCAD is not Running!"
                Set ThisDrawing = Nothing
                Connect2Acad = False
                Exit Function
            End If
        End If
        Set ThisDrawing = ACAD_APP.ActiveDocument
        Connect2Acad = True
        If Ut Is Nothing Then
            Set Ut = New Util
        End If
End Function

И начинаешь работать.

Re: Связь VB с AutoCAD

С точки зрения клиент-серверной архитектуры возможны два варианта:
1.ACAD - сервер, VB - клиент с использованием т.н. технологии позднего связывания.

Sub ACAD_Connect()
   Public AcadApplication As Object
   On Error Resume Next
   Set AcadApplication = GetObject(, "AutoCAD.Application")
   используется если Автокад уже запущен,
   'иначе используем ф-цию CreateObject,которая запускает Автокад на выполнение
If Err Then
     Set AcadApplication = CreateObject("AutoCAD.Application")
     AcadApplication.Visible = True
     Err.Clear
   End If
End Sub

Недостатки: из-за многоступенчатого доступа к обьектам
Автокада и необходимости многократных проверок (позднее связывание) работает медленно и возможны ошибки времени выполнения.
2.VB - сервер, ACAD (в лице VBA) - клиент.Эта схема напоминает пришивание пиджака к пуговице. В VB-программе в модуле класса StartMyProgram  пишем процедуру запуска:

'class StartMyProgram in MyVBProgram:
Public Sub StartMyVB(ThisDrawingVBA As AcadDocument)
      Call AccessToDraw(ThisDrawingVBA)
      Form1.Show
End Sub

и в VBA пишем процедуру вызова осн. программы и передаем туда объект ThisDrawing:

'VBA-macros:
Sub StartVB()
    Dim vb As StartMyProgram
    Set vb = New MyVBProgram.StartMyProgram
    vb.StartMyVB ThisDrawing
End Sub

Затем компилируем VB-прогу в dll-файл и присоединяем
его к VBA-макросу в качестве компонента. Для полноты картины вешаем на кнопку LISP для запуска макроса.
Недостатки:При отладке такой программы присходит засорение среды, т.к. каждый вариант программы приходится регистрировать в ОС как новый компонент,а также
сбои присущие COM-технологии.

Re: Связь VB с AutoCAD

Спасибо! Все получилось.