明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 57399|回复: 96

[OpenDCL] ObjectDCL学习笔记(作者:李松)

    [复制链接]
发表于 2004-6-15 20:35 | 显示全部楼层 |阅读模式

ObjectDCL学习笔记(1)

初识ObjectDCL

AutoLisp简洁、易学、功能强大,可满足用户的绝大多数需求。对一般的AutoCAD用户来说,AutoLisp是进行开发的首选语言。但AutoLisp使用的对话框编程语言DCLPDB却实在不敢恭维,其功能、界面、编程方法都不能令人满意。

ObjectDCL应运而生。

1.安装和设置ObjectDCL

1.1运行ObjectDCL文件包中的Setup.exe,一路Next下去,ObjectDCL就被安装到C:\Program Files\3rd Day Software\ObjectDCL文件夹中。

1.2在安装ObjectDCL的文件夹中,有ObjectDCL.arxObjectDCL2004.arx两个arx库文件。ObjectDCL.arx用于Acad2000/2002ObjectDCL2004.arx用于Acad2004。为方便编程,把它们拷贝到Acad的支持搜索路径中,或直接把安装ObjectDCL的文件夹设置为Acad的支持搜索路径。

1.3创建一个准备存放ObjectDCL编程结果的文件夹,假设为D:\MyOdcl。把D:\MyOdcl也设置为Acad的支持搜索路径。

现在就可以开始学习ObjectDCL了。

2.启动和认识ObjectDCL

在安装ObjectDCL的文件夹中,有个ObjectDCL.exe文件,它就是ObjectDCL的主程序。运行ObjectDCL.exe,即进入ObjectDCL编辑环境。

ObjectDCL的主窗口很简洁,各菜单项的意义也很清楚,且大部分都在工具条和4个停靠子窗口中有对应的功能,而View菜单是ObjectDCL工具条和下面要说明的4个工具停靠子窗口的开关。工具条中的第一个图标对应的是工程菜单Project的前5个菜单项,用来添加对话框窗体;工具条中的最后一个图标(照相机)对应的是工程菜单View/Edit Picture Folder菜单项,用来管理图形资源文件夹。

ObjectDCL窗体的左侧,上面是控件工具箱(ToolBox),下面是控件上下次序显示调整窗口(Z/Tab Order)

ObjectDCL窗体的右侧,上面是工程结构树窗口(Project Tree),下面是对话框/控件属性(Properties)和事件(Events)窗口。

ObjectDCL窗体的中间,就是以后摆放新创建的对话框的位置了。

3.创建一个最简单的对话框

既然是要创建一个最简单的对话框,那就是所谓的“Hello”了。

3.1编写对话框驱动程序框架

在开始创建对话框以前,先创建一个对话框驱动程序的框架:

(defun C:MyHello()

(if (not (member "objectdcl.arx" (arx)))

(arxload "objectdcl.arx" "加载objectdcl.arx 失败.")

)

(princ)

)

MyHello.lsp为名保存到D:\MyOdcl文件夹中备用。建议,MyHello.lsp的编辑器不要关闭,我们下面还要用到它。

3.2创建对话框

(1)Projects菜单中选取Add Modal Form菜单项,窗体中就添加了一个没有控件的对话框。这个对话框的默认名为DclForm1。用鼠标单击对话框窗体,则ObjectDCL窗体中右下方的属性页(Properties)中显示出当前对话框的所有属性值。把标题栏文本 (TitleBarText)项的内容改为:Hello”。

(2)在控件工具箱中选择Label控件放到对话框适当的位置。这个Label控件的默认名为Label1

Label1的标题(Caption)内容改为:“各位网友,新年好!”。

Label1的字体(Font)改为你喜欢的字体和大小。

Label1的背景颜色(BackColor)改成你喜欢的颜色。

Label1的前景颜色(ForeColor)改成你喜欢的颜色。

调整对话框和Label1的大小。

(3)保存对话框文件

直接单击“Save”工具图标,把新设计的对话框以Hello.odc为名保存到D:\MyOdcl文件夹中。我们这个Hello对话框就制作完成了。

33指定与对话框关联的Lisp程序

展开工程结构树窗口中的Visual / Auto Lisp File name节点,双击图标,在弹出的“打开”对话框中选择我们已预备好的程序文件D:\MyOdcl\MyHello.lsp。则两者就关联了起来。

4.完善控制对话框的Lisp程序

为了能让上面设计的对话框显示出来,需要在MyHello.lsp中添加几条命令。用鼠标右键点击对话框窗体中没有任何控件的位置,在弹出的鼠标菜单中选择Object Browser,则弹出Object Browser对话框。

41Object Browser对话框中找到并选中Loadproject项,其右侧显示加载工程项的方法定义。点击[Copy To Clipboard] 按钮,则函数的定义已被复制到剪切板里。

进入MyHello.lsp的编辑器,把剪切板里的内容复制到MyHello.lsp程序的(princ)语句的前面。然后把这条新语句

(Odcl_LoadProject FileName [as Integer] [Optional] Reload [as T])

改为

(ODcl_LoadProject "MyHello")

4.2Object Browser对话框中找到并选中Show项,把Show方法的函数定义复制到MyHello.lsp程序的(princ)语句的前面。然后把这条新语句

(Odcl_Form_Show MyHello_DclForm1 [Optional] UpperLeftXCoordinate [as Integer] [Optional] UpperLeftYCoordinate [as Integer])

改为

(Odcl_Form_Show "MyHello" " DclForm1")

4.3完整的MyHello.lsp

(defun C:MyHello()

;确保加载ObjectDcl动态连接库

(if (not (member "objectdcl.arx" (arx)))

(arxload "objectdcl.arx" "加载objectdcl.arx 失败.")

)

;加载对话框odc文件

(ODcl_LoadProject "MyHello")

;显示DclForm1对话框

(Odcl_Form_Show "MyHello" " DclForm1");

(princ)

)

5.运行MyHello

进入AutoCAD2000,加载MyHello.lsp。执行MyHello命令,显示的对话框如图所示。


通过上面的讨论,我们已经对ObjectDCL有了一个初步的了解。MyHello对话框尽管太简单,但包括了创建ObjectDCL对话框和编写对话框驱动程序的基本过程。下一次,我们再编制一个复杂一点的对话框,并对控件的事件进行编程。

注:本文经作者同意在本站使用,本来要放到CAD杂志中,但由于杂志一直不能出版,故先在此使用。

本帖子中包含更多资源

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

x

评分

参与人数 1金钱 +20 收起 理由
pengq2010 + 20 好!

查看全部评分

本帖被以下淘专辑推荐:

 楼主| 发表于 2004-6-15 20:43 | 显示全部楼层

ObjectDCL学习笔记(2)

ObjectDCL控件的属性和事件

ObjectDCL 2.1的控件工具箱中,有30个控件,其中的部分控件是DCL没有的。让我们用常用的控件创建一个稍微复杂的对话框,以便对控件的属性设置、属性提取和事件进行讨论。

在设计对话框之前,建议还是先创建一个AutoLisp框架程序,文件名叫MySetVar.lsp,还是存放到D:\MyODcl文件夹中。

1.对话框的静态属性设置

1.1设计对话框

运行ObjectDCL.exe,进入ObjectDCL编辑环境。添加一个模式对话框Form,然后像图2.1那样,摆上各个控件。然后,以MySetVar.odc为名存盘。当然,还是保存在D:\MyODcl文件夹中。


1.2设置控件的属性

控件TextButton1:把Caption的属性值改为“浏览 <”。

控件TextButton2:把Caption的属性值改为“确 定”,把Enabled的属性值改为“False”。

控件TextButton3:把Caption的属性值改为“取 消”。

控件ComnoBox1:在List的属性值中输入:

AutoCAD DWG

MicroStation DGN

MapInfo MIF/MID

ArcViewGIS Shape

控件ComnoBox2:不做改动。

控件ComnoBox3:在List的属性值中输入:

1:500

1:1000

1:2000

控件OptionList1:不做改动。

1.3指定对话框的关联程序

展开工程结构树窗口中的Visual / Auto Lisp File name节点,双击图标,在弹出的“打开”对话框中选择我们已预备好的框架程序文件D:\MyOdcl\ MySetVar.lsp

2.给对话框的事件编程

在编辑器中打开对话框关联程序,MySetVar.lsp现在是下面的样子:

(defun c:MySetVar(/ #file #form #map #scale #type #stat)

; Ensure the ObjectDCL.arx file is loaded

(ObjectDCL_LoadArx)

; Call the method to load the odc file.

(Odcl_LoadProject "MySetVar" T)

; Call the method to show the dialog box

(Odcl_Form_Show "MySetVar" "DclForm1")

(if #stat

(progn

(setq #file (strcat "\n图形文件 = " #file))

(setq #form (strcat "\n数据格式 = " #form))

(setq #map (strcat "\n图幅编号 = " #map))

(setq #scale(strcat "\n = " #scale))

(setq #type (strcat "\n数据类型 = " #type))

(princ (strcat "\nMySetVar:" #file #form #map #scale #type))

)

)

(princ)

)

(defun ObjectDCL_LoadArx ()

;Ensure that the ObjectDCL.arx file is loaded into AutoCAD

(if (not (member "objectdcl.arx" (arx)))

(arxload "objectdcl.arx" "ObjectDCL.arx not found.")

)

)

2.1对话框初始化

选中对话框窗体,在事件(Events)窗口中,选中OnInitialize事件,点击Add to .Lsp File按钮,则在MySetVar.lsp中自动添加了如下所示的初始化函数:

(defun c:DclForm1_OnInitialize ()

(Odcl_MessageBox "To Do: code must be added to DclForm1" "To do")

)

把它改成下面的样子:

(defun c:DclForm1_OnInitialize (/strList)

(setq strList(list "图幅1" "图幅2" "图幅3"))

(Odcl_ComboBox_AddList "MySetVar" "DclForm1" "ComboBox2" strList)

(Odcl_Control_SetProperty "MySetVar" "DclForm1" "TextBox1" "Text" "")

(Odcl_Control_SetProperty "MySetVar" "DclForm1" "ComboBox1" "Text"

(Odcl_ComboBox_GetLBText "MySetVar" "DclForm1" "ComboBox1" 0))

(Odcl_Control_SetProperty "MySetVar" "DclForm1" "ComboBox2" "Text" (car strList))

(Odcl_Control_SetProperty "MySetVar" "DclForm1" "ComboBox3" "Text"

(Odcl_ComboBox_GetLBText "MySetVar" "DclForm1" "ComboBox3" 0))

)

2.2给浏览按钮TextButton1添加单击事件函数

选中TextButton1,在事件(Events)窗口中,选中OnClicked事件,点击Add to .Lsp File按钮,则在MySetVar.lsp中自动添加了如下所示的单击事件处理函数:

(defun c:DclForm1_TextButton1_OnClicked ()

(Odcl_MessageBox "To Do: code must be added to TextButton1" "To do")

)

把它改成下面的样子:

(defun c:DclForm1_TextButton1_OnClicked ()

(setq #file(getfiled "选择图形文件" "" "Dwg" 8))

(if #stat

(progn

(Odcl_Control_SetProperty "MySetVar" "DclForm1" "TextBox1" "Text" #file)

(Odcl_Control_SetProperty "MySetVar" "DclForm1" "TextButton2" "Enabled" T)

)

)

)

如果选择了文件,不但TextBox1有了值,而且令TextButton2使能。

2.3给确定按钮TextButton2添加单击事件函数

TextButton1类似,添加TextButton2单击事件函数并改成下面的样子:

(defun c:DclForm1_TextButton2_OnClicked (/ nIndex)

(Setq #file (Odcl_Control_GetProperty "MySetVar" "DclForm1" "TextBox1" "Text"))

(Setq #form (Odcl_Control_GetProperty "MySetVar" "DclForm1" "ComboBox1" "Text"))

(Setq #map (Odcl_Control_GetProperty "MySetVar" "DclForm1" "ComboBox2" "Text"))

(Setq #scale(Odcl_Control_GetProperty "MySetVar" "DclForm1" "ComboBox3" "Text"))

(Setq nIndex(Odcl_ListBox_GetCurSel "MySetVar" "DclForm1" "OptionList1"))

(setq #type

(cond

((= nIndex 0) "TXT数据类型")

((= nIndex 1) "DBF数据类型")

((= nIndex 2) "MDB数据类型")

)

)

(Odcl_Form_Close "MySetVar" "DclForm1")

(setq #stat T)

)

在本函数中,提取各参数值,并赋给相应的变量。

2.4给取消按钮TextButton3添加单击事件函数

TextButton1类似,添加TextButton2单击事件函数并改成下面的样子:

(defun c:DclForm1_TextButton3_OnClicked (/ nIndex)

(Odcl_Form_Close "MySetVar" "DclForm1")

(setq #stat F)

)

3. 运行MySetVar

进入AutoCAD2000,加载MySetVar.lsp。执行MySetVar命令,显示的对话框如图2.2所示。


点击浏览按钮,选中一个DWG文件;改动ComnoBox1/2/3的选项;改动OptionList1的选项。这时显示的对话框如图2.3所示。

单击确定按钮退出,屏幕输出结果如下:

Command: mysetvar

MySetVar:

图形文件 = DEmoEx.dwg

数据格式 = ComboBox1

图幅编号 = 图幅2

= 1:1000

数据类型 = MDB数据类型

Command:

通过这个练习,我们对ObjectDCL的对话框设计和编程应该有了一定的了解,认识到ObjectDCL的便捷、强大和美观。但如果只是为了完成这种对话框,使用ObjectDCL的意义就小多了。下一次,我们将对非模式对话框的设计和编程进行讨论。

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
tigcat + 1 很给力!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2004-6-15 20:46 | 显示全部楼层

ObjectDCL学习笔记(3)

非模式对话框和表格控件

在某些方面,非模式对话框是很有用的,可是DCL却不支持非模式对话框。即使用ObjectARX创建非模式对话框,也比较麻烦。而ObjectDCL不但支持非模式对话框,且驱动程序的编写也非常简洁。下面我们就创建一个带表格控件的非模式对话框来显示Acad图元的某些属性。

对话框文件名为MyModeless.odc,关联的Lisp文件名为MyModeless.lsp,还是都存放到D:\MyODcl文件夹中。

1. 创建非模式对话框

1.1设计对话框

运行ObjectDCL.exe,进入ObjectDCL编辑环境。在Projects菜单中选择添加非模式对话框菜单项(Add Modeless Form)就得到了一个非模式对话框,然后像图3.1那样,摆上一个ListView控件,一个Label控件,两个TextButton控件。

1.2设置控件的属性

控件ListView1:把ColumnHeader的属性值置为“True”,GridLines置为“True”,Style置为“3 - Report”,在ImageList中加入5个你喜欢的图标。

控件Label1:把Caption的属性值改为“图元数:0”。

控件TextButton1:把Caption的属性值改为“拾取图元<”。

控件TextButton2:把Caption的属性值改为“退 出”。

2.给对话框的事件编程

在编辑器中打开对话框关联程序MyModeless.lsp,然后依次添加对话框初始化事件、对话框关闭事件、TextButton1点击事件、TextButton2点击事件。最后完成的完整程序如下:

;主程序:拾取图元,并显示图元的属性

(defun c:MyModeless()

(ObjectDCL_LoadArx)

(Odcl_LoadProject "MyModeless" T)

(Odcl_Form_Show "MyModeless" "DclForm1")

(princ)

)

;确保将ObjectDCL.arx 载入 AutoCAD.

(defun ObjectDCL_LoadArx ()

(if (not (member "objectdcl.arx" (arx)))

(arxload "objectdcl.arx" "ObjectDCL.arx not found.")

)

)

;对话框初始化

(defun c:DclForm1_OnInitialize ()

;给表格添加表头

(Odcl_ListView_AddColumns "MyModeless" "DclForm1" "ListView1"

(list

(list 0 "图元类型" 0 100)

(list 1 "图层" 0 60)

(list 2 "颜色" 0 60)

)

)

(setq #IsShow T)

)

;单击TextButton1[拾取图元<]按钮

(defun c:DclForm1_TextButton1_OnClicked (/ nLine ent eData eType eLayer eColor nImage)

(while(and #IsShow (setq ent(entsel "拾取一个图元:")))

(if #IsShow

(progn

(setq ent(car ent))

;给表格添加新行

(setq eData(entget ent))

(setq eType(cdr(assoc 0 eData)) eLayer(cdr(assoc 8 eData)) )

(setq eColor(assoc 62 eData))

(setq eColor (if eColor (itoa(cdr eColor)) "随层" ))

(Setq nLine(Odcl_ListView_AddItem "MyModeless" "DclForm1" "ListView1"

(list eType eLayer eColor))

)

;给指定单元格设置图标

(setq nImage

(cond

((= eType "LINE") 0)

((= eType "LWPOLYLINE") 1)

((= eType "CIRCLE") 2)

((= eType "INSERT") 3)

((= eType "TEXT") 4)

(t 5)

)

)

(Odcl_ListView_SetItemImage "MyModeless" "DclForm1" "ListView1" nLine 0

nImage)

(setq nLine(strcat "图元数:" (itoa(1+ nLine))))

(Odcl_Control_SetProperty "MyModeless" "DclForm1" "Label1" "Caption" nLine)

)

)

)

)

;单击TextButton2[退出]按钮

(defun c:DclForm1_TextButton2_OnClicked ()

(Odcl_Form_Close "MyModeless" "DclForm1")

)

;处理对话框关闭事件

(defun c:DclForm1_OnClose (nUpperLeftX nUpperLeftY /)

(setq #IsShow F)

)

3. 运行MyModeless


进入AutoCAD2000,加载MyModeless.lsp。执行MyModeless命令,显示的对话框如图3.2所示,只是对话框中的表格是空白的。

点击拾取图元按钮,在Acad的命令行上出现提示:“拾取一个图元”。选择一个图元,则ListView中就添加一行记录。按鼠标右键,可退出选择图元状态,但对话框依然存在。你可以对Acad作其它操作。重新点击对话框的拾取图元按钮,又可以继续选择图元,显示图元的属性。选择了8个图元后的对话框如图3.2所示。

单击[退出]按钮,即退出对话框。

这个话题我们就讨论到这里。下一次,我们将对可停靠对话框和树形控件的设计和编程进行讨论。

本帖子中包含更多资源

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

x

点评

感觉不错,好好研究一下  发表于 2013-11-4 11:54
看来是你的opendcl的版本问题,我函数都不一样  发表于 2013-11-4 11:51
回复 支持 1 反对 0

使用道具 举报

发表于 2019-6-18 15:28 | 显示全部楼层
(dcl-ListView-SetItemImage XGGJToolsPanel/Form1/ListView1 Item [as Long] {Column [as Long]} ImageIndex [as Integer])   为什么我用这个添加的图像和文字不在一行呢,一上一下。这个改怎么解决呢,求助。
发表于 2004-6-15 20:43 | 显示全部楼层
希望能给个ObjectDCL安装包的下载地址。
 楼主| 发表于 2004-6-15 20:50 | 显示全部楼层

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] ; 展开节点图标索引

)

上面是不带参数表的函数形式,它们还有带参数表的函数形式,可参见ObjectDCLObject 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节点,可绘出蓝色的Text1Text2Text3三个文本图形。

这个话题我们就讨论到这里。下一次,我们将对配置表对话框(Config Tab)的设计和编程进行讨论。

本帖子中包含更多资源

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

x
 楼主| 发表于 2004-6-15 20:53 | 显示全部楼层

ObjectDCL学习笔记(5)

环境配置对话框ConfigTab的设计和调用

AutoCAD[文件]菜单中有一个“系统配置”菜单项,执行该菜单项对应的命令,会弹出AutoCAD的“选项”对话框,用户可以对Acad环境进行设置。在ObjectDCL 2.1中提供的Config Tab类型对话框,使用户可以向AutoCAD的“选项”对话框中附加一个自己定制的配置卡(属性页)。在某些场合,这项功能还是很有用的。这次就让我们设计一个配置对话框(Config Tab),并对其编程和调用方式进行讨论。

在设计对话框之前,建议还是先创建一个AutoLisp框架程序,文件名叫MyConfig.lsp,还是存放到D:\MyODcl文件夹中。

1. 创建自己的配置对话框

1.1设计对话框

运行ObjectDCL.exe,进入ObjectDCL编辑环境。在Projects菜单中选择添加配置卡对话框菜单项(Add Config Tab)就得到了一个配置卡对话框,然后像图5.1那样,摆上6Label控件,摆上6TextBox控件,2PictureButton控件和1PictureBox控件。


注意,对话框的大小最好就不必动了,免得最终显示时,各控件的布局不够协调。

1.2设置对话框和控件的属性

(1)在对话框的属性页中,把CfgTab的值改为:“我的配置 ”。注意其中的空格是故

意加的。

(2) 6Label控件的Caption分别改为图5.1那样的内容。

(3)6TextBox控件的Font分别置为“宋体”,Size设置为10

(4)2PictureButton控件的BackColor分别置为111Font分别置为“宋体”,Size设置为10Style分别置为“1 - FlatButton”,Caption分别置为“调入设置”和“保存设置”。

(5)PictureBox控件中调入一个图片,使整个布局美观协调起来。

现在,对话框应该是图5.1样子了。

2.给对话框的事件编程

2.1一个普通函数

先准备一个对AutoCADAcad.cfg文件进行操作的共用函数:

(defun LoadAndSetMyConfigValue()

; acad.cfg 文件的 AppData 段中检索数据

(setq #ProName (getcfg "AppData/MyConfig/ProName")

#MapNum (getcfg "AppData/MyConfig/MapNum")

#CreDate (getcfg "AppData/MyConfig/CreDate")

#Deviser (getcfg "AppData/MyConfig/Deviser")

#Assessor(getcfg "AppData/MyConfig/Assessor")

#Ratifier(getcfg "AppData/MyConfig/Ratifier")

)

;把检索出的数据置于文本框中

(if (not #ProName)(setq #ProName ""))

(Odcl_Control_SetProperty "MyConfig" "DclForm1" "TextBox1" "Text" #ProName)

(if (not #MapNum)(setq #MapNum ""))

(Odcl_Control_SetProperty "MyConfig" "DclForm1" "TextBox2" "Text" #MapNum)

(if (not #CreDate)(setq #CreDate ""))

(Odcl_Control_SetProperty "MyConfig" "DclForm1" "TextBox3" "Text" #CreDate)

(if (not #Deviser)(setq #Deviser ""))

(Odcl_Control_SetProperty "MyConfig" "DclForm1" "TextBox4" "Text" #Deviser)

(if (not #Assessor)(setq #Assessor ""))

(Odcl_Control_SetProperty "MyConfig" "DclForm1" "TextBox5" "Text" #Assessor)

(if (not #Ratifier)(setq #Ratifier ""))

(Odcl_Control_SetProperty "MyConfig" "DclForm1" "TextBox6" "Text" #Ratifier)

)

2.2对话框初始化函数

;对话框初始化

(defun c:DclForm1_OnInitialize ()

(LoadAndSetMyConfigValue)

)

2.3处理PictureButton按钮控件的单击事件

;TextButton1(调入设置)按钮的单击事件

(defun c:DclForm1_GraphicButton1_OnClicked ()

(LoadAndSetMyConfigValue)

)

;TextButton1(保存设置)按钮的单击事件

(defun c:DclForm1_GraphicButton2_OnClicked ()

;提取各文本框的当前值

(setq #ProName (Odcl_Control_GetProperty "MyConfig" "DclForm1" "TextBox1" "Text"))

(setq #MapNum (Odcl_Control_GetProperty "MyConfig" "DclForm1" "TextBox2" "Text"))

(setq #CreDate (Odcl_Control_GetProperty "MyConfig" "DclForm1" "TextBox3" "Text"))

(setq #Deviser (Odcl_Control_GetProperty "MyConfig" "DclForm1" "TextBox4" "Text"))

(setq #Assessor(Odcl_Control_GetProperty "MyConfig" "DclForm1" "TextBox5" "Text"))

(setq #Ratifier(Odcl_Control_GetProperty "MyConfig" "DclForm1" "TextBox6" "Text"))

;把各文本框的当前值写到 acad.cfg 文件的 AppData 段中

(setcfg "AppData/MyConfig/ProName" #ProName)

(setcfg "AppData/MyConfig/MapNum" #MapNum)

(setcfg "AppData/MyConfig/CreDate" #CreDate)

(setcfg "AppData/MyConfig/Deviser" #Deviser)

(setcfg "AppData/MyConfig/Assessor" #Assessor)

(setcfg "AppData/MyConfig/Ratifier" #Ratifier)

)

2.4 主程序

;主程序:在AutoCAD的系统配置对话框中添加自己的图形

(defun c:MyConfig(/ #ProName ;项目名称

#MapNum ;图纸编号

#CreDate ;创建时间

#Deviser ;设计者

#Assessor ;审核者

#Ratifier ;批准者

)

(ObjectDCL_LoadArx)

(Odcl_LoadProject "MyConfig" T)

(Odcl_Form_Show "MyConfig" "DclForm1")

(princ)

)

3. 运行MyConfig

进入AutoCAD2000,加载MyConfig.lsp。执行MyConfig命令后,Acad表面上没有任何反应,实际上已成功地创建了我们自己的配置卡。

执行AutoCAD[文件]菜单中的“系统配置”菜单项,AutoCAD弹出的“选项”对话框将如图5.2所示,出现了“我的配置”属性页,这正是我们所期待的,只是6个文本框是空白的。用户可往其中键入文字后退出。再打开AutoCAD的“选项”对话框,6个文本框中将显示你键入的文字。如果单击“保存设置”按钮,6个文本框中的内容将保存到AutoCADAcad.cfg文件中。

关闭Acad后重新运行Acad,加载MyConfig.lsp,执行MyConfig命令,执行AutoCAD[文件]菜单中的“系统配置”菜单项,AutoCAD弹出的“选项”对话框中,“我的配置”属性页中将自动显示你上次保存的内容,这是由于在对话框的初始化事件处理函数中,调用了(LoadAndSetMyConfigValue) 函数的缘故。


关于ObjectDCL,暂时就讨论到这里。

本帖子中包含更多资源

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

x
发表于 2004-6-15 21:06 | 显示全部楼层
太好了,很有用.
发表于 2004-6-15 21:13 | 显示全部楼层
没想到功能这么强大,还可以做停靠对话框,可惜不会用也没有 ODCL
发表于 2004-6-15 22:54 | 显示全部楼层
这么好的东西,应该打包,,,怎么不早点拿出来?省得我拿那么憋足的东西出来现眼了
发表于 2004-6-15 23:24 | 显示全部楼层
太好了,送给明兄2朵鲜花,可惜没法给李松鲜花!我也用了近1年的ObjectDCL,就知道它好用,怎么就不知道给大伙介绍一下它的功能呢?惭愧!!!看来我得努力啦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-24 04:32 , Processed in 0.383496 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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