马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 牢固 于 2013-6-8 23:20 编辑
OpenDCL可以为AutoLISP 和Visula LISP创建功能强大、界面丰富的对话框,对话框的开发方式和其他用户界面语言的开发方式相近,简单易学,容易上手。目前OpenDCL支持从AutoCAD2004至AutoCAD最新版本!
【一】、入门篇:
1、开发环境的安装与认识
首先去这里下载http://sourceforge.net/projects/opendcl/files/ 下载最新版OpenDcl安装程序文件OpenDCL.Studio.ENU.7.0.0.12.msi,双击默认安装即可!目前OpenDcl支持从AutoCAD2004到AutoCAD2013!
打开OpenDcl程序,我们来认识一下程序界面:
Odcl窗体
控件选项区:添加控件只需点击控件后,再在窗体中所要放置的位置点击就行。
项目窗口区包括:
AutoLisp File Name : Visual/AutoLISP 文件名项可以让用户将将LISP文件与项目关联。事件处理代码可通过先选择需要的事件再点击事件窗口下面的“添加到 .LSP文件”按钮添加到关联的LISP文件中。确保“事件写入到LISP文件”菜单项为选中,点击工具菜单 >事件写入到LISP文件 来启用该按钮。或者你可复制事件定义到剪贴板并手工将其粘贴到LISP文件。
项目窗体:每一添加到项目中的窗体按照其对话框样式(模态、非模态等)列出,选项卡窗格也需要项目的一部分。选项卡窗格将做为单独项死于其父窗体的下方。对于许多程序,可能只有一个窗体,所以就象这里显示的一样,在项目窗口中只有一个入口。 分发文件密码:OpenDCL 可创建密码保护、基于64位编码版本的项目文件以用于分发。 属性和事件区:设置窗体中各控件的属性和指定触发控件时调用的事件事件 窗体区:就是我们的对话框主窗体
Tab顺序区:可以调整对话框窗体各控件的Tab顺序
2、创建第一个OpenDCL对话框应用程序:Hollow World!
打开OpenDCl编辑器,点击 Project->Add Modal Dialog ,添加一个模态对话框,然后在窗体中放置一个 Label 和一个 Button 控件,选定 Button 按钮并在属性窗口中更改“Caption”属性更改为“确定”。对话框如下:
HellowWorld
保存项目文件为 HelloWorld.odcl 并放到 AutoCAD 支持目录或其它在AutoCAD搜索路径下的其它目录;
打开 Visual LISP 编辑器并创建一个名为“HelloWorld.lsp”的新LISP文件。将其保持在与项目文件的相同位置
在编辑器工作区左侧的项目窗口中,双击“Visual/AutoLISP 文件名”可将LISP与项目相关联。这样,定义事件时编辑器生成的代码可自动添加到该文件中,如下如示:
剪切并粘贴以下2个函数的代码到“HelloWorld.lsp” 文件中:
[pcode=lisp,true]; 以下命令确保加载适合的 OpenDCL ARX 文件。
(command "OPENDCL")
;;主程序
(defun c:Hello ()
; 加载 HelloWorld.odcl 文件。
(dcl_Project_Load "HelloWorld" T)
; 显示“Hello world”对话框示例。
(dcl_Form_Show HelloWorld_Form1)
(princ)
)[/pcode]
现在,你可AutoCAD中加载“HelloWorld.lsp” ,并在命令行中键入“Hello”,此时将会显示你最后一次保存的对话框,如下图:
但是,点击“确定”按钮,并没有任何动作,因为我们没有给确定按钮添加任何事件代码。要关闭对话框,可点击对话框右上角的X来关闭。
下面来设置对话框的OnInitialize 事件,来使对话框打开时Label1控件显示"Hollow World! "
为确保“事件写入LISP文件”切换开关已经设好,点击菜单 Tools->Write events to Lisp File 项。确保该菜单项前边显示√。这时可自动将事件代码自动添加到之前指定的LISP文件中。
选择对话框,然后再点击事件选项卡,点中OnInitialize事件左侧的复选框。再点击“Add to file”按钮,将事件代码(显示在窗口下面的Defun函数内容)自动添加到 HelloWorld.lsp 文件中去。也可以点击ClipBoard Copy 按钮,将代码复制到粘贴板,然后手工添加到 HelloWorld.lsp 文件中去。 OnInitialize 函数用于在对话框加载时运行。下一步将对这个函数进行修改,添加一些有用的功能。
选中窗体中Label1标签,点击鼠标右键,选中控件对象浏览器(Control Browser)选项,此时会打开一个新的窗口,它带有可用于Label对象函数的函数列表,见下图:
选择“Caption”项,在右侧的窗口中,有关使用Caption属性的详细信息将会显示出来。点击Set Function 的“复制到剪贴板”按钮。打开HelloWorld.lsp ,将粘贴板中代码复制到OnInitialize 事件函数中去,并修改相应变量的值, 改好后OnInitialize 代码如下:
[pcode=lisp,true];;对话框初始化事件代码
(defun c:HelloWorld_Form1_OnInitialize (/)
;;将Label1控件标签设为"Hello World"
(dcl_Control_SetCaption helloworld_Form1_Label1 "Hello World")
)[/pcode]
选中窗体中Button标签,事件窗体中选中 Clisked 事件,同样的方法将事件代码添加到 HelloWorld.lsp 中去,并将事件代码内容修改为关闭对话框的代码,关闭对话框的代码我们可以通过控件对象浏览器(Control Browser)中左侧列表中查找“Close”方法,来将代码复制到HelloWorld.lsp 中去。
[pcode=lisp,true];;确定按钮事件,退出对话框
(defun c:HelloWorld_Form1_TextButton1_OnClicked (/)
;;关闭对话框
(dcl_Form_Close HelloWorld_Form1 )
)[/pcode]
保存 HelloWorld.lsp 文件和HelloWorld.odcl 文件。至此,我们已经完成第一个OpenDcl对话框的全部设置,在CAD中加载HelloWorld.lsp ,键入命令:Hwllo,出现对话框如下:
点击确定,确定按钮事件触发,退出对话框。
3、OpenDcl对话框应用程序的发布方法
当我们发布OpenDcl对话框应用程序时,由于我们不能确保每位用户电脑里都安装了OpenDcl,所以我们最好将OpenDcl的支持库文件随程序一起发布!该库文件是由几个支持不同CAD版本的ARX文件和一个动态链接库文件组成,下载链接:
用户需将上述几个文件放到AutoCAD支持目录下,然后在“HelloWorld.lsp” 文件开头添加如下两个通用函数,用来自动加载OpenDcl:
[pcode=lisp,true];;(gxl-AutoLoadODclArx) 自动加载OpenDcl函数
;; 无参数 By Gu_xl
(defun gxl-AutoLoadODclArx (/ loaded fn v fnn)
;;系统已安装OpenDcl的加载方式
(if (and
(not dcl_getversionex) ;_ OpenDcl未加载
(= 2 (boole 1 (getvar "DEMANDLOAD") 2))
)
(VL-CATCH-ALL-APPLY 'vl-cmdf (list "opendcl")) ;_ 调用OpenDcl命令加载OpenDcl
)
(if (not dcl_getversionex) ;_ OpenDcl仍未加载
;;按AutoCAD的不同版本搜索opendcl.arx文件进行加载
(cond
((= "16" (setq v (itoa (atoi (getvar 'acadver)))))
(if
(setq fnn (findfile (setq fn (strcat "opendcl." v ".arx"))))
(setq loaded (arxload fnn "1"))
(setq loaded "2")
)
)
((or (= "17" v) (= "18" v) (= "19" v))
(if (= "x86" (getenv "PROCESSOR_ARCHITECTURE")) ;_ 32位系统
(if (setq fnn
(findfile (setq fn (strcat "opendcl." v ".arx")))
)
(setq loaded (arxload fnn "1"))
(setq loaded "2")
)
;;64位系统
(if (setq fnn
(findfile (setq fn (strcat "opendcl.x64 ." v ".arx")))
)
(setq loaded
(arxload fnn
"1"
)
)
(setq loaded "2")
)
)
)
(t (Setq loaded "2"))
)
(setq loaded "3") ;_ 已加载
)
;; 加载OpenDcl失败,直接中断程序
(if (= "1" loaded)
(progn
(princ (strcat fn "加载失败!程序将退出!"))
(exit)
)
(if (= "2" loaded)
(progn
(princ
(strcat "未找到对应的\"" fn "\"文件!程序将退出!"))
(exit)
)
)
)
;;返回3,表示加载成功
loaded
)
;;(gxl-Load_ODCL_Project projname reload password alias)
;;功能:加载OpenDcl工程
;;参数:projname = 工程名称字串(后缀为"*.odcl"、"*.odcl.lsp"或不带后缀)或者OpenDcl工程数据表
;; reload = T 强制重载工程 or nil 若已加载,则什么也不干
;; password = 设定密码字串 or nil
;; alias = 替代项目关键字 or nil
;; By Gu_xl
(defun gxl-Load_ODCL_Project
(projname reload password alias / bytes rtype Projects e)
(cond
((null dcl_project_import)
(prompt "OpenDCL未加载...\n")
)
((= 'list (type projname)) ;_ projname 为OpenDcl工程数据表
(dcl_project_import projname password alias)
)
((and
(progn
(if (= ".LSP"
(substr (strcase projname) (- (strlen projname) 3))
)
(setq projname (substr projname 1 (- (strlen projname) 4)))
)
(if (/= ".ODCL"
(substr (strcase projname) (- (strlen projname) 4))
)
(setq projname (strcat projname ".odcl"))
)
(setq bytes (vl-get-resource projname))
)
(eq 'str (setq rtype (type bytes)))
(not (eq "" bytes))
) ;_ 从打包的资源文件中读取OpenDCL工程
(if reload
(dcl_project_import bytes password alias)
(if (or
(not (setq Projects (dcl_GetProjects)))
(not (member (strcase (vl-filename-base projname))
(mapcar 'strcase Projects)
)
)
)
(dcl_project_import bytes password alias)
)
)
)
;;查找OpenDCL工程文件进行加载
((if (not (VL-CATCH-ALL-ERROR-P
(setq e (VL-CATCH-ALL-APPLY
'dcl_project_load
(list (findfile projname) reload alias)
)
)
)
)
e
)
)
)
)
;;以上两个通用函数函数请放在任何一个OpenDcl程序的最开始[/pcode]
以上两个通用函数函数请放在任何一个OpenDcl程序的最开始 。根据以上加载OpenDCL通用函数,我们将 c:Hello 函数稍作修改如下:
[pcode=lisp,true];;方法一、方法二的程序代码;;主程序
(defun c:Hello ()
;;自动加载OpenDcl
(gxl-AutoLoadODclArx)
;; 加载 HelloWorld.odcl 文件。
(gxl-Load_ODCL_Project "HelloWorld" t nil nil)
;; 显示“Hello world”对话框示例。
(dcl_Form_Show HelloWorld_Form1)
(princ)
)[/pcode]
发布方法一:将“HelloWorld.lsp”和“HelloWorld.Odcl”文件同时提供给用户使用!
发布方法二:在Vlide里用新建应用程序向导,建立一个VLX文件进行程序发布,(新建应用程序向导 具体方法请参阅CAD的帮助),首先打开OpenDcl编辑器,打开“HelloWorld.Odcl”文件,点击菜单 文件->另存为 以“.lsp”为结尾的文件 “HelloWorld.Odcl.lsp” ,然后在新建应用程序向导里,将“HelloWorld.Odcl.lsp”文件作为资源文件添加到应用程序里,然后再编译VLX程序进行发布!
发布方法三:打开对话框文件 “HelloWorld.Odcl.lsp”,我们可以看到,该文件内容是一个字符串列表,将该表内容直接复制到“HelloWorld.lsp”文件里,将该表赋值给某个变量,我们将 “HelloWorld.lsp” 文件内容修改如下:
[pcode=lisp,true];;方法三的程序代码
;;将OpenDCL对话框文件字符串列表赋值给OdclList
(setq OdclList
'("YWt6A1cJAACUVTLcBuKTKjUVLT9qgKxIl6Z6+vzG7HjyZs5TSDPLD50lAtrIQD7a/0jxOBWtKkoU"
"Dp04Dp+g+4ZtAvxxDpc0v/tBvmEurpSw86SKRe25muC6hiIEUZmgh7AJmLKy54cYAxvLfCSGXghf"
"+3yYD2dpp+SaCXA7Yj7ooM0Nh5dqcK0tnsX6Tco1EptO8lowHzQMisudA36gi3yVhuneNnIP+JtP"
"PAzqoV/yXb8B+NNGuLaa0lExtcxL/GOKGadZsEk/AeTIYwica7fG7cNs9q9VJzmnWRhN8KXyF+SG"
"bAK55hX24FI5bbWmRzYK5DJJ/OwqGBLh805ACqtvV4FfxdI7mEihb9ZvQJcakFcCK58pjqnPArIF"
"uyGNnv9Syd0jRxmemE69M1ScdhNgWySkEKELiEx/4UmFKUskJ5+pltHRzcgeDWxDFgSycynmG6ij"
"ikUCLYZpcKWGGXRBKYbXvKGiBjzmJZbTnfTyyYf5JY+4vb46I5gnyJLYNDouQr0ELX03aFAdNbMi"
"XytmwVSaXbtBLobfvIkBDHJ08yspj/y89fPLhsA2a+hqAT+fpRTC67gk1Qaru6VUASyDQUjUILtv"
"q4HN5fGbpWLiUObE1ZuuikroIZtZY8ElDt69qEIoeYz3RE4DdGlDxzxtwti8yo1LK/sHy2sOcJjb"
"5b30RKblWrFIS5lz8HF14AwGcSWY+r0R+4He8JlouTn7QZAONI5PW/LavG10YSsmtR/V1DXtQjTW"
"t93l8+4GeMtC/Nkn0UxdiZ90wVu00KZU6pbRoymTDSuRz4OIiLQc/0/HgbyFNZ9LdxVRJPqrK1Kh"
"45BaVvWBKi4zfGTuAAkq4Fh/U71V3kzCfGQ6GX87nmuuUoD//p6NsIlJeuvSg6l+yBVAjA=="
)
)
;;主程序
(defun c:Hello ()
;;自动加载OpenDcl
(gxl-AutoLoadODclArx)
;; 加载 对话框 文件。
(gxl-Load_ODCL_Project OdclList nil nil nil)
;; 显示“Hello world”对话框示例。
(dcl_Form_Show HelloWorld_Form1)
(princ)
)[/pcode]
;;示例程序文件代码下载:
以上第一部分初步介绍了一下OpenDCL的开发界面以及如何创建自己的OpenDCL对话框应用程序,同时介绍了一下发布OpenDCL对话框应用程序的几种方法!
在以后的部分我会逐一就OpenDCL的各种控件的使用展开介绍,敬请大家期待!并且热烈欢迎大家跟帖讨论交流! |