明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 22752|回复: 63

[【高飞鸟】] 【飞鸟集】LISP.net?在LISP中调用C++,ARX函数以及汇编语言

  [复制链接]
发表于 2011-3-23 15:22:45 | 显示全部楼层 |阅读模式
在LISP中调用C++,ARX函数以及汇编语言
我不知道这个主题对大家是否有什么帮助,拿到这里,集思广益希望能与大家讨论。如果你有什么好的想法和建议,非常欢迎。
在运行代码前先要运行下面的 RegisterDynWrapX.VLX .

我们知道,LISP有很多限制,不能控制内存,不能得到指针,不能传址,参数的个数不可动态变化,对话框又太简陋了,等等。但是同时它又有很多优点:容易,上手快,简洁,兼容性好,互动性强,也很漂亮(我很喜欢这点).
所以我在想,如果能引用C++,arx,或者汇编语言的一些东西,那将会很有趣,也能添加LISP的一些新特性。

后来我发现我找到了一个方法,能实现以前不敢想象的事情。
1.调用 C 语言函数

  1. ;;; ******************************
  2. ;;; Call some C functions in VLISP
  3. ;;; ******************************
  4. (defun C:CFun (/ DWX i L LocalTime pTime sTime str t1 t2)
  5.   ;; Create a DynamicWrapperX instance
  6.   (setq DWX (vlax-create-object "DynamicWrapperX"))
  7.   (if (null DWX)
  8.     (progn
  9.       (alert "Error: DynamicWrapperX is not registered!")
  10.       (exit)
  11.     )
  12.   )
  13.   
  14.   ;; Register some C functions
  15.   (vlax-invoke DWX 'Register "MSVCRT" "malloc" "i=l" "r=p")
  16.   (vlax-invoke DWX 'Register "MSVCRT" "calloc" "i=ll" "r=p")
  17.   (vlax-invoke DWX 'Register "MSVCRT" "realloc" "i=pl" "r=p")
  18.   (vlax-invoke DWX 'Register "MSVCRT" "free" "i=l")
  19.   (vlax-invoke DWX 'Register "MSVCRT" "srand" "i=l")
  20.   (vlax-invoke DWX 'Register "MSVCRT" "time" "i=l" "r=l")
  21.   (vlax-invoke DWX 'Register "MSVCRT" "rand" "r=l")
  22.   (vlax-invoke DWX 'Register "MSVCRT" "clock" "r=l")
  23.   (vlax-invoke DWX 'Register "MSVCRT" "ctime" "i=p" "r=s")
  24.   ;;Get Local time
  25.   (setq LocalTime (vlax-invoke DWX 'time 0))  ;Get the current time
  26.   (setq pTime (vlax-invoke DWX 'calloc 1 4))  ;allocate memory
  27.   (vlax-invoke DWX 'NumPut LocalTime pTime)
  28.   (setq sTime (vlax-invoke DWX 'ctime pTime))
  29.   (alert sTime)
  30.   (vlax-invoke DWX 'free pTime)    ;free memory
  31.   
  32.   ;; Random numbers and clock
  33.   (vlax-invoke DWX 'srand LocalTime)     ;Get the seed
  34.   (setq t1 (vlax-invoke DWX 'clock))   ;Start Timer
  35.   (setq i 0)
  36.   (setq l nil)
  37.   (repeat 10000
  38.     (setq l (cons (vlax-invoke DWX 'rand) l))  ;Call Rand()
  39.     (setq i (1+ i))
  40.   )
  41.   (setq t2 (vlax-invoke DWX 'clock))                    ;End Timer
  42.   (setq str (rtos (/ (- t2 t1) 1000.)))  
  43.   (alert (strcat "\nIt takes : " str " seconds.")) ;Display time cost
  44.   (setq str "These random numbers are:\n")  ;print random numbers
  45.   (foreach n (reverse l)
  46.     (setq str (strcat str (itoa n) "\n"))
  47.   )
  48.   (princ str)
  49.   
  50.   ;; Release object
  51.   (vlax-release-object DWX)
  52.   (princ)
  53. )
2.调用 汇编语言

  1. ;;; ******************************
  2. ;;; Add Assembly code in VLISP   
  3. ;;; ******************************
  4. (defun C:asm ( / i DWX lcode pCode pName ret str)
  5.   ;; Create a DynamicWrapperX instance
  6.   (setq DWX (vlax-create-object "DynamicWrapperX"))
  7.   (if (null DWX)
  8.     (progn
  9.       (alert "Error: DynamicWrapperX is not registered!")
  10.       (exit)
  11.     )
  12.   )
  13.   ;; This code is from Lee Mac's
  14.   (defun Hex2Dec ( str / foo ) ;; Lee Mac
  15.     (defun foo ( l )   
  16.       (if l (+ (* 16 (foo (cdr l)))
  17.                (- (car l) (if (< (car l) 58) 48 55))) 0))
  18.     (foo (reverse (vl-string->list (strcase str)))))
  19.   ;; Register some API functions
  20.   (vlax-invoke DWX 'Register "MSVCRT" "malloc" "i=l" "r=p")
  21.   (vlax-invoke DWX 'Register "MSVCRT" "calloc" "i=ll" "r=p")
  22.   (vlax-invoke DWX 'Register "MSVCRT" "free" "i=l")
  23.   (vlax-invoke DWX 'Register "USER32" "CallWindowProcA" "i=lllll" "r=l")
  24.   ;; allocate memory and construct a Machine code list
  25.   (setq pCode (vlax-invoke DWX 'calloc 36 1))  ;allocate memory for assembly code
  26.   (setq pName (vlax-invoke DWX 'calloc 64 1))  ;allocate memory for CPU Name
  27.   (setq lCode (list "55"      ;push   ebp
  28.       "8B"      ;move   ebp,esp
  29.       "EC"
  30.       "57"      ;push   edi
  31.       "52"      ;push   edx
  32.       "51"      ;push   ecx
  33.       "53"      ;push   ebx
  34.       "8B"      ;move   eax,dword   ptr   [ebp+8]
  35.       "45"
  36.       "08"
  37.       "0F"      ;cpuid
  38.       "A2"
  39.       "8B"      ;mov    edi,dword   ptr   [ebp+12]
  40.       "7D"
  41.       "0C"
  42.       "89"    ;move   dword   ptr   [edi],ebx
  43.       "1F"
  44.       "8B"    ;mov    edi,dword   ptr   [ebp+16]
  45.       "7D"
  46.       "10"
  47.       "89"    ;move   dword   ptr   [edi],ecx
  48.       "0F"
  49.       "8B"    ;mov    edi,dword   ptr   [ebp+20]
  50.       "7D"
  51.       "14"
  52.       "89"    ;move   dword   ptr   [edi],edx
  53.       "17"
  54.       "58"    ;pop   ebx
  55.       "59"    ;pop    ecx
  56.       "5A"    ;pop    edx
  57.       "55"    ;pop    edi
  58.       "C9"    ;leave
  59.       "C2"    ;ret    16
  60.       "10"
  61.       "00"
  62.        )
  63.   )
  64.   ;; Put this code into a function pointer.
  65.   (setq i 0)
  66.   (foreach code lcode
  67.     (vlax-invoke DWX 'NumPut (Hex2Dec code) pCode i "b")
  68.     (setq i (1+ i))
  69.   )
  70.   ;; Pass message information to the specified window procedure
  71.   (setq ret (vlax-invoke DWX 'CallWindowProcA pCode 0 pName (+ pName 8) (+ pName 5)))
  72.   (setq str (strcat (vlax-invoke DWX 'StrGet pName "s")
  73.       (vlax-invoke DWX 'StrGet (+ pName 5) "s")
  74.             )
  75.   )
  76.   (alert (strcat "CPU type is :\n" str))  ;message a box
  77.   (vlax-invoke DWX 'free pCode)    ;free memory
  78.   (vlax-invoke DWX 'free pName)    ;free memory
  79.   (vlax-release-object DWX)
  80.   (princ)
  81. )
3.调用arx函数

  1. ;;; ******************************
  2. ;;; Call some ARX functions      
  3. ;;; ******************************
  4. (defun C:CallArx (/ *APP DWX PATH PFUN pINS pLEN pPNT pSEL pSTR RET SCRIPT STR X Y Z)
  5.   ;; Create a DynamicWrapperX instance
  6.   (setq DWX (vlax-create-object "DynamicWrapperX"))
  7.   (if (null DWX)
  8.     (progn
  9.       (alert "Error: DynamicWrapperX is not registered!")
  10.       (exit)
  11.     )
  12.   )
  13.   (setq *APP (vlax-get-acad-object))
  14.   (setq path (vla-get-fullname *APP))
  15.   ;; Register some functions about memory
  16.   (vlax-invoke DWX 'Register "msvcrt" "malloc" "i=l" "r=p")
  17.   (vlax-invoke DWX 'Register "msvcrt" "calloc" "i=ll" "r=p")
  18.   (vlax-invoke DWX 'Register "msvcrt" "free" "i=l")
  19.   ;; Register some ARX functions
  20.   (vlax-invoke DWX 'Register path "acedSSGet" "i=ppppp" "r=l")
  21.   (vlax-invoke DWX 'Register path "acedSSLength" "i=pp" "r=l")
  22.   (vlax-invoke DWX 'Register path "acedSSFree" "i=p" "r=l")
  23.   (vlax-invoke DWX 'Register path "acedGetPoint" "i=psp" "r=l")
  24.   (vlax-invoke DWX 'Register path "acedDragGen" "i=pplpp" "r=l")
  25.   
  26.   ;; then call some ARX functions
  27.   (setq pLen (vlax-invoke DWX 'calloc 1 4))  ; a pointer to length of the select set
  28.   (setq pSel (vlax-invoke DWX 'calloc 2 4))  ; a pointer to select set
  29.   (setq pPnt (vlax-invoke DWX 'calloc 3 8))  ; a pointer to coordinate
  30.   (setq str  "\nPlease specify the point:")  
  31.   (setq pStr (vlax-invoke DWX 'StrPtr str "s"))         ; a pointer to the prompt
  32.   (setq ret  (vlax-invoke DWX 'acedSSGet 0 0 0 0 pSel)) ; should return 5100  = (ssget)
  33.   (setq ret  (vlax-invoke DWX 'acedGetPoint 0 str pPnt)); should return 5100  = (getpoint)
  34.   (setq X    (vlax-invoke DWX 'NumGet pPnt  0 "d"))
  35.   (setq Y    (vlax-invoke DWX 'NumGet pPnt  8 "d"))
  36.   (setq Z    (vlax-invoke DWX 'NumGet pPnt 16 "d"))
  37.   (setq str  (VL-PRINC-TO-STRING (list X Y Z)))
  38.   (alert (strcat "The coordinate is: " str))
  39.   (vlax-invoke DWX 'acedSSLength pSel pLen)  ; get the length of selectset = (sslength)
  40.   (setq str (itoa (vlax-invoke DWX 'NumGet pLen)))
  41.   (alert (strcat "The count of selected: " str))
  42.   ;; Callback function
  43.   (defun CallbackFunc (ads_point ads_matrix)
  44.     5000
  45.   )
  46.   (setq pFun  (vlax-invoke DWX 'RegisterCallback 'CallbackFunc "i=pp" "r=l"))
  47.   (setq pIns  (vlax-invoke DWX 'calloc 3 8))
  48.   ;;(setq ret   (vlax-invoke DWX 'acedDragGen pSel pStr 0 pFun pIns))  ;don't do this,or your CAD will be ruined
  49.   (setq ret   (vlax-invoke DWX 'acedSSFree pSel)) ; free the select set , no equation
  50.   ;; free memory and release object.
  51.   (vlax-invoke DWX 'free pLen)
  52.   (vlax-invoke DWX 'free pSel)
  53.   (vlax-invoke DWX 'free pPnt)
  54.   (vlax-invoke DWX 'free pStr)
  55.   (vlax-invoke DWX 'free pIns)
  56.   (vlax-release-object script)
  57.   (vlax-release-object DWX)
  58.   (princ)
  59. )
有两个问题,我没有完全解决:
    1.能否得到一个回调函数(非反应器回调)?怎么做?
    2.能否得到一个类?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2011-3-23 18:04:19 | 显示全部楼层
不得不佩服!!
发表于 2011-3-23 22:01:50 | 显示全部楼层
目前还不懂。。。但是要顶一下
发表于 2011-3-29 14:49:37 | 显示全部楼层
期待调用ARX函数...
对于像我这样,只想学VLISP又想用到ARX中的免费高效函数的,可能帮助很大
顺便请教下,怎么知道ARX中可供VLISP调用的函数呢,比如ACAD自带的geocal.arx?
发表于 2011-3-29 14:50:13 | 显示全部楼层
期待调用ARX函数...
对于像我这样,只想学VLISP又想用到ARX中的免费高效函数的,可能帮助很大
顺便请教下,怎么知道ARX中可供VLISP调用的函数呢,比如ACAD自带的geocal.arx?
 楼主| 发表于 2011-3-29 21:42:51 | 显示全部楼层
chlh_jd 发表于 2011-3-29 14:50
期待调用ARX函数...
对于像我这样,只想学VLISP又想用到ARX中的免费高效函数的,可能帮助很大 ...

可以用exeScope这个软件(或者oleView,dllexport)查看有哪些输出的函数,然后在
objectarx的帮助文件找就可以了。
发表于 2011-6-2 20:34:06 | 显示全部楼层
楼主啊楼主 我不的不所你很伟大,,,
发表于 2011-6-2 23:43:44 | 显示全部楼层
highflybird 发表于 2011-3-23 15:22
在LISP中调用C++,ARX函数以及汇编语言
我不知道这个主题对大家是否有什么帮助,拿到这里,集思广益希望能 ...

建议直接调用ARX封装类,个人为这样方便一些...
发表于 2011-7-26 13:30:29 | 显示全部楼层
大哥,如何用lisp自定义arx快捷键?能不能给个格式或例子
 楼主| 发表于 2011-7-26 14:40:05 | 显示全部楼层
先进者 发表于 2011-7-26 13:30
大哥,如何用lisp自定义arx快捷键?能不能给个格式或例子

并不需要arx函数,就可以自定义快捷键啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-23 05:30 , Processed in 0.170160 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表