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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Функции AutoLISP из ... DLL!

Функции AutoLISP из ... DLL!

Ответ
Поиск в этой теме
Непрочитано 09.12.2008, 16:22 #1
Функции AutoLISP из ... DLL!
Supermax
 
Руководитель фирмы
 
Москва
Регистрация: 28.03.2007
Сообщений: 1,831

Что такое *.dll файлы? - правильно, библиотеки. Библиотеки чего? - функций в первую очередь, ну и СОМ объектов тоже. Речь пойдет о функциях.
А можно ли держать в DLL-файлах функции AutoLISP-a? - МОЖНО!

Каждую функцию можно вызывать по имени и загружать в Автокад. Более того, ее можно увидеть!
Тем, кто прячет свои коды это ни к чему, а вот для других - очень даже к чему.

Сейчас я вас познакомлю с одним очень способным человеком, который реализовал эту, мою бредовую идею. И посмотрим, что из этого вышло.

Человек этот YMP модератор Серого форума. Это он сделал СОМ "DynamicWrapperX" и Parser_AutoLISP2.js большая часть заслуг его (мои только идеи и код на AutoLISP-e). Вы о нем еще услышите.

Но продолжим.

Для начала, устанавливаем DynamicWrapperX
http://forum.script-coding.info/viewtopic.php?id=2214

Код:
[Выделить все]
;создаем объект DynamicWrapperX
(setq DX (vlax-get-or-create-object "DynamicWrapperX"))

;Берем pltools1.dll и кладем куда угодно. Регистрировать не надо.

;Импортируем из нашей DLL-ки под названием pltools1.dll две единственные ее функции имена которых составные из 
;имени DLL и наименования функции GetList_pltools1 и GetFunc_pltools1. Эти функции создаются автоматически при 
;компилировании DLL.
(vlax-invoke-method DX "Register" "C:\\Строительство\\Макросы\\Winapi\\pltools1.dll" "GetList_pltools1" "r=s")
(vlax-invoke-method DX "Register" "C:\\Строительство\\Макросы\\Winapi\\pltools1.dll" "GetFunc_pltools1" "i=s" "r=s")
;Путь к DLL указываете свой.

;GetList_pltools1l - показывает список имен всех функций, заключенных в DLL. Аргументов не имеет
;GetFunc_pltools1 - вызывает из test1.dll нужную функцию. Аргумент - имя функции.
;Смотрим содержимое pltools1.dll
Код:
[Выделить все]
(setq Str1 (vlax-invoke-method DX "GetList_pltools1"))
(alert Str1)




Добываем, скажем известную многим функцию, производства а-ля VVA pl:conv-ent-to-ename

Код:
[Выделить все]
(setq Str1 (vlax-invoke-method DX "GetFunc_pltools1" "pl:conv-ent-to-ename"))
Читаем, что там в нутри

Код:


Запускаем функцию, полученную из DLL

Код:
[Выделить все]
(vla-SendCommand 
    (vla-get-ActiveDocument (vlax-get-acad-object)) 
Str1)
Все остальные функции точно так же вызываются и запускаются.

Есть некоторые правила, о которых я вам расскажу в следующем моем сообщении.

Миниатюры
Нажмите на изображение для увеличения
Название: Список функций.JPG
Просмотров: 1220
Размер:	11.4 Кб
ID:	13287  Нажмите на изображение для увеличения
Название: Функция pl-conv-ent-to-ename.JPG
Просмотров: 1234
Размер:	58.3 Кб
ID:	13289  

Вложения
Тип файла: rar pltools1.rar (3.0 Кб, 133 просмотров)


Последний раз редактировалось Supermax, 12.12.2008 в 10:31.
Просмотров: 8153
 
Непрочитано 09.12.2008, 17:15
#2
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Уже запасся попкорном. Где продолжение?
Александр Ривилис вне форума  
 
Непрочитано 09.12.2008, 17:44
#3
Кулик Алексей aka kpblc
Moderator

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


Supermax, я уже не знаю, чему больше удивляться - твоей работоспособности или твоей неинформированности. Уже не раз и не два обсуждалась тема передачи данных VB(A)<->LISP и вызова lisp-функций из-под другого языка. vlax.cls решение называется. И на dwg.ru оно выкладывалось
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.12.2008, 20:16
#4
Supermax

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


Для того, чтобы функции или процедуры AutoLISP-a попали в DLL-файл, надо привести текст файла *.lsp в соответствующий вид.

1. Перед началом функции или процедуры и по окончании ее поставить метку. Какую - скажу позже.
2. Заключить все комментарии, расположенные за пределами лисп-выражений в пустой код, напирмер (setq a ...комментарий ... nil)
Дело в том, что попав в командную строку признак комментария ; не срабатывает, если он не в теле лисп-выражения. Все слова комментариев, не включенные в тело кода понимаются как команды и Автокад выдает череду ошибок, пока не доберется до открывающих скобок.
В общем нельзя без кода запихивать в DLL комментарии.

Скачать вот от сюда http://www.jorgon.freeserve.co.uk/index.htm
GoAsm.exe
GoLink.exe.
GoRC.exe.

Это компилятор

Распаковать в одну папку. Там несколько одинаковых файлов в каждом архиве - нажимать при распаковке либо "заменить", либо "пропустить".

Зайти Меню "Пуск" --> Панель управления --> Система --> Вкладка "Дополнительно" --> Кнпка "Переменные среды" --> Окно "Системные переменные" -> Строка "Path"

Выделить строку "Path" и нажать кнопку "Изменить".
Поставить в конце точку с запятой и добавить путь к папке, куда вы распаковали компилятор.

Нажать Ok.

Теперь дальше:

Есть такой файл, называется "Парсер_AutoLISP.js", написанный на языке JScript. Он приводит ваш *.lsp файл в вид, который будет воспринматься компилятором и запускает оного. В результате вы получаете файл *.dll с таким именем, какое имя вашего *.lsp файла.

Делается это так:
Берете файл *.lsp и тащите его мышкой на значек файла Парсер_AutoLISP.js если все зер гуд, появляется сообщение, что файл скомпилирован и в этой же папке появляется dll-файл.

Теперь про метки:

Если открыть файл Парсер_AutoLISP.js блокнотом, то первые две строки
Код:
[Выделить все]
FuncStartLabel = ";start";
FuncEndLabel = ";end";
Это метки начала и конца записи
;start - начало
;end - конец
Можете сюда записать любой вид меток, какой захотите. Можно несколькими словами.

Далее:

Метки выглядят так:
;start имя_функции_или_процедуры далее, до конца строки что угодно.
.
.
.тело функции или процедуры
.
.
;end имя_функции_или_процедуры далее, до конца строки что угодно.

Имя функции или процедуры одним словом!
При компиляции вся строка с метками уничтожается.

То имя функции или процедуры, которое вы вставили в метку будет фигурировать в списке функций или процедур файла DLL.
Вложения
Тип файла: rar Parser_AutoLISP2.rar (1.4 Кб, 121 просмотров)
Supermax вне форума  
 
Автор темы   Непрочитано 09.12.2008, 20:37
#5
Supermax

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


Вот теперь можно и пофлудить.
VVA, я тут твои функции в библиотеку запихнул, для пробы. Пока впихивал, кучу ошибок нашел, чисто оформительского харрактера. Я тебе, если нужно потом покажу. Эта DLL-ка так, для пробы. Можешь попробовать свою сделать.

Kpblc, теперь, я надеюсь, ты разобрался о чем идет речь? Жду дальнейших комментариев.

Ну и от себя. Зачем мы с YMP это затеяли? - Ну, в VBScripte и JScripte библиотек функций и процедур нет, вот теперь есть. Заодно и для других языков сгодится, в частности для AutoLISP-a.
С одной стороны код открыт и все комментарии к нему вместе с ним, с другой стороны, можно отдельные функции вызывать и не втемную использовать функции, а понимать, что и как они делают.

Размер *.dll практически равен размеру файла *.lsp из которого эта DLL скомпилирована. Текст-то в открытом виде там содержится.

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

Последний раз редактировалось Supermax, 11.12.2008 в 23:14.
Supermax вне форума  
 
Непрочитано 09.12.2008, 21:03
#6
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


>>Supermax
запихнули лисп в ресурс dll? нафиг это надо?
zamtmn вне форума  
 
Непрочитано 09.12.2008, 21:51
#7
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


А просто загружать lisp-файл с нужными функциями что мешает?
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Автор темы   Непрочитано 10.12.2008, 09:27
#8
Supermax

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


Цитата:
...запихнули лисп в ресурс dll? нафиг это надо?
А-А-А! УХИ! Ухи мои, ухи!! - Поздно батя, закомпоссировали.

Обо всем я уже написал выше. И про "нафиг это надо?", и про "А просто загружать lisp-файл с нужными функциями что мешает?".

Цитата:
Ну и от себя. Зачем мы с YMP это затеяли? - Ну, в VBScripte и JScripte библиотек функций и процедур нет, вот теперь есть. Заодно и для других языков сгодится, в частности для AutoLISP-a.
С одной стороны код открыт и все комментарии к нему вместе с ним, с другой стороны, можно отдельные функции вызывать и не втемную использовать функции, а понимать, что и как они делают.
Добавлю. Ранее, когда не было СОМ DynamicWrapperX, функции библиотек, их настоящие функции, я имею в виду, были не доступны из AutoLISP. Теперь доступны и весьма легко. Теперь их можно использовать и тем самым весьма сильно расширить горизонт своих возможностей. В состав DLL могут входить функции низкого уровня и довески к ним, на AutoLISP-e. Тандем такой. Более того, сейчас запуск функции низкого уровня порождает только возврат строки с телом лиспа, а на самом деле, запуск функции низкого уровня должен делать полезное дело в недрах компа и возвращать тело лиспа нужного содержания.

В DLL можно хранить библиотеку функций на таких скриптовых языках, как VBScript, Jscript и другие и использовать эти функции через СОМ объект MSScriptControl.ScriptControl.

Лично мне, ползать по библиотечным Лисп-файлам в поисках нужной функции, где не почитав ее хелп и не посмотрев ей в глаза, сам не знаешь, нужна она тебе или нет, жутко не нравится. Загружать все скопом, тоже дурость. Это сейчас у вас одна библиотека, а завтра будет 10. В одной есть одно, в другой - другое и т.д. Все загружать?
Supermax вне форума  
 
Непрочитано 10.12.2008, 11:35
#9
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Цитата:
Лично мне, ползать по библиотечным Лисп-файлам в поисках нужной функции, где не почитав ее хелп и не посмотрев ей в глаза, сам не знаешь, нужна она тебе или нет, жутко не нравится...
Ну по DLL оно куда приятне ползать. Там все виднее. Достаточно открыть DLL в блокноте и смотри себе на здоровье. Да и подправить, ежели чего, прям мигом можно тут же.
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Непрочитано 10.12.2008, 11:59
#10
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


конечно каждый "№;%: как он хочет, но таких извращенцев как Supermax еще поискать надо)))
zamtmn вне форума  
 
Автор темы   Непрочитано 10.12.2008, 13:48
#11
Supermax

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


А это специально, для таких, кто подправить хочет. Вот возьми, отправь содержимое на princ to file и редактируй, аж до посинения. А чужое не надо редактировать.

Вообще, у этого "извращения" есть еще один момент. Если запустить блокнот из сценария, куда это "извращение" вставлено, то можно, по горячей клавише его вызывать, нужную DLL выбирать, из нее нужную функцию (предварительно ее разглядев в MsgBox-e) и в блокнот, где курсор мигает, вставлять. Я это, дополнительное "извращение" ОБЯЗАТЕЛЬНО сварганю.
Supermax вне форума  
 
Автор темы   Непрочитано 10.12.2008, 13:57
#12
Supermax

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


Кстати о птичках! Можно ведь и не блокнот, а что угодно! Вставлять то будет в текущее окно! Да хоть в чат, да хоть в любой редактор сценариев, в том числе и в Автолисповский.

Какие мне идеи приходят в голову во время дискусий!

Давайте еще, подкиньте пару а-йа-яев.
Supermax вне форума  
 
Непрочитано 10.12.2008, 15:13
#13
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Цитата:
Я это, дополнительное "извращение" ОБЯЗАТЕЛЬНО сварганю.
Лучше фирмой поруководи лишний часок-другой. А то тут кризис кругом финансовый , сам знаешь...
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Автор темы   Непрочитано 10.12.2008, 15:59
#14
Supermax

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


Да ну ее! У меня штат - это я сам. В данный момент, я (правое полушарие) выполняю поручение моего босса (левое полушарие), разрабатываю новое программное обеспечение (за деньги, разумеется).
Supermax вне форума  
 
Непрочитано 10.12.2008, 18:49
#15
Скулачёв А.

конструктор
 
Регистрация: 29.08.2007
Москва
Сообщений: 55


Цитата:
Сообщение от Supermax Посмотреть сообщение
В данный момент, я (правое полушарие) выполняю поручение моего босса (левое полушарие), разрабатываю новое программное обеспечение (за деньги, разумеется).
Игры разума Поосторожнее с этими играми.
__________________
Продумано до мелочей
Скулачёв А. вне форума  
 
Непрочитано 25.06.2010, 21:27
#16
Павел Котелевец

проектирование
 
Регистрация: 02.08.2006
Ухта
Сообщений: 32


Надеюсь, эти dll можно запускать в AutoCAD LT
Если так, то это просто МЕГА
*тестит*
Павел Котелевец вне форума  
 
Непрочитано 25.06.2010, 21:58
#17
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


>>Надеюсь, эти dll можно запускать в AutoCAD LT
не надейтесь
zamtmn вне форума  
 
Непрочитано 25.06.2010, 22:09
#18
Павел Котелевец

проектирование
 
Регистрация: 02.08.2006
Ухта
Сообщений: 32


хм... как же быть? LT-Expander закрылся так некстати...
Павел Котелевец вне форума  
 
Непрочитано 25.06.2010, 23:10
#19
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


скорее всего както так: http://forum.dwg.ru/showthread.php?t=39894
zamtmn вне форума  
 
Непрочитано 26.06.2010, 01:18
#20
Павел Котелевец

проектирование
 
Регистрация: 02.08.2006
Ухта
Сообщений: 32


хм... дешёвые китайские подделки? ))
лазил, трогал, примерял...
но ведь это всё далеко не альтернатива.
Павел Котелевец вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Функции AutoLISP из ... DLL!

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать функции (getkword) Список ключевых слов из списка? Kostinok Программирование 31 31.05.2012 13:08
Предложение: Готовые функции Apelsinov Библиотека функций 170 27.06.2010 23:51
Вызов функций Windows API из AutoLISP Supermax LISP 47 18.12.2008 12:13
Функции в AutoLISP Briz06 LISP 4 14.10.2006 13:25