CAD AUTOLISP 当中 (action_tile "accept" (done_dialog 1))

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CAD AUTOLISP 当中 (action_tile "accept" (done_dialog 1))相关的知识,希望对你有一定的参考价值。

(action_tile "accept" "(getdata) (done_dialog 1)") ;getdata调用的函数
(action_tile "cancel" "(done_dialog 0)");done_dialog 当点击按钮回传一个值
(setq std (start_dialog)) ;接收 action_tile回传值
(unload_dialog dlg_id) ;卸载对话框dcl
(if (= std 1)
(command "circle" (list x y) r)
)
(defun getdata()
(setq x (atof (get_tile "e_x"))) ;atof 字符串转换成实型数字
(setq y (atof (get_tile "e_y")))
(setq r (atof (get_tile "e_r")))
以上这样正确,但是
(ation_tile "accept" "(getdata) (drawcircle) (done_dialog 1)")
(action_tile "cancel" (done_dialog 0))
(setq std (start_dialog))
(unload_dialog dlg_id)
;;;;这样就错误 为什么 action_tile 后面不能用 自定义函数(drawcircle)
(defun drawcircle()
(command "circle" (list x y) r)
)

action_title (done_dialog 0) 外面要加上双引号。 参考技术A 对话框文件是扩展名为.dcl的文本文件,符合dcl对话框控制语言的语法。但对话框文件本身并不能工作,还必须要用autolisp或ads应用程序调用。

对话框由主对话框和其内部的各种片型框组成,其结构为数状。图1.1为一对话框结构示例,树叶是各种片型框,树根为dialog;图1.2为其在autocad中的显示。
在可编程对话框pdb中已预定义了以下基本片型框:

:dialog 对话

:button 按钮

:edit_box 编辑框

:list_box 列表框

:image_button 图像按钮

:popup_list 弹出表

:radio_button 单选按钮

:slider 滚动条

:toggle 开关

每个片型框包含一系列的属性,这些属性的值确定了片型框的位置、大小、长度、高度和文件标识等,例如lable属性确定了在片型框上显示的文字。用户可以根据dcl语法将这些基本的片型框组装起来,形成更为复杂,功能更为详尽的对话框,也可以定义与基本片型框无关的新片型框,并将其与基本片型框组合成新的片型框组。为了方便对话框的布局,可将一行或一列片型框当作一个新的片型框,并在其周围画上边框。对话框的基本布局有以下几种:

:column 列。定义,可以与行、列嵌套。

:row 行。片型框组按行平行分布,显示顺序同column,也可与行列嵌套。

:radio_column 单选列。包含一列单选片型框,同时只能选择一个片型框。

:radio_row 单选行。包含一行单选片型框,同时只能选择一个片型框。

:boxed_column 有界列。列的周围画上边框。

:boxed_row 有界行。行的周围画上边框。

:boxed_radio_column有界单选列。在单选列的周围画上边框。

:boxed_radio_row 有界单选行。在单选行的周围画上边框。

用户可以定义自己的属性,不过在一般情况下仅使用pdb预定义的属性就可以满足程序的要求了。当片型框中的属性未被指定时,pdb将赋于其缺省值。没片型框的预定义属性也各不相同,但布局属性和功能属性则是所有有效片型框的公共属性,这些公共属性是:

aligment 片型框的定位方式;

width height 片型框的宽度和高度;

fixed_width fixed_height 其值为true时,片型框大小固定不变;

children_aligment 子片型框的定位属性;

children_fixed_width 子片型框的宽度固定属性;

children_fixed_height 子片型框的固定高度属性;

label 显示在片型框内或左上方的文字;

key 指定程序引用片型框的文本字符串,在指定的对话框中,每个key的值应该是唯一的;

value 片型框的初始值,为一字符串;

mnemonic 片型框内快捷键,即带下划线的字母;

is_enabled 值为false时,片型框不可选;

is_tab_stop 值为false时,片型框不接受tab聚焦;

action 指定片型框时,对应的autolisp程序进行的操作。

另外,片型框还包括图像框image、文本框text和衬框spacer,这三种片型框只是起修饰作用和加强视觉效果,不能引起任何操作。

dcl文件采用c语言的风格,每个分号表示一名,每个片型框的定义用一对大括号括起来;注释在单行时用//,多行时可采用/*注释语句*/的形式。

下面以一个简单的例子说明dcl的编程,图2是调用example.dcl的显示。

//example.dcl对话框示例文件

test:dialog

label="dialog example";

:text//文本片型框

label="this is aexample.";



:button//按钮片型框

key="accept";

//关键字key为accept

label="ok";//标号为ok

mnemonic="o";

//按alt_o键可以选择ok按钮

fixed_width=true;

//按钮的宽度固定不变

aligment=centered;

//按钮以中心对齐

is_default=true;





pdb在base.dcl中还提供了一组标准的按钮群,在我们自己的dcl文件中可以直接使用:

:ok_only单个ok按钮;

:lk_cancel ok按钮和cancel两个按钮;

:ok_cncel_help ok、cancel和help…三个按钮;

:ok_cncel_help_info ok、cancel、help…和info…四个按钮。

文本文件的对话框文件自身本身不能工作,需要用autolisp或ads应用程序调用对话框文件才行,ads的效率比较高,但掌握起来要困难一些,autolisp程序较为烦琐,但比较容易掌握。autolisp提供了一组管理对话框的函数包,处理用户与对话框之间的交互。下面是最重要的几个函数:

(load_dialog dclfile)用与装入一个dcl文件,返回一个整数标识。

(unload_dialog dcl_id)卸载标识为dcl_id的dcl文件。

(new_dialog dialog_name dcl_id)初始化对话框,并在屏幕显示对话框,其中dialog_name是在对话框文件中定义的对话框名称。

(start_dialog)启动对话框,并接受用户的输入信息。

(done_dialog)终止对话框信息的输入,并且停止显示对话框。

(action_tile key action_express)处理用户的选择,将片型框与应用程序中的对应操作联系起来,key是片型框的关键字。

下面的autolisp程序就是对上面的example.dcl对话框文件的管理:

;;;example.dcl管理example.dcl对话框文件的autolisp程序

(defun c:showdcl(/dcl_id)

(setq dcl_id (load_dialog"example.dcl"))

(if(not(new_dialog"test"dcl_id))

(exit))

(action_tile

"accept"

"(done_dialog)")

(start_dialog)

(unload_dialog dcl_id)

)

在autocad中显示图2对话框的过程如下:

command:(load"example.lsp")

c:showdcl

command:showdel
参考技术B 追问

啥意思啊,哥们。

autolisp用substr截取汉字?

autolisp用substr截取汉字出了点小问题。在CAD里直接在命令行里输入(substr "222图层" 4 7),得出结果正确,如图;如果使用加载命令加载这一段代码的lsp文件就出错,如图。

你这个问题应该是中文编码出现的问题;你要用vlisp编辑窗口打开代码后,看里面的字符串是不是乱码了,如果乱码了在编辑器里面重新输入一下就可以正常显示了追问

这样子是可以,但总不能每次加载后再打开编辑器再重输入呀,有没有办法一次搞定不乱码呀

追答

正常来讲你是用编辑窗口进行编辑的,但是你应该是用其它编辑器编辑好了,然后再加载的;你如果按正常的思路,在编辑器窗口编辑就不会有这个问题;我也是用其它编辑器编辑好,然后再到lisp编辑器里看一下,中文是不是有问题,有问题,就把代码全部复制粘贴,在编辑器里面覆盖粘贴一次就OK了,粘贴一下也不费事
如果想彻底解决第三方编辑器的问题,你可以去了解一下中文编码,一般第三方编辑器都会有编码方式的设置。

追问

我大概懂你的意思了,我这边代码是我在txt里拼凑出来的,拷过来的,我现在粘贴到编辑器里把中文改掉,然后是手动考出来还是可以另存为一个lsp文件呀?我手动考出来还是乱码的,这个编辑器我没用过(本人是小白),是不是要新建一个工程什么的才能保存呀

参考技术A 自定义一个判断汉字个数的函数,在判断就可以了
;(strnum "df的");返回结果---> 3
(defun strnum (str / i strx)
(if (= str "")
(setq i 0)
(progn
(setq i 0)
(setq strx (vl-string->list str))
(while
(if (< (car strx) 129)
(setq i (1+ i)
strx (cdr strx)
)
(setq i (1+ i)
strx (cddr strx)
)
)
)
)
)
i
)
参考技术B 1个文字占2个位置,数字字母占1个位置所以:
(substr "222图层" 4 7)跟(substr "222图层" 4 4)一样,返回:图层
(substr "222图层" 4 2)返回:图
(substr "222图层" 4 1)、(substr "222图层" 4 3)返回的后面那个字只有一半所以返回错误
(substr "222图层" 5 4)指针指向半个文字,所以返回错误
(substr "222图层" 6 4)返回:层

以上是关于CAD AUTOLISP 当中 (action_tile "accept" (done_dialog 1))的主要内容,如果未能解决你的问题,请参考以下文章

vba在cad中画直线和圆弧多段线

Auto cad中的LISP语言是啥?有怎样的用途?

cad lisp脚本 修改

请问 哪位大哥熟悉CAD二次开发ObjectARX CAD请进

Auto CAD 2006 中的英语解释

auto cad 的命令。