ObjectDCL学习笔记(4)
可停靠对话框和树形控件
支持可停靠对话框是我们使用ObjectDCL的又一个理由。在AutoCAD中,“对象特性”对话框就是可停靠对话框的一个例子。使用可停靠对话框可大大增强用户与ActoCAD的交互操作能力,也使我们的程序显得更专业。
这一次,让我们一起创建一个带树控件的可停靠对话框,并通过选择树的子节点事件,在AutoCAD的窗口中绘制相应的图形。新创建的ObjectDCL文件名为MyDockable.odc,关联的Lisp文件名为MyDockable.lsp,还是都存放到D:\MyODcl文件夹中。
1. 创建可停靠对话框
1.1设计对话框
运行ObjectDCL.exe,进入ObjectDCL编辑环境。在Projects菜单中选择添加可停靠对话框菜单项(Add Dockable Form)就得到了一个非模式对话框,然后像图4.1那样,摆上一个TreeControl控件。
1.2设置控件的属性
打开属性向导(Property Wizard)对话框。在字体属性页中,把Font置为“宋体”,Size设置为10;在图片属性页中,添加4个图标,分别用于树形控件父节点的一般状态、展开状态、子节点的一般状态、选中状态。
2.给对话框的事件编程
2.1创建树形控件的函数
因为树形控件的节点创建函数中的参数比较多,我们先对树形控件的几个主要函数的语法结构作一个简单的说明。
(1)添加父节点的函数
(Odcl_Tree_AddParent
ProjectDialogControlName ;工程-对话框-控件名
Text [as String] ;节点标题
[optional] Key [as String] ;节点名
[optional] ImageIndex [as Integer] ;节点图标索引
[optional] SelectedImageIndex [as Integer] ; 选中节点图标索引
[optional] ExpandedImageIndex [as Integer] ; 展开节点图标索引
)
(2)添加子节点的函数
(Odcl_Tree_AddChild
ProjectDialogControlName ;工程-对话框-控件名
ParentKey [as String or Long] ; 父节点名
Text [as String] ;节点标题
[optional] Key [as String] ;节点名
[optional] ImageIndex [as Integer] ;节点图标索引
[optional] SelectedImageIndex [as Integer] ; 选中节点图标索引
[optional] ExpandedImageIndex [as Integer] ; 展开节点图标索引
)
上面是不带参数表的函数形式,它们还有带参数表的函数形式,可参见ObjectDCL的Object Browser中的函数定义和MyDockable.lsp中的具体写法。
2.2对话框初始化函数
;对话框初始化
(defun c:DclForm1_OnInitialize ()
;添加线状图形父节点
(Odcl_Tree_AddParent "MyDockable" "DclForm1" "TreeControl1" "线状图形"
"Lines" 0 0)
(Odcl_Tree_SetExpandedImage "MyDockable" "DclForm1" "TreeControl1" "Lines" 1)
;添加线状图形的子节点
(Odcl_Tree_AddChild "MyDockable" "DclForm1" "TreeControl1"
(list
(list "Lines" "直线" "Line" 2 3)
(list "Lines" "多线" "MLine" 2 3)
(list "Lines" "多段线" "PLine" 2 3)
)
)
;添加圆状图形父节点
(Odcl_Tree_AddParent "MyDockable" "DclForm1" "TreeControl1" "圆状图形"
"Circles" 0 0)
(Odcl_Tree_SetExpandedImage "MyDockable" "DclForm1" "TreeControl1" "Circles"
1)
;添加圆状图形的子节点
(Odcl_Tree_AddChild "MyDockable" "DclForm1" "TreeControl1"
(list
(list "Circles" "圆" "Circle" 2 3)
(list "Circles" "椭圆" "Ellipse" 2 3)
(list "Circles" "圆环" "Donut" 2 3)
)
)
;添加文字图形父节点
(Odcl_Tree_AddParent "MyDockable" "DclForm1" "TreeControl1" "文字图形" "Texts"
0 0)
(Odcl_Tree_SetExpandedImage "MyDockable" "DclForm1" "TreeControl1" "Texts" 1)
;添加文字图形的子节点
(Odcl_Tree_AddChild "MyDockable" "DclForm1" "TreeControl1"
(list
(list "Texts" "文字1" "Text1" 2 3)
(list "Texts" "文字2" "Text2" 2 3)
(list "Texts" "文字3" "Text3" 2 3)
)
)
)
2.3处理树控件的单击事件
;TreeControl1的单击事件,在Acad的窗口中画对应的图形
(defun c:DclForm1_TreeControl1_OnClicked()
(setq #SelectedKey
(Odcl_Tree_GetSelectedItem "MyDockable" "DclForm1" "TreeControl1")
)
(if(not(equal #LastSelKey #SelectedKey))
(cond
((= #SelectedKey "Line")(command "_.Line" '(10 30) '(18 35) ""))
((= #SelectedKey "MLine")(command "_.MLine" "_s" 2 '(20 30) '(28 35)""))
((= #SelectedKey "PLine")(command "_.PLine" '(30 30) '(34 35) '(38 30) ""))
((= #SelectedKey "Circle")(command "_.Circle" '(14 20) 4))
((= #SelectedKey "Ellipse")(command "_.Ellipse" "_c" '(24 20) '(28 20)
'(24 23)))
((= #SelectedKey "Donut")(command "_.Donut" 5 7 '(34 20) ""))
((= #SelectedKey "Text1")(command "_.Text" '(10 10) 2 0 "Text1"))
((= #SelectedKey "Text2")(command "_.Text" '(20 10) 2 0 "Text2"))
((= #SelectedKey "Text3")(command "_.Text" '(30 10) 2 0 "Text3"))
)
)
)
2.4 MyDockable的主程序
关于MyDockable的主程序,其结构和前几个程序完全一样,就不用说什么了。为了程序的完整,也写在下面:
(defun c: MyDockable ()
(ObjectDCL_LoadArx)
(Odcl_LoadProject "MyDockable" T)
(Odcl_Form_Show "MyDockable" "DclForm1")
(princ)
)
;确保将ObjectDCL.arx 载入 AutoCAD.
(defun ObjectDCL_LoadArx ()
(if (not (member "objectdcl.arx" (arx)))
(arxload "objectdcl.arx" "ObjectDCL.arx not found.")
)
)
3. 运行MyDockable
进入AutoCAD2000,加载MyDockable.lsp。执行MyDockable命令,会立即在Acad窗口的左侧显示MyDockable对话框,如图4.2所示,只是对话框中的3个父节点都没有展开。
可停靠对话框也是一种非模式对话框,是用户与AutoCAD进行交互式操作的有力工具。下面我们就和AutoCAD进行交互操作。
双击“线性图形”父节点,展开该节点,在逐个单击其子节点,则会在Acad的图形窗口中绘出子节点对应的直线、多线和多段线图形。
在Acad的命令行键入Color命令,把当前颜色置为红色。
双击“圆性图形”父节点,展开该节点,在逐个单击其子节点,则会在Acad的图形窗口中绘出子节点对应的红色的圆、椭圆和圆环图形。
类似地把当前颜色置为蓝色,单击文字1,文字2,文字3节点,可绘出蓝色的Text1,Text2,Text3三个文本图形。
这个话题我们就讨论到这里。下一次,我们将对配置表对话框(Config Tab)的设计和编程进行讨论。
|