Тема: Delphi, Lisp и VBA. Обмен данными

Если нужно получить не одно значение, а несколько, то через LASTPROMPT это не получиться. Советую прислушаться к совету ShaggyDoc (2004-01-21 06:56:47). Через системные переменные USERXXX - лучше не надо. Лично я в таких случаях использую второй метод. Т. е. LISP программа выводит результат(-ы) выполнения не в текстовое окно, а записывает их во временный файл. VBA (Delfi) его считывает и вперед (незабывайте убирать за собой мусор).

Re: Delphi, Lisp и VBA. Обмен данными

Читать из командной строки очень ненадежно, нет никакой гарантии, что там будет именно нужный текст.
Работать через файл надо осторожно - учитывать permissions пользователя. Место для обменных файлов надо аккуратно выбирать, не где попало, а например в папке временных файлов Windows или активного пользователя, получая ее каталог системной функцией.
При работе с реестром можно выделить несколько временных ключей в HKCU и гарантированно получать результаты. Работать с реестром умеют все среды. В этом случае можно и "конструировать" имя переменной, то есть делать как в LISP.

Re: Delphi, Lisp и VBA. Обмен данными

> ShaggyDoc
Если вы рекомендуете аккуратно выбираеть место куда и как положить файл из-за пермишена пользователя, то именно из этих соображений нужно подумать использовать регист или нет, у пользователя, возможно не будет достаточных прав...

Re: Delphi, Lisp и VBA. Обмен данными

> Mike
К своему HKCU пользователь всегда имеет доступ. Для того он и придуман

Re: Delphi, Lisp и VBA. Обмен данными

> ShaggyDoc
Вы правы

Re: Delphi, Lisp и VBA. Обмен данными

> ShaggyDoc
Возможно я не прав, но через реестр реально передать одну или несколько переменных, а как быть со списком, они должны быть каким то образом преобразованы в массив?
Или список записывать в реестр поэлементно а потом считывать и преобразовывать в массив?

Re: Delphi, Lisp и VBA. Обмен данными

> Mike
Список и есть одна или несколько переменных. Имеется множество способов записи в реестр, в том числе и списков. Так же как и в INI-файлы. Например
Count=2
Item1=Первый
Item2=Второй;Полвторого;ЧетвертьВторого
Посмотрите реестр, там тьма примеров

Re: Delphi, Lisp и VBA. Обмен данными

Обмен данными можно организовать при помощи Расширенных Записей (XRecord). В документе можно создать расширенные записи, записать в них данные, считать данные, затем удалить эти расширенные записи.

Re: Delphi, Lisp и VBA. Обмен данными

Если излагать проблему упрощенно, то надо как-то отдать значение переменной Lisp наружу в VBA или Delphi. То, есть, например, я написал в Дельфях что-то типа:
acad.SendCommand('(setq a 10)'); , где acad - объект, через который идет связь с Автокадом. Теперь мне надо получить значение этой переменной обратно. Можно это как-то сделать? На самом деле задача состоит в получении имен и путей к файлам текстур, используемым в материалах. Может, есть какой-н. другой

Re: Delphi, Lisp и VBA. Обмен данными

Если я правильно понял, то самое простое (наверное, не самое красивое) решение - сразу после выполнения Вашей команды считать значение системной переменной LASTPROMPT.
Что то вроде acad.GetVariable("lastprompt")

Re: Delphi, Lisp и VBA. Обмен данными

Доступ к переменным LISP, даже глобальным, ни из Delphi, ни из VBA невозможен. Обмен данными возможен только через системные переменные, файлы или реестр.

Re: Delphi, Lisp и VBA. Обмен данными

Спасибо! Вроде получается! Используя lastprompt, забираю из
Автокада строку, которую он мне возращает в ответ на (c:rmat "L"). Все чудно!
Правда, теперь возникла другая проблема: что делать, если Автокад возвращает в  ответ на команду не одну строку, а несколько, например, в моем случае, в ответ на:
(c:rmat "L" "material").
Если брать значение переменной lastprompt, я получаю только
последнюю строку, а их всего три. Как быть? Может есть какой-нибудь флаг, отвечающий за вывод данных в командную строку, чтобы получалась только одна строка?

Re: Delphi, Lisp и VBA. Обмен данными

Возможно вам это поможет:
Переменные автокада:
LOGFILEMODE 0 - запись стека в лог-файл
LOGFILEMODE 1 - отключить запись стека в лог-файл
LOGFILENAME - содержит имя и путь лог-файла

Re: Delphi, Lisp и VBA. Обмен данными

А по-моему через файлы самое то. Ведь чаще всего программы собраны в какой-то мини-комплекс, имеют свою папку и т.д. В ней можно создать что-то типа каталога TMP и вперед.

Re: Delphi, Lisp и VBA. Обмен данными

ВБ из лиспа

call the VBA macro as:
(command "-VBARUN" " MyMacro " "Argument1" "Argument2")
Then in VB in module
Public Param1, Param2 As String
Sub MyMacro()
Param1 = ThisDrawing.Utility.GetString(False)
Param2 = ThisDrawing.Utility.GetString(False)
        'Enter your code here
End Sub
Лисп из ВБ и обратно
(vl-vbarun "startMySub")
(setq lay(getstring))
then in VB
Sub startMySub ()
Userform1.Show
end sub
Private Sub CommandButton1_Click()
ThisDrawing.SendCommand ListBox1.Text & vbCr
Unload me
end sub

Re: Delphi, Lisp и VBA. Обмен данными

[rus]Polzuites vlisp,v kotorom sreda ponimaet vse peremennue , no est' problema so spiskom v spiske (list (list ...))
predvaritel'no neobxodimo sozdat' modul' v VB (primer mogu vyslat')
pri poluchenii spiska iz VB ego nado konvertirovat' (tozhe mogu vyslat')
Soglasen s cadhelp no est' eche varianty[/rus]

 (command "-VBARUN" " MyMacro ")
 (setq listargs   Argument1 Argument2)
 (foreach it listargs
     (command it)
 )

[rus]
Pri etom vazho ,chtob  VB prinjal eto v uslovlennom porjadke i v nuzhnyj tip peremennoj[/rus]