明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: aroom

TeaScript 编程(二次开发AutoCAD、Lisp写windows应用程序)

    [复制链接]
发表于 2012-6-3 13:44 | 显示全部楼层
期待更多的实例,应用.
 楼主| 发表于 2012-6-3 14:07 | 显示全部楼层
sfzyr 发表于 2012-5-31 20:36
楼主举个cad环境下用的例子看看,比如一个lisp程序,然后用TeaScript 改写,然后关键是,改写后的程序如何用 ...

一、编辑用于 AutoCAD 中画线的 TeaScript 代码,保存为 my_TeaScript.lsp 文件。

;;; my_TeaScript.lsp

(setq acad (GetOrCreateObject "autocad.Application"))
;;;如果机器上安装了多个 AutoCAD 版本
;;; (setq acad (GetOrCreateObject "autocad.Application.17"))   ;; 指定 acad 2007
;;; (setq acad (GetOrCreateObject "autocad.Application.17.1")) ;; 指定 acad 2008

(setq acad.Visible 1)
(setq acdoc acad.activedocument
      acdwg acdoc.modelspace)

(defun acad_drawline( / pt1 pt2)
   (setq pt1 (acdoc.Utility.GetPoint Missing "Enter first point: ")
         pt2 (acdoc.Utility.GetPoint pt2 "Enter second point: "))
   (acdwg.addLine pt1 pt2)
)

;;; end file my_TeaScript.lsp



二、在 AutoCAD 的 Visual Lisp 中加载 TVMCOM 控件

;;; 1、创建 TVMCOM 对象

(setq TVMObj (vlax-get-or-create-object "TVMCOM.Control"))

;;; 2、调用 TVMObj 对象的 EvalString 方法

(setq str_loadfile "(load \"my_TeaScript.lsp\")")   
(vlax-invoke-method TVMObj 'EvalString str_loadfile)         ;;; 加载 my_TeaScript.lsp 源程序   


;;;3、将 TeaScript 函数在 AutoCAD 中使用
(defun c:my_line()
   (vlax-invoke-method TVMObj 'EvalString "(acad_drawline)") ;;; 执行 TeaScript 的 acad_drawline 函数
)


三、在 AutoCAD 命令行窗口输入

Command: my_line
Command: Enter first point:
Command: Enter second point:
...

 楼主| 发表于 2012-6-5 00:42 | 显示全部楼层
TeaScript 表达式书写规则

1.4.1 数值
十进制整数由一个或多个数字组成。其中不含小数点标记(.) 开头可选 + 或 - 作为正负数符号。
14
123
+4567
-999
十六进制整数以 0x (或 0X)开头,随后可以是任意个十六进制数字。其中不含小数点标记(.),开头
可选 + 或 - 作为正负数符号。 十六进制数字为: 0123456789abcdefABCDEF 。
0xFF → 255
0x10ab → 4267
0X10CC → 4300
八进制整数以 0 开头,随后可以是任意个八进制数字。其中不含小数点标记(.),开头可选 + 或 -
作为正负数符号。 八进制数字为: 01234567 。
012 → 10
010 → 8
077 → 63
-077 → -63
实数由一个或多个数字和一个小数点 (.) 组成。 小数点可以出现在数字中的任何位置包括开头,开
头可选 + 或 - 作为正负数符号。
1.23 → 1.23
-1.23 → -1.23
+2.3456 → 2.3456
.506 → 0.506
此外,还可以使用以字母 e 或 E 连接数字的科学计数(指数为10的幂)。
1.23e3 → 1230
-1.23E3 → -1230
+2.34e-2 → 0.0234
.506E3 → 506

1.4.2 字符串
以 " 开头," 结尾:
"hello" →"hello"
"\032\032\065\032" →" A "
"\x20\x20\x41\x20" →" A "
"\t\r\n" →"\t\r\n"
"\x09\x0d\x0a" →"\t\r\n"
"\000\001\002" → "\000\001\002" ; 可以包含ASCII 0~255 所有控制字符
双引号内的字符串长度不能超过 2,048 字节。 长字符串须用 [text] 和 [/text] 标识符来分界。
TeaScript 引擎输出超过 2,048 字节的字符串时自动采用 [text] 和 [/text] 来作为字符串标界
符。
以 [text] 开头,[/text] 结尾:
[text]this is a string, too[/text]
→ "this is a string, too"

以 " (双引号) 标界的字符串可以处理下列的以 \ 开头的转义字符:
字符描述
\\ 反斜杠
\" 双引号
\n 换行符 (ASCII 10)
\r 回车符 (ASCII 13)
\t TAB 键制表符 (ASCII 9)
\nnn 3位 ASCII 十进制数值 (nnn 介于 000 与 255 之间)
\xnn 2位 ASCII 十六进制数值 (nn 介于 00 与 FF 之间)
\unnnn 一个 unicode 编码字符,nnnn 为十六进制数值。
[text], [/text] 标界符不进行转义字符的处理。
字符串内插变量
字符串内包含在 #{ 与 } 之间的符号为字符串内嵌表达式
(setq name "TeaScript") → TeaScript
"hello, #{name}!" → hello, TeaScript!

1.4.3 正则表达式
以 / 开头,/ 结尾:
/\d+/ → \d+
以 #" 开头," 结尾:
#"\d+" → \d+
正则表达式标界符之间的字符,除包含的是结尾标界符进行转义外,其他字符不进行转义处理。

1.4.4 符号
符号名字区分大小写,例如abc、Abc 和 ABC 分别表示不同的符号。
符号名字的开头不可以是特殊字符和数字,即:
; " ' ` ( ) [ ] { } . : & / , 0 1 2 3 4 5 6 7 8 9
符号名字的中间字符可以是除空格以及特殊字符外的任何其他字符。特殊字符如下所示:
; " ' ` ( ) [ ] { } . : & / ,
说明:
; 注释语句标识直到回车换行
" 字符串的开头和结尾标识
' 引用标识
` 反引用标识
( 语句或列表开头标识
) 语句或列表结尾标识
[ 向量开头标识 (符号内插变量开头标识)
] 向量结尾标识 (符号内插变量结尾标识)
{ 对象开头标识
} 对象结尾标识
: 对象中的关键字
. 连接命名空间与符号
& 取地址 (按位与运算) (形式参数列表中所有未绑定变量)
/ 正则表达式的开头与结尾 (形式参数列表中分隔局部变量)
, 求值 (形式参数列表中分隔局部变量)
如果需考虑对其他语法的兼容性,便于代码之间的转换,符号名字可以用更小的子集来避免名字
中间出现其他语法的运算符:
符号名字的开头[a-zA-Z_]: 小写字母a到z,或大写字母A到Z,或下划线_
符号名字的中间和结尾[a-zA-Z_0-9]: 小写字母a到z,或大写字母A到Z,或下划线_,或数字0到9
符号内插变量
符号内包含在 [ 与 ] 之间的符号为内嵌表达式
(setq obj.t 123) → 123
(setq x "t") → t
obj[x] → 123

1.4.5 列表
以 ( 开头,) 结尾:
(+ 1 2 3 4) → 10
(define (double x) (+ x x)) → (fn (x) (+ x x))
匿名函数
以 #( 开头,) 结尾:
(setq double #(+ %1 %1))
(double 20) → 40
(#(* %1 %1) 5) → 25

1.4.6 向量
以 [ 开头,] 结尾:
(setq somevector ["john", 25]) → ["john", 25]
somevector → ["john", 25]

1.4.7 对象
以 { 开头,} 结尾:
(setq someobj {name: "john", age:25}) → {:name "john", :age 25}
someobj. → {:name "john", :age 25}
 楼主| 发表于 2012-6-5 02:41 | 显示全部楼层
本帖最后由 aroom 于 2012-6-5 02:42 编辑

AutoCAD 嵌入到独立的 Windows 窗体中

;;;1、导入库
(importAll "kernel32.dll")
(importAll "user32.dll")
(importAll "gdi32")
;;; 2、定义常量
(setq WS_OVERLAPPEDWINDOW 13565952)
(setq IDI_APPLICATION 32512)
(setq IDC_ARROW 32512)
(setq WHITE_BRUSH 0)
(setq WM_CREATE 1)
(setq WM_DESTROY 2)
(setq WM_MOVE 3)
(setq WM_SIZE 5)
(setq WM_PAINT 15)
(setq WM_CLOSE 16)
(setq WM_NOTIFY 78)
(setq WM_COMMAND 273)
(setq OFN_HIDEREADONLY 4)
(setq OFN_PATHMUSTEXIST 2048)
(setq OFN_FILEMUSTEXIST 4096)
;;; 3、定义结构
(structDef WNDCLASSEXA cbSize style lpfnWndProc cbClsExtra cbWndExtra hInstance hIcon
    hCursor hbrBackground lpszMenuName lpszClassName hIconSm)
(structDef MSG hwnd message wParam lParam time pt_x pt_y)
(structDef OPENFILENAME lStructSize hwndOwner hInstance lpstrFilter lpstrCustomFilter
    nMaxCustFilter nFilterIndex lpstrFile nMaxFile lpstrFileTitle nMaxFileTitle lpstrInitialDir
    lpstrTitle Flags
    (nFileOffset "d")
    (nFileExtension "d") lpstrDefExt lCustData lpfnHook lpTemplateName)
;;; 4、定义回调函数
(defun myWndProc (hwnd message wParam lParam)
    (println message)
    (cond
        ((== message WM_CREATE)
         (setq acad (GetOrCreateObject "autocad.Application"))
         (setq acad.Visible 1)
         (SetParent acad.HWND hwnd) ;;; AutoCAD嵌入到Windows 窗体
        )
        ((== message WM_CLOSE)
            (acad.quit)
            (ReleaseObject acad)
            (MessageBoxA hwnd "单击了关闭按钮,退出程序." "TeaScript提示"
                0)            
            (DefWindowProcA hwnd message wParam lParam))
        ((== message WM_DESTROY)            
         (PostQuitMessage 0))
        (true (DefWindowProcA hwnd message wParam lParam))))
;;; 5、定义主函数
(defun MyWindow ()
    (var ClassName nil Caption nil uMsg nil wndclass nil)
    (setq hInstance (GetModuleHandleA 0))
    (setq ClassName "mywindow")
    (setq Caption "TeaScript编写的一个窗口")
    (setq wndclass (new Struct WNDCLASSEXA))
    (setq wndclass.cbSize (sizeof WNDCLASSEXA))
    (setq wndclass.lpfnWndProc (callback 0 myWndProc))
    (setq wndclass.hInstance hInstance)
    (setq wndclass.hIcon (LoadIconA 0 IDI_APPLICATION))
    (setq wndclass.hCursor (LoadCursorA 0 IDC_ARROW))
    (setq wndclass.lpszClassName &ClassName)
    (RegisterClassExA &wndclass)
    (setq myhwnd (CreateWindowExA 0 ClassName Caption WS_OVERLAPPEDWINDOW 200 200 400
            300 0 0 hInstance 0))
    (ShowWindow myhwnd 1)
    (UpdateWindow myhwnd)
    (setq uMsg (new Struct MSG))
    (while (> (GetMessageA &uMsg 0 0 0) 0)
        (TranslateMessage &uMsg)
        (DispatchMessageA &uMsg)))
;;; 6、开始运行
(MyWindow)




本帖子中包含更多资源

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

x
 楼主| 发表于 2012-6-5 12:03 | 显示全部楼层
本帖最后由 aroom 于 2012-6-5 12:03 编辑

TeaScript 扩展 Excel 应用开发

;; 启动 Excel 并获取 Application 对象
(setq excel (CreateObject "Excel.Application"))
(setq excel.Visible true)
;; 新建 workbook,并获取当前激活的表单
(setq workbook excel.Workbooks.Add)
(setq sheet workbook.ActiveSheet)
;; 为单元格逐个增加值
(setq cell (sheet.Cells 1 1))
(setq cell.Value "First Name")
(setq cell (sheet.Cells 1 3))
(setq cell.Value "Last Name")
(setq cell (sheet.Cells 1 4))
(setq cell.Value "Full Name")
(excel.quit)
(ReleaseObject excel)
)




本帖子中包含更多资源

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

x
发表于 2012-6-6 11:46 | 显示全部楼层
aroom 发表于 2012-6-3 14:07
一、编辑用于 AutoCAD 中画线的 TeaScript 代码,保存为 my_TeaScript.lsp 文件。

;;; my_TeaScript.l ...

這樣就比較清楚了,這樣用TeaScript ,就可以真正實現對象編程的表達方法,即: "對象 . 屬性" 的表達方式, 程序可讀性強, 然lisp 也符合現在流行的對象編程的表達方式,程序更容易理解了
发表于 2012-6-6 13:28 | 显示全部楼层
喜欢!!!!
发表于 2012-6-8 15:29 | 显示全部楼层
感谢分享~~~~~~~~~~~~~~
 楼主| 发表于 2012-6-13 17:32 | 显示全部楼层
本帖最后由 aroom 于 2012-6-13 17:37 编辑

(setq acad (GetOrCreateObject "autocad.Application"))
(setq acad.Visible 1)
(setq doc acad.activedocument dwg acad.activedocument.modelspace)
(dwg.addCircle '(0. 0. 0.) 500.)
(setq txt (dwg.addText "TeaScript" '(0. 0. 0.) 100.))
(setq txt.color 1)
(acad.zoomAll)

(setq PI (* (acos 0) 2))
(setq i 1)      
(while (<= i 60)     
    (setq txt.Rotation (* -1 i (/ (* 2 PI) 60)))
    (acad.update)
    (sleep 1000)
    (++ i)
)


本帖子中包含更多资源

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

x
发表于 2012-6-15 22:34 | 显示全部楼层
希望TeaScript 能有可视化对话框工具,针对ACAD看起来是使用了COM的编程手段,这对于AutoCAD的编程者来讲可能会缺少很多功能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 21:59 , Processed in 0.426831 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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