Работа с определенным экземпляром Civil через COM.

Автор Тема: Работа с определенным экземпляром Civil через COM.  (Прочитано 1499 раз)

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

Оффлайн Разживин АлексейАвтор темы

  • ADN Club
  • Сообщений: 12
  • Карма: 0
  • До-диез
  • Skype: tapraa
Всем привет!
Необходимо через COM-интерфейс из стороннего приложения обратиться к уже открытому Цивилу (или запустить его) и, скажем, нарисовать коготочку.

Ниже приведен код, который это делает. (Написано для 2012 Автокада на основе этого: http://through-the-interface.typepad.com/through_the_interface/2007/12/launching-autoc.html)
Извините, вам запрещён просмотр содержимого спойлеров.


Но при использовании этого метода всплывает пара проблем:
(№1)во первых, если у нас одновременно открыт Автокад, Цивил и Map 3D, то acadApp = Marshal.GetActiveObject("AutoCAD.Application.18.2") присоединится к тому, кто был раньше всех запущен.
А во-вторых (№2), даже если никакого автокада не запущено, то при создании экземпляра приложения через Activator.CreateInstance нет гарантии того, что запустится именно цивил.

Если проявится хоть одна проблема (т.е. мы присоединились НЕ к Цивилу), то на этой строке
Код - C# [Выбрать]
  1. civilApp = acadType.InvokeMember("GetInterfaceObject", BindingFlags.InvokeMethod, null, acadApp, new object[] { "AeccXUiLand.AeccApplication.9.0" });
вылетит TargetInvocationException с ex.InnerException.HResult == -2147467259.

Вопрос: как обратиться к нужному автокаду с цивилом?

Ниже приведены еще пара "черномагических" способов, которые, тем не менее, я не смог заставить работать на себя.

Первый:
Лезем в Running Object Table, выбираем объекты с CLSID Автокада и пытаемся получить из них объекты Цивила. Здесь появляется проблема №1. Даже если записей в ROT несколько, каждая запись является экземпляром первого открытого автокада.
Извините, вам запрещён просмотр содержимого спойлеров.


Второй:
Не знаю, насколько вообще этот способ корректен, делалось по советам отсюда http://stackoverflow.com/questions/770173/how-to-get-excel-instance-or-excel-instance-clsid-using-the-process-id.
Вкратце: получаем процесс автокада по имени, получаем дескриптор главного окна. С помощью функции AccessibleObjectFromWindow (https://msdn.microsoft.com/en-us/library/windows/desktop/dd317978%28v=vs.85%29.aspx) получаем объект, указывая полученный дескриптор и CLSID Автокада.
Извините, вам запрещён просмотр содержимого спойлеров.


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

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

  • Administrator
  • *****
  • Сообщений: 8566
  • Карма: 1045
  • Рыцарь ObjectARX
  • Skype: rivilis
Необходимо через COM-интерфейс из стороннего приложения обратиться к уже открытому Цивилу (или запустить его)
Я бы вообще отказался от этой идеи. Логично сделать так:
1) Написать плагин (dll-сборку), которая грузится в Civil 3D и умеет делать то, что нужно
2) Написать внешнее приложение, которое запускает Civil 3D, но не через COM/ActiveX, а через Process.Start (ну или как-то аналогично) и запускает на выполнение нужный плагин из п.1 (например посредством сформированного scr-файла)
Идея с запуском и обращением к AutoCAD/Civil 3D посредством COM/ActiveX не выдерживает критики в силу того, что на каждое обращение к AutoCAD/Civil 3D нужно сделать кучу проверок (см. здесь: http://adn-cis.org/kak-ispolzuya-visual-c-zapustit-autocad-i-zastavit-ego-vyipolnyat-nekotoryie-dejstviya.html)
Так что если есть хотябы минимальная возможность уйти от этого сценария, то я бы рекомендовал это сделать.

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

Оффлайн Кирилл Захаров

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 5
Я искал информацию на форуме по слову COM и случайно попал на эту тему.
Мне стало интересно.
Хочу спросить на будущее, вдруг пригодится:
например посредством сформированного scr-файла
Можно ли поподробнее рассказать о том, как это сделать? Что это за scr-файл? Как его можно использовать? Его можно запустить из стороннего приложения?



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

  • Administrator
  • *****
  • Сообщений: 8566
  • Карма: 1045
  • Рыцарь ObjectARX
  • Skype: rivilis
Что это за scr-файл? Как его можно использовать?
Это обычный текстовый файл, содержащий последовательность команд AutoCAD (Civil 3D) и который AutoCAD может выполнять при помощи команды _SCRIPT (http://help.autodesk.com/view/OARX/2018/RUS/?guid=GUID-95BB6824-0700-4019-9672-E6B502659E9E) или через опцию командной строки /b: https://knowledge.autodesk.com/ru/support/autocad/learn-explore/caas/CloudHelp/cloudhelp/2018/RUS/AutoCAD-Core/files/GUID-8E54B6EC-5B52-4F62-B7FC-0D4E1EDF093A-htm.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 1660
  • Карма: 397
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
А также его можно использовать в утилите ScriptPro для пакетной обработки чертежей.