Тема: Из Excel в AutoCAD и обратно в Excel

Здравствуйте!

Расскажите, хотя бы приблизительно, как выполнить следующие действия:
1. Я работаю в Excele и файл AutoCAD в который мне нужно заглянуть тоже открыт (т.е. макрос который я хочу сделать должен быть в рабочем файле Excel)
2. Мне нужно сделать активным чертеж AutoCAD (его hwnd мне известен)
3. В чертеже AutoCAD я делаю некоторые измерения и отправляю результат измерений в буфер обмена
4. Сворачиваю чертеж AutoCAD
5. Снова делаю активным файл Excel.

Собственно, в первую очередь, непонятно как переключится на чертеж AutoCAD и программно начать командовать уже им. А затем как переключиться обратно на Excel.

Заранее спасибо

Re: Из Excel в AutoCAD и обратно в Excel

Какая версия AutoCAD?

Re: Из Excel в AutoCAD и обратно в Excel

2010

Re: Из Excel в AutoCAD и обратно в Excel

Тебе нужны методы CreateObject и GetObject. Поищи по форуму, было.
Вот например - https://www.caduser.ru/forum/topic39526.html

Re: Из Excel в AutoCAD и обратно в Excel

wl2000 пишет:

2010

Не гарантирую но может найду в своих закромах попозже
Тут ведь дело еще в версии Windows
SetFocus API функция может не работать в семерке...

(изменено: wl2000, 17 января 2012г. 21:33:11)

Re: Из Excel в AutoCAD и обратно в Excel

Вильдар пишет:

Тебе нужны методы CreateObject и GetObject. Поищи по форуму, было.
Вот например - https://www.caduser.ru/forum/topic39526.html

Да, я думал об этом - мне все ясно когда я создаю новый чертеж или открываю программно существующий. Но когда чертеж уже был открыт самим пользователем я не знаю как написать что-то типа:

      Dim acDoc as AcadDocument
      Set acDoc = [вот тот уже открытый чертеж]
fixo пишет:

Не гарантирую но может найду в своих закромах попозже
Тут ведь дело еще в версии Windows
SetFocus API функция может не работать в семерке...

Жду с нетерпением)

(изменено: Вильдар, 17 января 2012г. 22:02:56)

Re: Из Excel в AutoCAD и обратно в Excel

wl2000 пишет:

Set acDoc = [вот тот уже открытый чертеж]

Set acad = GetObject(, "AutoCAD.Application")
Возможно два варианта времени связывания объекта.
1. Объявлять acad as AcadApplication. И соответственно в референсы добавить библиотеку автокада определенной версии.
2. acad as object. Тогда ты не связан с определенной библиотекой автокада. А реагируешь "по месту". Там определяя версию автокада и т.д.
Тебе с этим нужно определится. Основываясь на своих обстоятельствах. Ты точно знаешь, что установленна определенная версия автокада или нет.

Не уверен, но думаю версия винды тут мало что меняет.

И все-таки почитай хотя бы ту ссылку, что я дал. Там есть еще нюансы. Расписывать не хочется, да и могу упустить что-нибудь. Почитай сам.

Ну и получив ссылку на объект автокада (acad) делай в нем необходимые операции. Текущий документ можно получить через acad.ActiveDocument.

Re: Из Excel в AutoCAD и обратно в Excel

wl2000 пишет:

Жду с нетерпением)

Собрал всяко разно, спробуй
- в AutoCAD'e 2009-м работает (Excel 2007, Windows 7)
Код в Экселе( Автокад открыт )

Option Explicit
'' ***   Добавить Reference:   ***
''Tools--> References --> AutoCAD Focus Control for VBA Type Library
Dim pnum As String, x As String, y As String, z As String
Dim acApp As AcadApplication
Dim acDoc As AcadDocument
Dim acSpace As AcadBlock
Dim acdCap As String, ExcCap As String, copyStr As String
Private Declare Function SetFocus Lib "user32" (ByVal hwnd As Long) As Long
Public Sub TestAcadExcelInteraction()
On Error GoTo Err_Control
ExcCap = Application.Caption

Set acApp = GetObject(, "Autocad.Application")
acApp.Visible = True
SetFocus acApp.hwnd
Application.WindowState = xlMinimized
acApp.WindowState = acMax

Set acDoc = acApp.ActiveDocument

If acDoc.GetVariable("CVPORT") = 1 Then
    Set acSpace = acDoc.PaperSpace
Else
    Set acSpace = acDoc.ModelSpace
End If
'здесь чего-нибудь рисуем в активной вкладке или модели
Dim ftype(0) As Integer
Dim fdata(0) As Variant
Dim dxfCode, dxfValue
ftype(0) = 0: fdata(0) = "*text"
dxfCode = ftype: dxfValue = fdata
     Dim oSset As AcadSelectionSet
          With acDoc.SelectionSets
               While .Count > 0
                    .Item(0).Delete
               Wend
          Set oSset = .Add("MySset")
          End With
acApp.Eval ("msgbox(" & Chr(34) & "Выбрать единичный Tекст или Mтекст, нажать Enter" & Chr(34) & ")")
oSset.SelectOnScreen dxfCode, dxfValue
Dim oEnt As AcadEntity
Set oEnt = oSset.Item(0)
If TypeOf oEnt Is AcadText Then
Dim oText As AcadText
Set oText = oEnt
Dim tstrval As String
tstrval = oText.TextString
copyStr = tstrval
''dummy test:
acApp.Eval ("msgbox(" & Chr(34) & tstrval & Chr(34) & ")")
End If

If TypeOf oEnt Is AcadMText Then
Dim oMText As AcadMText
Set oMText = oEnt
Dim mstrval As String
mstrval = oMText.TextString
copyStr = mstrval
''dummy test:
acApp.Eval ("msgbox(" & Chr(34) & mstrval & Chr(34) & ")")
End If


SetFocus Application.hwnd '' you go back to Excel
Application.WindowState = xlMaximized
''dummy test:
Cells(10, 10) = copyStr
Err_Control:
If Err.Number <> 0 Then

MsgBox Err.Description
End If

End Sub

[FONT=Arial]~'J'~[/FONT]

Re: Из Excel в AutoCAD и обратно в Excel

Эксель файл с макросом тут,
добавил закрытие рисунка без сохранения
http://dl.dropbox.com/u/18024145/VBAExcelAutoCAD.xls
(сохранил в 97-2003 формате)
[FONT=Arial]~'J'~[/FONT]

Re: Из Excel в AutoCAD и обратно в Excel

Спасибо. Утащил смотреть)

Re: Из Excel в AutoCAD и обратно в Excel

wl2000 спрашивает <Собственно, в первую очередь, непонятно как переключится на чертеж AutoCAD и программно начать командовать уже им. А затем как переключиться обратно на Excel.>

Стратегически нужно создавать приложение VBA в Autocade и в коде для переключения в Excel использовать конструкцию:
Dim Excel As Excel.Application
Set Excel = New Excel.Application
Set Excel = GetObject(, "Excel.Application.12")
xOpen = xPath + "\" + xfile
With Excel
.Workbooks.Open (xOpen)
и т.д.

Re: Из Excel в AutoCAD и обратно в Excel

Valeriy Pismarev пишет:

Стратегически нужно создавать приложение VBA в Autocade и в коде для переключения в Excel использовать конструкцию:

Совершенно верно. Только мне нужно из Екселя в Автокад. В принципе, все что вы написали ниже правильно, только вместо Excel мне надо писать про Автокад.

fixo пишет:

Собрал всяко разно, спробуй
- в AutoCAD'e 2009-м работает (Excel 2007, Windows 7)
Код в Экселе( Автокад открыт )

Все работает! Огромное спасибо. Вам очередной плюсик))

Re: Из Excel в AutoCAD и обратно в Excel

Успехов :)

Re: Из Excel в AutoCAD и обратно в Excel

Хочу поблагодарить fixo, т.к. работаю наоборот из Autocada in Excel
А вот как открыть файл Autocada в приведенном коде, чет у меня не получается?

Re: Из Excel в AutoCAD и обратно в Excel

1. Для этого примера чертеж должен быть открыт заранее
2. Смотри в ссылках(VBA Editor-->Tools-->References) наверно у тебя другая версия (если она
там отмечена как: MISSING)
Еще пример - там файл прописан в первой ячейке, измени на свой путь:

http://dl.dropbox.com/u/18024145/ForBill.xls

[FONT=Arial]~'J'~[/FONT]

Re: Из Excel в AutoCAD и обратно в Excel

fixo пишет:

1. Для этого примера чертеж должен быть открыт заранее
2. Смотри в ссылках(VBA Editor-->Tools-->References) наверно у тебя другая версия (если она
там отмечена как:  MISSING )
Еще пример - там файл прописан в первой ячейке, измени на свой путь:

http://dl.dropbox.com/u/18024145/ForBill.xls

  ~'J'~

Спасибо, буду смотреть. А вот URL почемуто блокируется Системным сервером