| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Объекты СОМ в AutoCAD

Объекты СОМ в AutoCAD

Ответ
Поиск в этой теме
Непрочитано 16.01.2008, 14:05
Объекты СОМ в AutoCAD
Supermax
 
Руководитель фирмы
 
Москва
Регистрация: 28.03.2007
Сообщений: 1,831

Я думаю, что настало время завести специальную тему по поводу использования объектов СОМ технологии.
Ссылки, описания библиотек DLL, методы, свойства и прочее. Естественно в ключе использования AutoCAD-a на язывак AutoLISP и VBA.


Первая проблема:
Объект WScript.Shell
(setq svr (vlax-get-or-create-object "WScript.Shell"))
; создаем объект
(vlax-dump-object svr T)
; читаем его свойства и методы

Код:
[Выделить все]
; IWshShell3: Shell Object Interface
; Property values:
;   CurrentDirectory = ...Indexed contents not shown...
; Methods supported:
;   Exec (2)
T
Это у меня

А это у людей
http://www.caduser.ru/cgi-bin/f1/board.cgi?t=39974nf

Код:
[Выделить все]
(defun C:TEST()
  (vl-load-com)
  (if (and
        (setq FILE (getfiled "Выберите файл для чтения" "" "csv" 16))
        (setq WS (vlax-get-or-create-object "wscript.shell"))
        )
  (vlax-invoke-method WS
    "run"
    (strcat "notepad.exe\ " FILE)
    4
    :vlax-true)
    )
  )
И это в описании
http://www.script-coding.info/WSH/WshShell.html

Библиотеки исполняемые модули вроде
wscript.exe 5.06.0000.8820
scrobj.dll 5.06.0000.8820
scrrun.dll 5.06.0000.8820
vbscript.dll 5.06.0000.8820

Но не уверен.
Кто и что скажет?

Люди! Сделайте
(vl-load-com)
(setq svr (vlax-get-or-create-object "WScript.Shell"))
(vlax-dump-object svr T)
;;; а потом
(vl-catch-all-apply '(lambda () (vlax-release-object svr)))


на своих машинах!!! Пожалуйста!!!
И скажите что видите.
Просмотров: 39445
 
Автор темы   Непрочитано 07.02.2008, 14:48
#81
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Ну вот, я уже здоров.
Хочу высказать пару своих мыслей по поводу применения «внешних» по отношению к Автокаду языков. Под понятием «внешние» я подразумеваю те языки, которых Автокад не понимает. Например языки Jscript, WBScript и прочие радости.
Я попытался объединить усилия двух «разношерстных» языков над одной задачей. В частности AutoLISP и WBScript. Зачем? А я тогда и сам не знал. Так, для приколу. И вот что из этого получилось:
Когда нужно скакать с одного сценария в другой Фигаро тут – Фигаро там, то все равно надо принять решение с чего начинать? Начать с запуска Лиспа не получилось (пока) слабоват я пока в этих информационных потоках. Что там течет?, от куда?, куда?, для чего?, как на это повлиять? и чем? понятия не имею, а прочесть негде (пока). Так что, кроме запуска из под Автокада скрипт-файла – ничего совершить не удалось. Ну, запустил, ну, отработал скрипт и выдал через MsgBox какую-то билибердень, ну и что? Установить контакт из-под этого скрипта с текущим окном Автокада не удалось. Указатель упорно не хочет указывать на уже открытый документ и это понятно почему. Если вы запустите второй Автокад и попытаетесь открыть второй раз этот же файл – получите фигу. Разве что только для чтения. Вмешательство со стороны в работу приложения над файлом и «помощь» в этом процессе расценивается аналогично. Но я все-таки это сделал. Но об этом позже. Установить связь из Лиспа с запушенным сценарием скрипта, или хотя бы с СОМ объектами сгенерированными им – тоже не получилось по причине слабого владения СОМ технологией и высокой температуры головы. Бился я бился, устал, плюнул и зашел с тыла. Стал пытаться пробиться к открытому документу Автокада со стороны скрипта. Как я уже говорил, установить контакт с уже открытым документом не получается, НО! После запуска скрипта, при попытке применить метод SendCommand из ActiveDocument я наконец-то прозрел в понимании последствий обращения к объектам Автокада из под скрипта. Во первых, Автокад может быть и выключен вообще. Во вторых, при обращении с неправильными аргументами разных методов (я их тьму перепробовал) открывается в уже включенном Автокаде новый файл или появляется меню выбора «Select template». При правильном наборе аргументов идет запуск нового Автокада и в нем, в Drawing1.dwg происходит осуществление задуманного. Я так понял, что пробраться в работающий кад все же можно, но вот, в текущее окно с документом – вряд ли.
Запустить Автокад из под скрипта и открыть нужный файл – запросто. И вот тут создается та самая искомая ситуация, когда есть запущенный скрипт, из него установлена связь с Автокадом и открытым в нем документом. Из скрипта можно рисовать в этом документе что хочешь и с клавиатуры и мышью тоже, а также запускать из под Автокада любые макросы на Лиспе вплоть до таких, которые обращаются к тем же СОМ объектам что и скрипт. Из под скрипта можно через ком. строку запускать лисп-выражения, которые создают переменные, тем самым передавать строковые и цифровые данные в макросы работающие на Лиспе. В скрипте есть возможность наблюдать за процессами в запущенном приложении. Я еще не разобрался с ними, но скоро разберусь. А пока вот, побалуйтесь:
Перед вами два скрипт-файла. Один – та самая программа, которая запускает Автокад и далее в нем может «наводить шорох». Другой – скрипт с простеньким MsgBox-ом, для теста. Скачайте все в директорию С:\WSH создайте такую на диске С. Зайдите в библиотеку DWGRU и скачайте лисп с функцией «DwgRu-WScript-Exec». Все свои кады повыключайте и дважды щелкните по файлу fst.vbs. Выскочит сообщение о начале представления. Нажмите ОК. Запустится Автокад и в Drawing1 будет нарисована косая линия, после чего опять выскочит панель с надписью «далее». Но вы на ОК не нажимайте! А клацните по модели (панель с «далее» свалится в строку «пуск», красненький значок) Нажмите Ctrl+9, появится командная строка. Загрузите через Tools файл DwgRu-WScript-Exec.lsp с одноименной функцией и в командную строку от сюда скопируйте это выражение: (DwgRu-WScript-Exec "С:\\WSH\\ проба.vbs " "")
После запуска скрипта «проба» появится окно с сообщением и после нажатия на него ОК можно достать из ком. строки наше окно с «далее» и нажать там ОК. А можете перед этим еще и порисовать в модели. Только линию не трогайте. Это часть выноски. Нажатие на ОК дорисует выноску с текстом «привет!» Причем линию будет рисовать передачей команды, а текст передачей лисп-выражения. Следуещее «далее» создаст переменную www и запишет в нее строку и сразу в командной строке пропишет !www. Все это будет видно.

Код:
[Выделить все]
Set WshShell = CreateObject("WScript.Shell")
WshShell.Popup "Начинается открытие AutoCAD-a и создание в нем пошагово выноски ""Привет"" ",, "Запуск AutoCAD-a", 4+16

set Network = CreateObject("AutoCAD.Application.16")
set aktdoc = Network.ActiveDocument
aktdoc.SendCommand "_pline 0,0 100,100  "
MsgBox "далее"
aktdoc.SendCommand "_pline 100,100 300,100  "
aktdoc.SendCommand "(command ""_text"" ""110,110,0"" ""25"" ""0"" ""Привет!"") "
MsgBox "далее"
aktdoc.SendCommand "(setq www ""в переменную www записано это значение"") "
aktdoc.SendCommand "!www "

Что это дает?
Ну возьмем длительный и сложный процесс обработки чертежа, когда этот процесс то и дело прерывается найденными ошибками. Их надо править. Зачастую с применением макросов. Что, каждый раз процесс обработки запускать заново? А если он попутно на каждом этапе документы варганит? Их что, стирать каждый раз? Кто-нибудь может в одном и том же документе запустить два Лиспа одновременно? То-то. А тут лепота. Основной сценарий, даже просто директивы запуска лисп блоков пишется на скрипте, а уж в Автокаде происходит само представление. Никто никому не мешает.

Через скрипт можно организовать совместную работу над одним документом. Функция CreateObject WBScript имеет в аргументе дополнительное значение location - сетевое имя компьютера, на котором будет создан объект. Что дает возможность работать в сети в четыре руки, а то и в любом количестве. Видеть содержимое монитора в сети можно другими программами, а свои действия передавать через скрипт.

Короче, для чего-нибудь такие заморочки пригодятся.

В процессе изучения объектов AutoCAD.Application.16/17 и AutoCAD.Drawing.16/17 (дроби я сам написал, чтобы два раза не писать один и тот же объект) я понял, что AutoCAD.Application создавался для создания независимого процесса, а AutoCAD.Drawing – для процесса в уже открытом Автокаде. (это я так раньше думал, а теперь вот выяснил, что это для работы с объектами Автокада без его запуска в отдельном окне).
По сути
AutoCAD.Drawing – это "ActiveDocument".
(setq svr (vlax-get-or-create-object "AutoCAD.Application.16"))
(setq svr3 (vlax-get-property svr "ActiveDocument"))
К сожалению AutoCAD.Drawing работать как надо не захотел из под WBScript. Создаваемые через него объекты лишь мельком появляются и пропадают. Почему? И сам пока не знаю.

Забыл добавить. У кого только 2008 или 2007 кад поменяйте или сотрите в файле FST.vbs цифру 16 и точку перед ней, чтобы стало вот так "AutoCAD.Application"
Вложения
Тип файла: rar fst.rar (601 байт, 119 просмотров)

Последний раз редактировалось Supermax, 07.02.2008 в 16:47.
Supermax вне форума  
 
Автор темы   Непрочитано 07.02.2008, 16:42
#82
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Вот тут:
http://subscribe.ru/archive/comp.sof.../18004013.html

Я нашел про AutoCAD.Drawing.16

Цитата:

Создать и получить доступ к документу AutoCAD, не инициализируя сам AutoCAD можно следующим образом:

Листинг 3
procedure CreateAutoCADDocument;
var
AcadDocument: OleVariant;
begin
AcadDocument := CreateOleObject(‘AutoCAD.Drawing.16’);

// Выполнение необходимой задачи

AcadDocument.Save; // Сохранение документа
AcadDocument.Application.Quit; //Завершение работы и выход из AutoCAD
end;
Правда тут на Паскале, но все понятно вполне.

Я не знаю, от куда взяли эту информацию они, но похоже, очень похоже на правду.
Больше поисковик ничего не нашел, увы.
Supermax вне форума  
 
Непрочитано 08.02.2008, 02:13
#83
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Ну ни себе фига ты отдохнул :) Я только с пятого или шестого раза смог все осилить. Ща я тут тоже развернусь в отместку ;) Чур, стоптанными тапками не кидаться! ;)
Цитата:
<...>Когда нужно скакать с одного сценария в другой Фигаро тут – Фигаро там, то все равно надо принять решение с чего начинать?
А на фига, прошу прощения? Теоретически (да и практически тож ;)) можно все (ну или почти все) сделать и внутри одного языка программирования.
Цитата:
Начать с запуска Лиспа не получилось (пока) слабоват я пока в этих информационных потоках.
Ну уж тут-то... Примеров как у дурака фантиков.
Цитата:
Что там течет?, от куда?, куда?, для чего?, как на это повлиять? и чем?
Зависит от кода ;)
Цитата:
<...>Так что, кроме запуска из под Автокада скрипт-файла – ничего совершить не удалось. Установить контакт из-под этого скрипта с текущим окном Автокада не удалось. Указатель упорно не хочет указывать на уже открытый документ и это понятно почему. Если вы запустите второй Автокад и попытаетесь открыть второй раз этот же файл – получите фигу. Разве что только для чтения.
Есть вариант вернуться "к истокам", так сказать. Сначала шел разговор про СОМ-объекты, скрипты и скриптовые языки тут как собаке пятая нога (ИМХО). А если использовать СОМ, то вопрос "вызвать СОМ, передать ему свойства, вызвать методы, взять данные обратно" я уже показывал. Скрипты в данном контексте, скорее всего, нужного эффекта не дадут.
Цитата:
<...>Установить связь из Лиспа с запушенным сценарием скрипта, или хотя бы с СОМ объектами сгенерированными им – тоже не получилось по причине слабого владения СОМ технологией и высокой температуры головы.<...>
Не только. По-моему, скрипты могут получить какие-то данные, но выдать их в лисп с кондачка не получится. Говорю на основе достаточно поверхностного знакомства с этими языками. Возможно, я ошибаюсь.
Цитата:
Стал пытаться пробиться к открытому документу Автокада со стороны скрипта.
СОМ-технология в полный рост, только в обратном направлении. Я-то предлагал и предполагал, что AutoCAD является СОМ-клиентом, а собственные dll / внешние приложения - СОМ-серверами. Ты же сам AutoCAD начинаешь использовать как СОМ-сервер. Нет, она вполне возможна, но смысла в ней я пока особого не вижу.
Цитата:
Во первых, Автокад может быть и выключен вообще. Во вторых, при обращении с неправильными аргументами разных методов (я их тьму перепробовал) открывается в уже включенном Автокаде новый файл или появляется меню выбора «Select template». При правильном наборе аргументов идет запуск нового Автокада и в нем, в Drawing1.dwg происходит осуществление задуманного. Я так понял, что пробраться в работающий кад все же можно, но вот, в текущее окно с документом – вряд ли.
Во-первых, для того, чтобы с AutoCAD'ом работать, его все равно придется либо запустить, либо получить указатель на имеющийся. В VB6, например, это решается примерно так (кстати, без привязки к какой бы то ни было версии AutoCAD'a - используется позднее связывание):
Код:
[Выделить все]
Public objAcad As Object, objDoc As Object

Public Sub GetAcadDoc()
On Error Resume Next
  objAcad = GetObject(, "AutoCAD.Application")
  If Err.Number <> 0 Then
    Err.Clear
    objAcad = CreateObject("AutoCAD.Application")
    If Err.Number <> 0 Then
      MsgBox "Не удалось установить связь с AutoCAD" & _
        vbCrLf & "Возможно, он неверно установлен или " & _
        "не установлен вообще", vbOKOnly + vbCritical + vbApplicationModal, _
        "Ошибка связи с AutoCAD"
      Err.Clear
      Set objAcad = Nothing
    End If
  End If
  objDoc = objAcad.ActiveDocument
End Sub
Цитата:
Запустить Автокад из под скрипта и открыть нужный файл – запросто. И вот тут создается та самая искомая ситуация, когда есть запущенный скрипт, из него установлена связь с Автокадом и открытым в нем документом. Из скрипта можно рисовать в этом документе что хочешь и с клавиатуры и мышью тоже, а также запускать из под Автокада любые макросы на Лиспе вплоть до таких, которые обращаются к тем же СОМ объектам что и скрипт. Из под скрипта можно через ком. строку запускать лисп-выражения, которые создают переменные, тем самым передавать строковые и цифровые данные в макросы работающие на Лиспе. В скрипте есть возможность наблюдать за процессами в запущенном приложении. Я еще не разобрался с ними, но скоро разберусь.
Небольшой комментарий: каша. Последовательность работы (с точки зрения компа) выглядеть будет так: AutoCAD -> открыть документ -> запуск скрипта -> скрипт и работа в нем без AutoCAD'a -> новый AutoCAD -> документ AutoCAD'a (кстати, возможно, уже открытый) -> работа во втором документе -> сохранение изменений (а куда без них) -> закрытие документа -> закрытие второго AutoCAD'a -> уничтожение "мусора" второго AutoCAD'a и его порождений -> продолжение работы в первом AutoCAD. И все это через СОМ-технологию. Плюс запуск команд через SendCommand. А должно быть так: AutoCAD -> открыть документ -> вызов СОМ-сервера -> СОМ-сервер и работа в нем без AutoCAD'a -> возврат данных в вызвавшую процедуру/функцию -> уничтожение СОМ-сервера -> работа в AutoCAD'e.
> #82: Что "не инициализируя сам AutoCAD" - так это наглая ложь. AutoCAD все равно вызывается (можно посмотреть через список процессов). Вдобавок неизвестно, какой профиль и какая версия будет вызвана. А это чревато: в автозагрузке профиля может сидеть неизвестно что, загрузка AutoCAD'a может занимать немеряно времени. Выполнение метода .Save для текущего документа тоже не будет давать 100% гарантированного результата - формат файла заранее неизвестен, неизвестно, сколько там мусора будет ну и тому подобное.
Если честно, я сам иногда грешу подобным подходом (то есть из-под AutoCAD'a вызвать exe, внутри ехе обратиться через СОМ к активному AutoCAD'у и его документу, чего-то сделать и закрыть ехе), но таких ситуаций у меня раз-два и обчелся.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 08.02.2008, 12:09
#84
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Цитата:
Небольшой комментарий: каша. Последовательность работы (с точки зрения компа) выглядеть будет так: AutoCAD -> открыть документ -> запуск скрипта -> скрипт и работа в нем без AutoCAD'a -> новый AutoCAD -> документ AutoCAD'a (кстати, возможно, уже открытый) -> работа во втором документе -> сохранение изменений (а куда без них) -> закрытие документа -> закрытие второго AutoCAD'a -> уничтожение "мусора" второго AutoCAD'a и его порождений -> продолжение работы в первом AutoCAD.
Небольшая поправочка. Работа начинается так:
Запуск скрипта -> скрипт и работа в нем без AutoCAD'a ->запуск AutoCAD'a скриптом -> открытие документа AutoCAD'a -> работа в документе -> работа в скрипте -> работа в документе ... -> работа в скрипте - сохранение и закрытие документа -> очистка мусора -> закрытие скрипта. Можно остановить работу скрипта без прекращения работы в AutoCAD-е.

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

Очень интересно узнать, как ты обращаешся к активному каду и открытому в нем документу?
Supermax вне форума  
 
Непрочитано 08.02.2008, 12:21
#85
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Так я же код показал... Я не использую скрипты (в силу элементарного незнания), а для "нормальных" языков и такого подхода более чем достаточно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 08.02.2008, 12:58
#86
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Супер! Если выкинуть твои попытки открыть новый сеанс через CreateObject и проверки с радостными сообщениями, то код доступа в уже открытый кад на скрипте выглядит так:
Код:
[Выделить все]
set objAcad = GetObject(, "AutoCAD.Application")
set aktdoc = objAcad.ActiveDocument
И вторая строчка тоже уже вторичное действо.

В итоге мы имеем скрипт, который вмешивается в работу AutoCAD-a и в открытом документе рисует что-то свое.

Код:
[Выделить все]
Set WshShell = CreateObject("WScript.Shell")
WshShell.Popup "Начинается вторжение в AutoCAD и создание в нем пошагово выноски ""Привет"" ",, "Вторжение в  AutoCAD", 4+16
set objAcad = GetObject(, "AutoCAD.Application")
set aktdoc = objAcad.ActiveDocument
aktdoc.SendCommand "_pline 0,0 100,100  "
MsgBox "далее"
aktdoc.SendCommand "_pline 100,100 300,100  "
aktdoc.SendCommand "(command ""_text"" ""110,110,0"" ""25"" ""0"" ""Привет!"") "
MsgBox "далее"
aktdoc.SendCommand "(setq www ""в переменную www записано это значение"") "
aktdoc.SendCommand "!www "
Я думаю, что ты без труда все здесь поймешь.

Последний раз редактировалось Supermax, 08.02.2008 в 13:04.
Supermax вне форума  
 
Непрочитано 08.02.2008, 13:23
#87
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Я-то пойму код. Я другого понять не могу - а на фига рисовать через SendCommand?
И вот еще - а если во время выполнения скрипта (до вызова GetObject) AutoCAD грохнулся? Сам или ему помогли - неважно. Что и в каком виде ты получишь - слабо предсказуемо...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 08.02.2008, 14:18
#88
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Да я проверки выкинул не принципиально! Нужны они, нужны. Просто есть ключевые действия, а есть сопутствующие. Этих "сопутствующих" в десятки раз больше и основной код в них тонет просто. Ясен пень, что дав указание открыть надо проверить а открылся ли. У меня самого тысячу раз было что "проскальзывает" четкое и однозначное указание. Даешь указание "открыть", а открытия не происходит.
Я сначала расставляю основные действия и когда цепочка складывается в нужном мне русле, обвешиваю проверками (правда есть грешек, частенько эту процедуру опускаю).

Да не обязательно через SendCommand. Кто сказал, что обязательно. Просто никак у меня пока не клеится с Add... методами да как в VBA можно, так и тут можно.
WBScript, это такой VBA, который запускается простым двойным кликом по файлу с расширением *.vbs даже расширение одной только буквой отличается. Ну есть небольшая разница в синтаксисе, но это мелочи.
Supermax вне форума  
 
Непрочитано 08.02.2008, 15:12
#89
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Ну уж не надо, что .Add так уж сложен... Вот, как пример, добавление точки в пространство модели активного документа:
Код:
[Выделить все]
Set objAcad = GetObject(, "AutoCAD.Application")
Set objDoc = objAcad.ActiveDocument
Set objModel = objDoc.ModelSpace
Dim ptCoord(2) As Double
ptCoord(0) = 0.: ptCoord(1) = 16.: ptCoord(2) = 32.
objPoint = objModel.AddPoint(ptCoord)
Ну или короче:
Код:
[Выделить все]
Set objAcad = GetObject(, "AutoCAD.Application")
Dim ptCoord(2) As Double
ptCoord(0) = 0.: ptCoord(1) = 16.: ptCoord(2) = 32.
objPoint = objAcad.ActiveDocument.ModelSpace.AddPoint(ptCoord)
Ну и все остальное аналогично - см. справку по VBA в AutoCAD.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 08.02.2008, 15:22
#90
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Некоторые выводы по случаю прозрения:
Запустить из под Автокада скрипт, в котором будет произведена связь с этим же самым открытым Автокадом можно.
Получать данные от туда в текущий документ Автокада можно.
Теперь надо передавать данные туда из Автокада.
Какой бы СОМ объект выбрать для передачи данных? К сожалению я пока не знаю что возвращает SendCommand в ответ на запуск чтения данных из Автокада. Скорее всего nil. Прочесть я могу только свойства объекта а в Автокаде свободных свойств на сколько я знаю нет. Нужно такое, в которое я могу поместить и список и строку и просто числа.
Kpblc, что подскажешь?
Supermax вне форума  
 
Автор темы   Непрочитано 08.02.2008, 15:30
#91
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Код:
[Выделить все]
Set objAcad = GetObject(, "AutoCAD.Application")
Set objDoc = objAcad.ActiveDocument
Set objModel = objDoc.ModelSpace
Dim ptCoord(2) 
ptCoord(0) = 0.
ptCoord(1) = 16.
ptCoord(2) = 32.
objModel.AddPoint ptCoord
Вот так это на скрипте. только аргумент кушать не хочет в последней строке.
Supermax вне форума  
 
Непрочитано 08.02.2008, 15:36
#92
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Видишь ли, что ты, что товарищ вот здесь, как мне кажется, допускаете одну и ту же логическую ошибку. Вы к AutoCAD'у обращаетесь как к СОМ-серверу, когда требуется, чтобы он был клиентом.
Прошу - ну проанализируй посты с 65 по 79 (примерно). Мы пошли по второму (или какому там?) кругу...
---
Добавлено: в скрипте сделай переменную для результата и аргумент заключи в скобки.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 08.02.2008, 16:13
#93
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


В скрипте некоторые аргументы в скобки не ставятся, а некоторые ставятся. Я и так и так пробовал - не выходит.


http://www.script-coding.info/WSH/WshShell.html

тут это видно. По методам полазь и сам увидишь.

Вообще-то я из под скрипта рисовать ничего не намерен, это в моем случае совершенно не нужно. Копировать объекты из одного када в другой - да, обрабатывать на разных машинах содержащиеся в них файлы - да, а рисовать пусть сам кад и рисует. Лучше Автолиспа для этого просто не существует. НО! Что за фигня? Я нарисовать через командную строку могу, а специальные методы, предназначенные для рисования со стороны не получается запустить. Обидно, однако. Вот и мучаюсь.
Supermax вне форума  
 
Непрочитано 09.02.2008, 00:39
#94
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Цитата:
Копировать объекты из одного када в другой - да
Прекрасно делается и в фоновом режиме, через открытие файла с помощью либо vla-open, ThisDrawing.Application.Documents.Open или, например, ObjectDBX (потом применяется метод vla-CopyObjects и вперед).
Цитата:
НО! Что за фигня? Я нарисовать через командную строку могу, а специальные методы, предназначенные для рисования со стороны не получается запустить. Обидно, однако.
Еще раз повторяю - ты идешь не с той стороны. Либо не так. Возьми любую нормальную IDE (например, Visual Studio 2008, или 2005 - Express Edition, рисуешь нормальный exe и в нем ставишь связь со своим AutoCAD'ом - это будет быстрее и проще в результате).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.02.2008, 14:27
#95
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Дело не в осуществлении какой-то конкретной задачи. Я VBScript пока только начал изучать и пробую всякие его правила и особенности. Наткнулся на передачу методам ADD... массива в виде варианта, да еще и saffearray. Вроде все правильно делаю, однако пишет, что аргумент не соответствует требуемому. Ну обойду я эти ADD... и что? Раз обойду, два обойду, так до старости их обходить? Это я свою озоновую дыру в мозге обхожу. Я чегото не так делаю или недопонимаю, а ты мне советуешь отступиться и не связываться.
Supermax вне форума  
 
Автор темы   Непрочитано 12.02.2008, 17:43
#96
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Вернусь к данной теме про использование СОМ объектов в Автокаде (да простят меня гуру за русское название).
Не знаю почему, но потянуло меня разнообразить свои навыки в программировании и как задачу я поставил сделать меню к макросу Автокада, написанному на лиспе в виде HTML (не люблю рус\лат нажимать) файла.
HTML файлы изобилуют крутой графикой и возможностью оперировать внешними приложениями. Загрузив такое меню, можно весьма сильно расширить свободу действий в самом Автокаде, ведь запуская лисп-макрос вы тем самым загружаете сам Автокад и во многих случаях не имеете возможность приостановиться и что-нибудь изменить в ходе работы самого Автокада.
А в основном, если без напрягов по выдавливанию новых возможностей - графика. Какая графика!
Первая мысль была такая:
Запускаем из под Автокада обозреватель с отключенными органами управления и задаем ему наш файл HTM.
В процессе нажатия кнопки, созданной на странице файла мы обращаемся к открытому Автокаду и там либо рисуем что-то, либо переменную определяем, прописывая в нее номер нажатой кнопки, либо что еще.
НО!
Попытки напрямую из HTM файла сделать getobject и влезть в открытый Автокад ничем не увенчались.

Тогда я решил запускать из под Автокада скрипт-файл, а уже из него страницу HTM. Скрипт-файл *.vbs очень легко общается с открытым Автокадом (вот когда пригодились объекты СОМ самого Автокада). Рисует там все что хочешь, целые лисп выражения может запускать и прочее. Осталось из под скрипта запустить HTM файл. Если это делать тупо - через вызов эксплорера и загрузкой в него заранее сделанного файла - в эксплорере срабатывают чуть ли не все защитные мероприятия по работе с особоопасными объектами. А если открыть эксплорер с about:blank (это когда вместо адреса к страничке Интернета, хотят работать автономно) и создать страницу из под скрипта - все создается и "сигнализация не срабатывает". Хотя когда запускаешь копию страницы сайта - тоже не срабатывает. Разбираюсь вот.

Надо из окна эксплорера, запущенного из под скрипта получить реакцию на нажатие кнопки или строки, короче событие происходящее в самом окне перенести в скрипт, который это окно вызвал. А уж потом, этот скрипт передаст данные в Автокад, Эксель, Ворд и прочие программы.
Supermax вне форума  
 
Автор темы   Непрочитано 14.02.2008, 12:13
#97
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


На сером форуме нашел описание создания СОМ объекта прямо на VBScript или JScript.

http://forum.script-coding.info/viewtopic.php?id=1037

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

Хороший сайт с тегами (это то, что пишется в <...>)

http://www.htmlbook.ru/html/button.html
Supermax вне форума  
 
Автор темы   Непрочитано 20.02.2008, 20:44
#98
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Случилась беда. не хочет мой regsvr32 регистрировать test.wsc, а заодно и все остальные wsc, которые есть на компе. Пошарился по сети и что-то много случаев сбойной работы этой scrobj.dll
Может кто знает почему? Или попробуйте найти у себя любой файл с расширением wsc, типа того, что в предидущем сообщении и попробуйте его зарегистрировать. Может это что-то с моей машиной?
Миниатюры
Нажмите на изображение для увеличения
Название: ошибка.JPG
Просмотров: 128
Размер:	14.7 Кб
ID:	3597  
Supermax вне форума  
 
Автор темы   Непрочитано 20.02.2008, 21:23
#99
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Есть еще один очень любопытный вопрос. Вот есть СОМ объекты. Обращение к СОМ объекту через функцию (vlax-get-or-create-object ".....") возвращает vla-объект. Такой же как и у других объектов. Если сделать реактор на изменение свойства объекта, (а у многих СОМ объектов они есть) сработает ли этот реактор на изменение свойства у СОМ объекта?
Supermax вне форума  
 
Непрочитано 20.02.2008, 22:47
#100
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


К вопросу о СОМ-объектах из-под браузеров: http://inoe.name/novosti/20592-vojjny-brauzerov.html
Цитата:
только в браузере от Microsoft применяются программные компоненты ActiveX, позволяющие запускать из браузера приложения без ведома пользователя. Проблема в том, что у плагианов ActiveX слишком много прав – если хакер отыщет в них лазейку, то ему не составит особого труда проникнуть в операционную систему. Риск высок: согласно двенадцатому отчёту Symantec “Internet Security Report”, 89% пробелов безопасности в браузерных плагинов сводятся к слабым местам в компонентах ActiveX.
Единственным выходом остаётся отключить ActiveX, однако по умолчанию Microsoft этого не делает. Только пользователи Vista находятся в несколько более выгодном положении: новая Windows открывает IE7 в защищённом режиме, который не позволяет запускать программы из браузера. Впрочем, это не значит, что в Vista, можно чувствовать себя совершенно спокойно: из 20 недочетов на данный момент обнаруженных в IE7, Microsoft исправило только 12 – при этом один из оставшихся восьми Secunia расценивает как весьма критичный.
Так что я б капитально задумался на предмет целесообразности продолжения подобных поисков и начал бы искать другие методы.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Объекты СОМ в AutoCAD

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запуск программы из AutoCADа kminas Программирование 19 15.06.2012 13:42
AutoCAD 2005 не открывает бесплатные 3Д объекты LenkA AutoCAD 3 11.02.2009 01:52
Уже работаю в AutoCAD 2006, но нужна книжка чтобы знать все тонкости работы с 2D графикой. Unt0nich Поиск литературы, чертежей, моделей и прочих материалов 17 06.05.2008 17:58
AUTOCAD 2006 Aragorn AutoCAD 14 01.04.2005 00:55
Что нового в AutoCAD 2005 ilka_t AutoCAD 40 19.05.2004 16:48