|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
|
||||
Ну вот, я уже здоров.
Хочу высказать пару своих мыслей по поводу применения «внешних» по отношению к Автокаду языков. Под понятием «внешние» я подразумеваю те языки, которых Автокад не понимает. Например языки 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. Все это будет видно. Код:
Что это дает? Ну возьмем длительный и сложный процесс обработки чертежа, когда этот процесс то и дело прерывается найденными ошибками. Их надо править. Зачастую с применением макросов. Что, каждый раз процесс обработки запускать заново? А если он попутно на каждом этапе документы варганит? Их что, стирать каждый раз? Кто-нибудь может в одном и том же документе запустить два Лиспа одновременно? То-то. А тут лепота. Основной сценарий, даже просто директивы запуска лисп блоков пишется на скрипте, а уж в Автокаде происходит само представление. Никто никому не мешает. Через скрипт можно организовать совместную работу над одним документом. Функция 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" Последний раз редактировалось Supermax, 07.02.2008 в 16:47. |
||||
|
||||
Вот тут:
http://subscribe.ru/archive/comp.sof.../18004013.html Я нашел про AutoCAD.Drawing.16 Цитата:
Я не знаю, от куда взяли эту информацию они, но похоже, очень похоже на правду. Больше поисковик ничего не нашел, увы. |
||||
|
|||||||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844
|
Ну ни себе фига ты отдохнул :) Я только с пятого или шестого раза смог все осилить. Ща я тут тоже развернусь в отместку ;) Чур, стоптанными тапками не кидаться! ;)
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Код:
Цитата:
> #82: Что "не инициализируя сам AutoCAD" - так это наглая ложь. AutoCAD все равно вызывается (можно посмотреть через список процессов). Вдобавок неизвестно, какой профиль и какая версия будет вызвана. А это чревато: в автозагрузке профиля может сидеть неизвестно что, загрузка AutoCAD'a может занимать немеряно времени. Выполнение метода .Save для текущего документа тоже не будет давать 100% гарантированного результата - формат файла заранее неизвестен, неизвестно, сколько там мусора будет ну и тому подобное. Если честно, я сам иногда грешу подобным подходом (то есть из-под AutoCAD'a вызвать exe, внутри ехе обратиться через СОМ к активному AutoCAD'у и его документу, чего-то сделать и закрыть ехе), но таких ситуаций у меня раз-два и обчелся.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
||||||||
|
||||
Цитата:
Запуск скрипта -> скрипт и работа в нем без AutoCAD'a ->запуск AutoCAD'a скриптом -> открытие документа AutoCAD'a -> работа в документе -> работа в скрипте -> работа в документе ... -> работа в скрипте - сохранение и закрытие документа -> очистка мусора -> закрытие скрипта. Можно остановить работу скрипта без прекращения работы в AutoCAD-е. А вообще-то работы в скрипте как таковой и нет. Если скрипт запускает в каде какой-то лисп, то вот этот лисп и работает, а скрипт так, дирижер-сценарист. Не надо забывать, что скрипт может открыть кады на разных машинах и предоставлять сидящим за ними пользователям контроль за частью общего процесса. Очень интересно узнать, как ты обращаешся к активному каду и открытому в нем документу? |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844
|
Так я же код показал... Я не использую скрипты (в силу элементарного незнания), а для "нормальных" языков и такого подхода более чем достаточно.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Супер! Если выкинуть твои попытки открыть новый сеанс через CreateObject и проверки с радостными сообщениями, то код доступа в уже открытый кад на скрипте выглядит так:
Код:
В итоге мы имеем скрипт, который вмешивается в работу AutoCAD-a и в открытом документе рисует что-то свое. Код:
Последний раз редактировалось Supermax, 08.02.2008 в 13:04. |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844
|
Я-то пойму код. Я другого понять не могу - а на фига рисовать через SendCommand?
И вот еще - а если во время выполнения скрипта (до вызова GetObject) AutoCAD грохнулся? Сам или ему помогли - неважно. Что и в каком виде ты получишь - слабо предсказуемо...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Да я проверки выкинул не принципиально! Нужны они, нужны. Просто есть ключевые действия, а есть сопутствующие. Этих "сопутствующих" в десятки раз больше и основной код в них тонет просто. Ясен пень, что дав указание открыть надо проверить а открылся ли. У меня самого тысячу раз было что "проскальзывает" четкое и однозначное указание. Даешь указание "открыть", а открытия не происходит.
Я сначала расставляю основные действия и когда цепочка складывается в нужном мне русле, обвешиваю проверками (правда есть грешек, частенько эту процедуру опускаю). Да не обязательно через SendCommand. Кто сказал, что обязательно. Просто никак у меня пока не клеится с Add... методами да как в VBA можно, так и тут можно. WBScript, это такой VBA, который запускается простым двойным кликом по файлу с расширением *.vbs даже расширение одной только буквой отличается. Ну есть небольшая разница в синтаксисе, но это мелочи. |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844
|
Ну уж не надо, что .Add так уж сложен... Вот, как пример, добавление точки в пространство модели активного документа:
Код:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Некоторые выводы по случаю прозрения:
Запустить из под Автокада скрипт, в котором будет произведена связь с этим же самым открытым Автокадом можно. Получать данные от туда в текущий документ Автокада можно. Теперь надо передавать данные туда из Автокада. Какой бы СОМ объект выбрать для передачи данных? К сожалению я пока не знаю что возвращает SendCommand в ответ на запуск чтения данных из Автокада. Скорее всего nil. Прочесть я могу только свойства объекта а в Автокаде свободных свойств на сколько я знаю нет. Нужно такое, в которое я могу поместить и список и строку и просто числа. Kpblc, что подскажешь? |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844
|
Видишь ли, что ты, что товарищ вот здесь, как мне кажется, допускаете одну и ту же логическую ошибку. Вы к AutoCAD'у обращаетесь как к СОМ-серверу, когда требуется, чтобы он был клиентом.
Прошу - ну проанализируй посты с 65 по 79 (примерно). Мы пошли по второму (или какому там?) кругу... --- Добавлено: в скрипте сделай переменную для результата и аргумент заключи в скобки.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
В скрипте некоторые аргументы в скобки не ставятся, а некоторые ставятся. Я и так и так пробовал - не выходит.
http://www.script-coding.info/WSH/WshShell.html тут это видно. По методам полазь и сам увидишь. Вообще-то я из под скрипта рисовать ничего не намерен, это в моем случае совершенно не нужно. Копировать объекты из одного када в другой - да, обрабатывать на разных машинах содержащиеся в них файлы - да, а рисовать пусть сам кад и рисует. Лучше Автолиспа для этого просто не существует. НО! Что за фигня? Я нарисовать через командную строку могу, а специальные методы, предназначенные для рисования со стороны не получается запустить. Обидно, однако. Вот и мучаюсь. |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844
|
Цитата:
Цитата:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Дело не в осуществлении какой-то конкретной задачи. Я VBScript пока только начал изучать и пробую всякие его правила и особенности. Наткнулся на передачу методам ADD... массива в виде варианта, да еще и saffearray. Вроде все правильно делаю, однако пишет, что аргумент не соответствует требуемому. Ну обойду я эти ADD... и что? Раз обойду, два обойду, так до старости их обходить? Это я свою озоновую дыру в мозге обхожу. Я чегото не так делаю или недопонимаю, а ты мне советуешь отступиться и не связываться.
|
||||
|
||||
Вернусь к данной теме про использование СОМ объектов в Автокаде (да простят меня гуру за русское название).
Не знаю почему, но потянуло меня разнообразить свои навыки в программировании и как задачу я поставил сделать меню к макросу Автокада, написанному на лиспе в виде HTML (не люблю рус\лат нажимать) файла. HTML файлы изобилуют крутой графикой и возможностью оперировать внешними приложениями. Загрузив такое меню, можно весьма сильно расширить свободу действий в самом Автокаде, ведь запуская лисп-макрос вы тем самым загружаете сам Автокад и во многих случаях не имеете возможность приостановиться и что-нибудь изменить в ходе работы самого Автокада. А в основном, если без напрягов по выдавливанию новых возможностей - графика. Какая графика! Первая мысль была такая: Запускаем из под Автокада обозреватель с отключенными органами управления и задаем ему наш файл HTM. В процессе нажатия кнопки, созданной на странице файла мы обращаемся к открытому Автокаду и там либо рисуем что-то, либо переменную определяем, прописывая в нее номер нажатой кнопки, либо что еще. НО! Попытки напрямую из HTM файла сделать getobject и влезть в открытый Автокад ничем не увенчались. Тогда я решил запускать из под Автокада скрипт-файл, а уже из него страницу HTM. Скрипт-файл *.vbs очень легко общается с открытым Автокадом (вот когда пригодились объекты СОМ самого Автокада). Рисует там все что хочешь, целые лисп выражения может запускать и прочее. Осталось из под скрипта запустить HTM файл. Если это делать тупо - через вызов эксплорера и загрузкой в него заранее сделанного файла - в эксплорере срабатывают чуть ли не все защитные мероприятия по работе с особоопасными объектами. А если открыть эксплорер с about:blank (это когда вместо адреса к страничке Интернета, хотят работать автономно) и создать страницу из под скрипта - все создается и "сигнализация не срабатывает". Хотя когда запускаешь копию страницы сайта - тоже не срабатывает. Разбираюсь вот. Надо из окна эксплорера, запущенного из под скрипта получить реакцию на нажатие кнопки или строки, короче событие происходящее в самом окне перенести в скрипт, который это окно вызвал. А уж потом, этот скрипт передаст данные в Автокад, Эксель, Ворд и прочие программы. |
||||
|
||||
На сером форуме нашел описание создания СОМ объекта прямо на VBScript или JScript.
http://forum.script-coding.info/viewtopic.php?id=1037 Сакажу честно, "все гениальное - просто!" не я придумал. Хороший сайт с тегами (это то, что пишется в <...>) http://www.htmlbook.ru/html/button.html |
||||
|
||||
Случилась беда. не хочет мой regsvr32 регистрировать test.wsc, а заодно и все остальные wsc, которые есть на компе. Пошарился по сети и что-то много случаев сбойной работы этой scrobj.dll
Может кто знает почему? Или попробуйте найти у себя любой файл с расширением wsc, типа того, что в предидущем сообщении и попробуйте его зарегистрировать. Может это что-то с моей машиной? |
||||
|
||||
Есть еще один очень любопытный вопрос. Вот есть СОМ объекты. Обращение к СОМ объекту через функцию (vlax-get-or-create-object ".....") возвращает vla-объект. Такой же как и у других объектов. Если сделать реактор на изменение свойства объекта, (а у многих СОМ объектов они есть) сработает ли этот реактор на изменение свойства у СОМ объекта?
|
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,844
|
К вопросу о СОМ-объектах из-под браузеров: http://inoe.name/novosti/20592-vojjny-brauzerov.html
Цитата:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
запуск программы из 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 |