Forge, API и программирование – Русский – только для чтения
Задавайте вопросы и делитесь знаниями по Autodesk Forge и программированию на API программного обеспечения Autodesk
отмена
Отображаются результаты для 
Показать  только  | Вместо этого искать 
Вы имели в виду: 

ACAD: Объекты COM - Использование

25 ОТВЕТ 25
Ответить
Сообщение 1 из 26
SearcherK
3075 просмотров, 25 ответов

ACAD: Объекты COM - Использование

Добрый вечер!
Подскажите, пожалуйста, во-первых, в чём разница между методами GetInterfaceObject и CreateObject, а во-вторых, в каком случае лучше использовать каждый из методов.

В Help единственное примечание о методе GetInterfaceObject: "Although the object will be loaded into AutoCAD, it will not show up in its type library. The object will have its own type library. This method lets you connect to an ActiveX Automation server."

Пробовал в AutoCAD 2008 на VBA создать объект класса "Excel.Application" используя оба метода:

1) Dim obj As Object
Set obj = Application.GetInterfaceObject("Excel.Application")

2) Dim obj As Object
Set obj = CreateObject("Excel.Application")

В первом случае получил ошибку: "Run-time error '-2147221164(80040154)'". Чем может быть вызвана ошибка?

25 ОТВЕТ 25
Сообщение 2 из 26
Alexander.Rivilis
в ответ: SearcherK

Excel внешнее по отношению к AutoCAD приложение и поэтому его нужно вызывать с использованием метода CreateObject. Использовать метод GetInterfaceObject можно только для того, что грузится "внутрь" AutoCAD и выполняется в его адресном пространстве.

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Сообщение 3 из 26
egorovautocad
в ответ: SearcherK

Здравствуйте.
Подскажите, пожалуйста, как из прикладной программы установить связь с запущенным Автокадом, и если их несколько запущено, то, как различить копии (Автокада)?
VB или VC.
Сообщение 4 из 26
Alexander.Rivilis
в ответ: SearcherK

Различить их практически нереально. Поэтом лучше запускать их через CreateObject - тогда ты точно будешь работать с той копией AutoCAD, которую запустил.

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Сообщение 5 из 26
jimjam
в ответ: SearcherK

Добрый день.

Подскажите, пожалуйста, в чем может быть проблема.

Запускал АвтоКАД как COM-объект из-под VBA (форма MS Access), открывал чертеж, делал в нем выборку, брал нужную информацию и закрывал. Это работало.

Теперь тот же код переношу на VB.net, и работает все, кроме выборки по свойствам.

Выбрать все объекты при этом можно, но когда передаю параметры FilterData и FilterType, метод Select ругается, мол, неверный тип данных для FilterType.

Может быть, в VBA и в dotNet по-разному представляются массивы? Как тогда это можно обойти?

Сообщение 6 из 26
Alexander.Rivilis
в ответ: jimjam


jimjam написано:
Теперь тот же код переношу на VB.net, и работает все, кроме выборки по свойствам.

Выбрать все объекты при этом можно, но когда передаю параметры FilterData и FilterType, метод Select ругается, мол, неверный тип данных для FilterType.

Может быть, в VBA и в dotNet по-разному представляются массивы? Как тогда это можно обойти?


В VB.NET тип FilterType должен быть не Integer, как в VBA, а Short (или Int16)

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Сообщение 7 из 26
jimjam
в ответ: Alexander.Rivilis

Спасибо! А то уж пришлось передавать лисповую команду выбора объектов и брать текущую выборку... Тоже, конечно, вариант, но некрасиво как-то 🙂

Сообщение 8 из 26
Spyrite
в ответ: SearcherK

День добрый!

 

Скажите пожалуйста, существут ли подробная справочная документация по COM-овским объектам с описанием всех классов, их методов, свойств и событий, доступных в следующих пространствах имён: Autodesk.Autocad.Interop, Autodesk.Autocad.Interop.Common?

Сообщение 9 из 26
Alexander.Rivilis
в ответ: Spyrite


Spyrite написано:
Скажите пожалуйста, существут ли подробная справочная документация по COM-овским объектам с описанием всех классов, их методов, свойств и событий, доступных в следующих пространствах имён: Autodesk.Autocad.Interop, Autodesk.Autocad.Interop.Common?

Да. Существует. Называется она AutoCAD ActiveX and VBA Reference и находится (при инсталлированном AutoCAD) обычно здесь: %SystemDrive%\Program Files\Common Files\Autodesk Shared\acadauto.chm

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Сообщение 10 из 26
GeodeticReseacher
в ответ: SearcherK

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

 

Возникла необходимость разработать внешнее приложения для работы с Acad 2012. Вернее не с Acad 2012, а с его dwg-файлами, т.е. для работы приложения нет необходимости запускать автокад.

Ниже мой код:

 

Public Sub OpenDrawing()

Dim strFileName As String = "D:\2012\Съемка.dwg"
Dim appAcad As New Autodesk.AutoCAD.Interop.AcadApplication
Dim strProgId As String = "AutoCAD.Application.18"

 

Код ниже работает, открывает автокад, но мне он не нужен!

ВОПРОС: Можно-ли обойтись без кода приведенного ниже, т.е. не запускать акад?

 

On Error Resume Next

'' Получить запущенный экземпляр AutoCAD
appAcad = GetObject(, strProgId)
'' Если нет ни одного запущенного приложения AutoCAD, получаем ошибку.
If Err.Number > 0 Then
Err.Clear()
'' создаём новый экземпляр приложения AutoCAD
appAcad = CreateObject("AutoCAD.Application.18")
'' Проверяем, что экземпляр приложения AutoCAD был создан
If Err.Number > 0 Then
Err.Clear()
'' Если экземпляр приложения AutoCAD не был создан, сообщаем об этом вы завершаем работу
MsgBox("Экземпляр приложения 'AutoCAD.Application' не был создан.")
Exit Sub
End If
End If

 

Если перейти сразу к коду, приведенному ниже, то возникает исключение в строке appAcad.Documents.Open(strFileName)

Вызов был отклонен. (Исключение из HRESULT: 0x80010001 (RPC_E_CALL_REJECTED))

 

If (File.Exists(strFileName)) Then
appAcad.Documents.Open(strFileName)
MsgBox("Файл " & strFileName & " открыт.")
Else
MsgBox("Файла " & strFileName & " не существует.")
Exit Sub
End If

 

Я понимаю, что я что-то делаю не так, но что не знаю. 

Помогите пожалуйста.

 

 P.S. Windows 7x64, VS2010, Visual Basic.net

 

Теги (2)
Сообщение 11 из 26
ElpanovEvgeniy
в ответ: SearcherK

Ты создаешь новый объект AutoCAD или используешь существующий.

Тебе необходимо воспользоваться другими технологиями, например ObjectDBX...

Сообщение 12 из 26
kpblc2000
в ответ: ElpanovEvgeniy

ИМХО в данном случае это не важно. Открыть dwg можно либо через AutoCAD, либо через библиотеки ODA (опять же, ИМХО). Так что AutoCAD запускать придется.

Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.


Алексей Кулик aka kpblc | Aleksei Kulik aka kpblc Facebook | LinkedIn
autolisp.ru
Техническая поддержка программистов Autodesk в СНГ
Библиотека пользовательских lisp-функций | Custom Lisp-function library

Сообщение 13 из 26
GeodeticReseacher
в ответ: kpblc2000

Плохо, что в сети мало примеров с использованием именно внешних ехе-приложений для работы с AutoCad. В основном для dll.

И все равно, даже если запускать AutoCad, возникают ошибки: постоянно отрубается от COM при создании, то во время выполнения, то сам AutoCad выдает фаталЕррор.

Если есть рабочий код для запуска AutoCad из внешнего проложения буду признателен. А то тот код, что я приводил работает через раз.

 

Я вот думаю, что проще будет сохранить файл в DXF и оттуда выдергивать нужные мне данные. Тогда точно AutoCad не нужен будет.

Но все равно, для будущего пригодиться и чтение DWG. Пока для моей текущей задачи нет необходимости что-то менять в файле.

 

Сообщение 14 из 26
jimjam
в ответ: GeodeticReseacher

Понимаю, что ответ может быть несвоевременный, все-таки год прошел с вашего вопроса. Но я тут бываю нечасто 🙂

Что касается вашего вопроса, то технология COM вам тут не помощник, т.к. ее суть как раз в том, чтобы обращаться к работающему процессу AutoCAD. И таки да, этот путь нестабильный, тормозной и не очень удобный.

То, что вам нужно (по крайней мере, как я это понимаю), называется RealDWG и распространяется вместе с AutoCAD. Посмотрите внутри папки с Автокадом, там внутри папки bin должна быть папка с именем RealDWG. В ней — набор dll-библиотек, используя которые можно работать с DWG-файлами без AutoCAD (не берусь судить, насколько корректно работать с этими библиотеками на компьютере без установленного AutoCAD с лицензионной точки зрения, но чисто технически работать будет).

Чтобы использовать эти библиотеки нужно созать dotNET-проект и подключить к нему файлы acmgd.dll и/или acdbmgd.dll, после чего читать документацию по разделу ObjectARX for AutoCAD : Managed Class Reference.

Сообщение 15 из 26
kpblc2000
в ответ: jimjam

Утверждение, что "СОМ нестабилен", мягко говоря, весьма спорное. Насчет удобства - туда же.

Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.


Алексей Кулик aka kpblc | Aleksei Kulik aka kpblc Facebook | LinkedIn
autolisp.ru
Техническая поддержка программистов Autodesk в СНГ
Библиотека пользовательских lisp-функций | Custom Lisp-function library

Сообщение 16 из 26
jimjam
в ответ: kpblc2000

Может оно и спорное, но основанное на собственном опыте.

По поводу нестабильности — есть ситуация, в которой COM стабильно "нестабилен": после восстановления компьютера из режима гибернации все COM-объекты рушатся, и приложение нужно перезапускать. И это лишь один из примеров.

По поводу тормознутости-то, надеюсь, возражений нет? 🙂 Писал как-то приложение, последовательно открывающее чертежи, читающее информацию из одного блока и закрывающее чертеж. Сначала делал на COM, потом перевел на RealDWG — быстродействие выросло примерно в десять раз! Опять-таки, COM-ом не удавалось открыть чертежи, созданные не в среде AutoCAD. Благо, таких было немного, но COM их не обрабатывает принципиально! Можно ли такой подход считать стабильным или удобным? Каждый решает для себя сам.

Все сказанное мной, расценивать как "ИМХО" 😃

Сообщение 17 из 26
kpblc2000
в ответ: jimjam

Насчет гибернации - не могу подтвердить. У меня пользователи работают с интенсивностью, исключающей вывод компа в гибернацию. А админы достаточно грамотные, чтобы заблокировать такую возможность доменными политиками. Ноут с Win7x32 вываливается в гибернацию сразу после закрытия крышки, но никаких проблем я не видел.
У меня 99,9% кода на лиспе работают именно через СОМ, все достаточно устойчиво.
По тормознутости в описанном варианте - есть. Надо было не открывать чертежи через Documents.Open, а работать через ObjectDBX либо консольную версию AutoCAD. Тогда тормозов не наблюдается вообще (файл объемом 20 Mb через ObjectDBX открывается моментально).
С файлами dwg, созданными не в AutoCAD, сталкиваться не доводилось, поэтому ничего сказать не могу. Но сильно подозреваю, что можно использовать другие методы, нежели простое Documents.Open или Documents.Add.

Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.


Алексей Кулик aka kpblc | Aleksei Kulik aka kpblc Facebook | LinkedIn
autolisp.ru
Техническая поддержка программистов Autodesk в СНГ
Библиотека пользовательских lisp-функций | Custom Lisp-function library

Сообщение 18 из 26
Alexander.Rivilis
в ответ: jimjam


@jimjam wrote:
...То, что вам нужно (по крайней мере, как я это понимаю), называется RealDWG и распространяется вместе с AutoCAD. Посмотрите внутри папки с Автокадом, там внутри папки bin должна быть папка с именем RealDWG. В ней — набор dll-библиотек, используя которые можно работать с DWG-файлами без AutoCAD (не берусь судить, насколько корректно работать с этими библиотеками на компьютере без установленного AutoCAD с лицензионной точки зрения, но чисто технически работать будет).

Чтобы использовать эти библиотеки нужно созать dotNET-проект и подключить к нему файлы acmgd.dll и/или acdbmgd.dll, после чего читать документацию по разделу ObjectARX for AutoCAD : Managed Class Reference...


Хочу уточнить:

1. RealDWG с AutoCAD не распространялось, не распространяется и думаю никогда распространяться не будет. Эта технология лицензируется отдельно и стоит не дешево: http://www.autodesk.com/realdwg

Как видите за первый год €5000 и по €2500 за каждый последующий.

2. Внутри папки с AutoCAD нет папки bin и соотвественно внутри неё нет папки RealDWG

3. С RealDWG корректно с точки зрения лицензии работать без установленного AutoCAD, а вот то о чем вы говорите - т.е. библиотеки acmgd.dll и acdbmgd.dll (а еще и accoremgd.dll начиная с AutoCAD 2013), входящие в состав AutoCAD можно использовать только с AutoCAD и с точки зрения лицензии и с точки зрения вообще возможности, так как они статически прилинкованы к acad.exe и без него работать не будут.

 

Если я правильно понял о чем Вы говорите, то речь идёт о AutoCAD .NET API и использовать его можно только внутри AutoCAD, т.е. создавать .NET-сборки (dll-файлы), которые загружаются внутрь AutoCAD (например, командой _NETLOAD)

 

 

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Сообщение 19 из 26
jimjam
в ответ: Alexander.Rivilis

Да, признаю свою ошибку. RealDWG, оказывается, не входит в AutoCAD — я работаю, в основном, с AutoCAD Map, а в нем как раз есть папка bin/RealDWG ... Я почему-то думал, что в чистом AutoCAD все так же ) Приношу извинения, если кого-то ввел в заблуждение 🙂 А с .NET-api я его не спутал. В RealDWG есть библиотеки с такими же именами. В этом вся прелесть: большая часть кода, работающего в dll, загружаемых при помощи NETLOAD, будет работать и с RealDWG без изменений (если не используются пространства имен, которых нет в RealDWG).
Сообщение 20 из 26
Alexander.Rivilis
в ответ: jimjam

Повторюсь. В составе AutoCAD Map 3D, как и в составе ни одного из продуктов Autodesk, кроме самого RealDWG SDK, нет папки bin\RealDWG по той причине, что RealDWG - продукт, который лицензируется отдельно за отдельную плату. Тот факт, что у Вас в составе AutoCAD Map есть папка bin\RealDWG может говоритль либо о том, что Вы или Ваша фирма действительно лицензированные пользователи RealDWG, либо что Вы её получили незаконным путём, о чем мне даже думать не хочется...

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Не нашли то, что искали? Задайте вопросы в сообществе или поделитесь своими знаниями.

Новая тема  

Autodesk Design & Make Report