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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > DwgRuLispLib: Функция выполнения vla-sendCommand из другого процесса

DwgRuLispLib: Функция выполнения vla-sendCommand из другого процесса

Ответ
Поиск в этой теме
Непрочитано 10.10.2010, 13:12 #1
DwgRuLispLib: Функция выполнения vla-sendCommand из другого процесса
Supermax
 
Руководитель фирмы
 
Москва
Регистрация: 28.03.2007
Сообщений: 1,831

Код:
[Выделить все]
;;; ************************************************************************
;;; * Библиотека DWGruLispLib Copyright ©2010  DWGru Programmers Group
;;; *
;;; * _dwgru-sm-vla-sendCommand
;;; *
;;; * 10/10/2010 Версия 01 Андрей Лазебный   (Supermax)
;;; ************************************************************************
;;; Отправляет в заранее открытый документ в командную строку выражение
;;;  Параметры:
;;;            name-object - имя открытого файла
;;;            data - данные передаваемые в командную строку обработанные для VBS
;;;  Возврат:
;;;  nil
;;;  Пример использования
;;;  (_dwgru-sm-vla-sendCommand "gp1.dwg" "\"(load \"\"D:\\\\Программирование\\\\mip2.lsp\"\") \"")
;;;  Увы, пока так.

(defun _dwgru-sm-vla-sendCommand (name-object data / name-object Fdcl dsl0055) 
;записываем имя временного файла
(setq Fdcl "Sel555.vbs")
;Создаем путь к временному файлу
(setq Fdcl (strcat (VL-FILENAME-DIRECTORY(vl-filename-mktemp Fdcl)) "\\" Fdcl))   
(vl-file-delete Fdcl)  ;Если есть такой файл, то его убить, поскольку он каждый раз создается с 0.

(setq dsl0055 (open Fdcl "w")) ;Открываем и заполняем файл Sel555.vbs 
(write-line "Set AutoCAD = GetObject(, \"AutoCAD.Application\")" dsl0055)
(write-line "Set Documents = AutoCAD.Documents" dsl0055)
(write-line "Set ActiveDocument = AutoCAD.ActiveDocument" dsl0055)
(write-line (strcat "Set Document = Documents.Item(" (vl-prin1-to-string name-object) ")") dsl0055)
(write-line "WScript.Sleep 10" dsl0055)
(write-line (strcat "Document.SendCommand " data) dsl0055)
(write-line "ActiveDocument.Activate" dsl0055)
(close dsl0055)
;Запускаем скрипт.
(setq script (DwgRu-WScript-Exec Fdcl ""))
(princ nil)
)
Как только я пойму как избавится от геморроя с кавычками и слешами, сразу переделаю на безфайловый способ через ScriptControl.
Просмотров: 21520
 
Непрочитано 10.10.2010, 13:33
#2
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Я вот не пойму... Зачем такие танцы с бубнами?.. Разве через COM нельзя добиться того же результата?
gomer вне форума  
 
Автор темы   Непрочитано 10.10.2010, 13:39
#3
Supermax

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


Так это через COM и тулится.
См. функцию DwgRu-WScript-Exec

Последний раз редактировалось Supermax, 10.10.2010 в 13:44.
Supermax вне форума  
 
Непрочитано 10.10.2010, 13:53
#4
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Вопрос в том, что вы хотите сделать в документе... в большинстве случаев от vla-SendCommand вообще можно отказаться...
Не стоит также забывать о переменной LISPINIT
gomer вне форума  
 
Автор темы   Непрочитано 10.10.2010, 14:40
#5
Supermax

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


Кто спорит? Но вот незадача. Я открыл два файла (или больше) и мне надо из главного (для меня) файла, программно, и по нескольку раз переходить в те, другие файлы, там что-то делать и возвращаться назад, да еще чтобы в основном файле программа дальше шла.
С одноразовым запуском лиспа при открытии файла я проблему решил, а если надо несколько раз туда лезть? Что, каждый раз закрывать и открывать документ?
Программый код, запускаемый там, в других файлах, может быть очень большой и без использования лисп-файла тут может и не обойтись, да вот запустить его через существующую vla-SendCommand не получится ни в какой версии када (до 2010 проверено). Пока vla-SendCommand работает только в активном и только для активного документа.
Как запускать лисп-файлы без обращения к командной строке я увы не знаю. Может ты знаешь?
В документе я хочу делать все, включая загрузку лиспа, обработку переменных, использования команд, модификацию DXF кодов и т.д.

Не знаю у кого LISPINIT работает, а у меня что 0, что 1 - переменные не сохраняются при переходе в другой файл.

Последний раз редактировалось Supermax, 10.10.2010 в 14:50.
Supermax вне форума  
 
Непрочитано 10.10.2010, 14:55
#6
Кулик Алексей aka kpblc
Moderator

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


Любое (подчеркиваю - любое!) создание дополнительных указателей без крайней на то необходимости грозит подвесить AutoCAD. Я уже молчу про то, что SendCommand вообще желательно использовать для 2-3 команд, не больше (типа _.-insert и _.change)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.10.2010, 16:02
#7
Supermax

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


И ето хыто мене говорыт?! Человек, который для того, чтобы сделать фактически то же самое открывает DWG файлы через ... ObjectDBX!!!
А там и то нельзя и се, утомился пока вникал.
Какую-то задрипанную строчку в комстроку соседнего файла послать и такие фигуры высшего пилотажа надо делать!
Я ничего не имею ни против ObjectDBX, ни против других COM, наоборот, все под себя сгребаю, но товарищи!, ведь это же такой облом с обработкой многодокументных проектов!

Функция еще не совсем готова. Вот если я заставлю ее принимать аргументы как настоящая vla-SendCommand делает, то я вообще сделаю все через ScriptControl без всяких там файлов vbs.
Supermax вне форума  
 
Непрочитано 10.10.2010, 16:14
#8
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Я как-то делал программу для bricscad очистки файлов в каталоге: создал новый экземпляр в нем все пооткрывал, почистил, сохранил и закрыл... без всяких vla-SendCommand...
Вообще-то давно уже существуют программы для запуска скриптов в нескольких файлах
gomer вне форума  
 
Автор темы   Непрочитано 10.10.2010, 16:21
#9
Supermax

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


gomer, в других кадах и java работает, и коды открыты, и люди пока прислушиваются к проблемам юзеров.
А в Автокаде все пока не так.
Вот взять бы и починить эту vla-SendCommand, так нет, еще лет сто будем ждать.
А на net или arx никто не хочет сделать аналогичное и сюда выложить.
Supermax вне форума  
 
Непрочитано 10.10.2010, 19:07
#10
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
И ето хыто мене говорыт?! Человек, который для того, чтобы сделать фактически то же самое открывает DWG файлы через ... ObjectDBX!!!
"Этот человек" четко понимает: кесарю - кесарево, слесарю - слесарево. Интерактивность можно и нужно реализовывать только в текущем документе, остальное - от лукавого. Хочешь головняка? Вперед, ни мешать, ни помогать желания уже нет.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.10.2010, 19:48
#11
Supermax

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


kpblc, ты не обижайся, я ж с юмором. Твою статью читал, хвалю, правда там зарегистрироваться не вижу как. И я совсем не умоляю всякие разные другие способы. Просто меня зло взяло, что метод есть, но не пашет как надо. Из других процессов все пашет, а из собственного, родного, автокадовского - не хочет.
Я взял и подумал, а не выручит меня и на этот раз vbs и выручил.
Теперь, если поколдовать с кавычками, все прекрасно работает.
Цитата:
... кесарю - кесарево, слесарю - слесарево...
это типа крутым программистам сие можно использовать, а чайникам и знать даже не позволено? Скорее всего ты имел в виду использование, но для других целей? А каких? И почему ты против такого способа?
Ведь ObjectDBX не может запускать и выполнять лисп программы, я уже не говорю о командах.
Цитата:
Интерактивность можно и нужно реализовывать только в текущем документе, остальное - от лукавого.
А тут интерактивности нет. Именно из-за vla-SendCommand. Как только она обращается к документу, тот автоматически становится активным, а в предидущем останавливается исполнение лиспа.
Я пробежал весь код, обеих функций там все одно задругим зацеплено, можешь проверить. Последним шагом в скрипте - установление активности в первом файле.
Я целую тучу вариантов попробовал, перед тем как сюда выложить. Все просто летает!
Запускаю длинный лисп, возвращаюсь назад и опять туда-же запускаюеще раз. - Как часы! Никакого головняка.
А если в ScriptControl запихнуть, так еще и значения возвращать будет!
Разве это не стоит внимания?
Supermax вне форума  
 
Непрочитано 10.10.2010, 20:54
#12
Кулик Алексей aka kpblc
Moderator

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


Я имел в виду то, что, как правило, нет никакой необходимости выполнять что-либо в файле через SendCommand. То, что SendCommand надо использовать в том случае, если без него не обойтись. А также то, что SendCommand надо использовать только в текущем файле. Обилие системных переменных, дополнительных arx / dll / lsp / dvb / fas / vlx файлов может твое решение убить напрочь. Я из принципа напишу автозагружаемый лисп, который будет блокировать системную переменную SDI, всегда выставляя ее в 1. И какие будут твои действия? ObjectDBX (только что специально проверил на AutoCAD 2011 64bit) такое обрабатывает не чихнув.
А случаев необходимости использования SendCommand на самом деле 2-3, не больше. Ни одного железного аргумента в пользу такого решения я не видел. И вряд ли увижу.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.10.2010, 21:55
#13
Supermax

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


Вот такие вот пироги...
Цитата:
Некоторые команды и функции недоступны при работе в режиме интерфейса одного документа.
ВНССЫЛКИ Палитра внешних ссылок отключена, пока SDI не будет вновь установлена в значение 0 (ноль).
Как ты не поймешь, не SendCommand нужен, а то, что он дает. Нужна загрузка лисп-файлов! DXF коды надо лопатить (пока еще надо).
Знаешь когда надо ObjectDBX? Когда надо в модели мегов на сто что-то сделать, а она грузит видеокарту и время из-за этого жрет часы целые. Вот тут да, согласен и на частичную кастрацию командных методов и даже arx готов изучать. А когда у тебя модель и в ней штук 500 внешних ссылок, а тебе надо одну за другой открыть и спецификацию посчитать, вот тогда твой ObjectDBX тихо курит в сторонке. Хотя наверное это и есть те пару случаев. Так у меня как раз один из них.

Последний раз редактировалось Supermax, 10.10.2010 в 22:10.
Supermax вне форума  
 
Непрочитано 10.10.2010, 21:59
#14
Кулик Алексей aka kpblc
Moderator

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


Доступ к палитре внешних ссылок и доступ к механизму внешних ссылок суть вещи разные. Не путай теплое с мягким.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.10.2010, 11:22
#15
Supermax

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


Перевел код на использование "MSScriptControl.ScriptControl", но оказалось, что запуск "MSScriptControl.ScriptControl" со скриптом внутри в текущем документе ничего не дает. Ход выполнения скрипта внутри "MSScriptControl.ScriptControl" также прерывается на обращении SendCommand и аргумент этого метода попадает в командную строку другого документа только при втором обращении, а аргумент второго обращения при третьем и т.д.
Сделал вывод - "MSScriptControl.ScriptControl" должен работать в другом процессе (естественно дочернем).
Осталось понять как его туда впихнуть не трогая винчестер, то-есть не делая файлов vbs?
Supermax вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > DwgRuLispLib: Функция выполнения vla-sendCommand из другого процесса

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DwgRuLispLib: Функция открытия диалога Open\Save As файла (файлов) Supermax Библиотека функций 20 14.03.2018 10:05
DwgRuLispLib: Функция поиска в списке строки по маске Supermax Библиотека функций 1 14.01.2008 01:58