Autolisp编程心得.docx
《Autolisp编程心得.docx》由会员分享,可在线阅读,更多相关《Autolisp编程心得.docx(15页珍藏版)》请在冰豆网上搜索。
![Autolisp编程心得.docx](https://file1.bdocx.com/fileroot1/2022-10/9/1a7cec28-a92d-47c5-af8e-882697acfac4/1a7cec28-a92d-47c5-af8e-882697acfac41.gif)
Autolisp编程心得
编程心得
1.养成良好的书写习惯
众所周知,是一种表结构语言,括号必须成对出现,在调试时往往为遗漏了一个括号大
费周折,所以,养成一个好的编程习惯是学好所必须的。
⑴选择一个较好的编辑器,这是一个基本条件,建议使用编辑器或等
专用编辑器,此类编辑器可以对函数突出显示。
⑵按()专有格式书写,并经常对程序进行“格式化”,及时发现语法错误,并有
利于调试是查找错误。
⑶使用自定义函数,并辅助以适当得注释,在较大程序中按功能使用自定义函数可以使得程
序条理化。
2.函数中循环与转移的使用
在高级语言中一般有类似“”的语句实现转移,在中没有转移的函数。
我们可
以使用自定义函数实现转移,用及辅助实现条件转移。
当我们需要实现在满足一定条件时进行循环的功能,一般使用函数,但有时需要判断
的条件较复杂时,使用函数往往不能实现或使得程序不够简洁。
这时我们可以使用“转移”,
将需要实现的功能作为(子)函数,使用恰当,可以在程序中任意“转移”。
一般认为,当一段代码在不同处重复使用时,我们才会使用子函数定义,其实,利用函数的
更大的优点是使得程序更加结构化。
这就使得我们不必拘泥于程序中的循环语句,而使用函数的
循环调用,辅助适当的判断,实现“转移”,如>>A。
当然也可以进行自身调用,构成一个
“标准的”循环。
如例一中,“程序执行完毕返回”与“空选返回”两种情况如果使用循环语句,其条件是完
全不同的,而将函数本身作为子函数调用,程序简洁明了。
3函数中关键字“”(空格)的使用
空格可以被用作关键字,一般多用来定义鼠标右键退出。
⑴当用户输入函数不支持控制位(如、、)时,可直接使用
“("")”。
⑵当用户输入函数支持控制位(如等)时,可使用“(1"")”禁止空输
入,而将回车等空输入作为关键字使用。
⑶当同时使用其它关键字时,应该将空格作为一系列关键字的最后一个,用
“("C")”(两个空格)调用,否则无效。
见例一。
************************************************
;;例一
(()
("C");关键字“C”及空格
(s0("\n设置颜色C/选取文本:
"))
(
((=s0"C")());转设置颜色子函数
((=s0""));空格退出
(((=(s0)');选择实体
(=((0((s0))))"");判别文本
)
...;操作内容
();编辑后返回选择
)
(t());空选返回选择
)
)
************************************************
有时需要进行复杂的判断,使用如“(=s0"")”语句可能不能准确判别输入的空格关键字
与空选择,可以使用“(=(s0)')”语句。
4的暂停与的特殊使用
一般在交互输入时才会暂停,如果只需要实现屏幕显示暂停,可使用函数,
函数对所有合法的输入设备均会作出反应,有时我们只希望对键盘有反应,可使用
函数进行循环。
*******************
("\:
")
(((())2))
*******************
用于满足一定条件的循环,其标准语法为:
([...])
其中解释为“在为之前要求值的一个或多个表达式”,为可选项(在
R14之前没有方括号,但仍为可选项)。
正常我们使用时,总会有项,更多的时候,我们是为了项才会使用这种循环
语句,所有我们往往有项是不可缺少的感觉。
这里我们使用函数的语法是函数的
特例,即没有项的情况。
如果希望对鼠标右键同时反应,可以使用:
*******************
("\:
")
((((a(()))2);键盘
(a11);鼠标右键(=0)
(a25);鼠标右键(≠0)
)
)
*******************
5.输入距离
语言中输入距离的函数为,但我们有时需要输入负值,有时需要在输入距离的
同时得到角度,使用函数就显得无能为力,这时,我们可以灵活使用其它交互输入函数
如、等,通过计算得到我们所需要的值。
例二是一段输入长度的同时得到默认角度的代码,使用函数。
************************************************
;;例二
(0("\n直线基点:
")
1(0"\n直线长度:
");长度及角度可用键盘或鼠标定位
(01);计算长度
(01);计算默认角度
1(0("\n直线方向<"
(1)">:
"))
)
************************************************
例三是可以按阵列方式输入行列间距的代码,输入距离为正值,修改部分代码可输入负值,
使用函数,同时使用的控制位128。
************************************************
;;例三
(()
(128);允许任意输入
(("\n指定单位单元或输入行间距:
"))
((=()');鼠标输入
(
(1)
(("\n指定对角点:
");鼠标输入对角
((-()()));正值行距
((-()()));正值列距
);计算行列间距
)
((=()');键盘输入行距
((());判断输入的是否距离
(
(6)
(("\n输入列间距:
"));输入列距
)
(;键盘输入格式不符返回
("\n需要正数值或两个二维角点。
")
()
)
)
(;空输入返回
("\n需要正数值或两个二维角点。
")
()
)
)
)
)
************************************************
6.数学运算函数的数量界限
在中对表中数据进行求和、求最大值等数学运算时,往往直观的对表直接赋予运算函数,
使用语句如“(('))”,一般都可以进行计算,但当表中数据数量大于
255时,将会出现错误“:
:
256”。
对于这种情况,我们不必对数据表进行分段,可以直接使用函数,语法更简单:
(
')。
可将数据表传送给指定的函数进行求值而不受数据数量的影响。
受表中数据数量影响的数学运算函数有:
+、-、*、/、、、及。
7.选择集与表
选择集是一种特殊结构的表,只能通过特定的函数进行操作,但这些函数对大量重复的操作
只能通过循环实现,显得力不从心,不能体现语言表结构的优越性。
其实我们只要通过存取实体名或实体句柄,将它们存为一个普通结构的表,完全可以通过常
规表操作函数实现对实体的操作。
例四是一段使用、函数联合求文本选择集中文本基点最大y值得代码,只是一个
示例,如果结合函数,可轻松实现对文本的排序。
************************************************
;;例四
(i-1)
(((('((0."")))));选择文本
(i(1+i)
(i);从选择集中取出文本
();构造包含实体名的表
)
)
((';求文本基点最大y值
(
'((x)
((10(x)));提取y值
)
)
)
)
************************************************
当然,选择集也有其优势的一面,比如对选择集中实体的删除操作非常简单、选择集中的实
体不会重复及选择集可以与命令交互使用等特征是一般表所不具备的,所以,编程时应根据
程序要求,灵活运用。
8的使用与加载
随机附带了一些外部定义命令,其中(计算器)命令是最常用的命令之一,在加载
后可以在程序中像其它函数一样使用,这就使得我们在程序中对文本的四则
运算处理变得简单,如“("1+2/3")”,其中字符串"1+2/3"可以从图形的文本中提取,也可
以是符合要求格式的任一字符串(详见联机帮助)。
需要注意的是,在中只能加载一次,重复加载将使以外退出(无提示)。
需要使用函数的程序,应在程序尾部加上以下代码:
*******************
(((=()')14使用
(=()')2000+使用
)
("")
)
*******************
9处理
一个完善的程序应该有较好的出错处理,这是在所有教材上都提及的,但程序的处理就说得很少或没有提及。
其实处理对程序来说也是非常重要的,尤其对有较多输出的复杂程序而言,不能解决问题,使用起来会极不方便。
对于问题的解决,一种方法是尽量少用或不用函数,即不调用原始命令,这是一种较好的方法,但必须注意的是,一段程序必须至少有一次调用函数,否则命令将取消程序运行前的前一次命令,解决的方法是在程序运行的起始位置加一个无谓的,如“("""")”。
有时不使用函数不能达到我们要求的一些功能,或使得程序过于复杂,我们可能需要使用一些函数(原始命令),这是就应该在程序中进行处理,即使用命令的编组功能。
例五是一段程序出错函数与处理的示例。
************************************************
;;例五
((s);出错函数
(s
(
();使用对话框时使用
((**));出错函数恢复
((...));系统变量恢复
((**));出错函数恢复
("""")编组结束
)
)
()
)
((/...);主程序(主函数)
(""0);取消命令回显提示
("""")编组开始
(****);调用自定义出错函数
((...));保存相关系统变量
(...;设置系统变量
...;程序段
...
(...);恢复系统变量
(**);恢复出错函数
("""");结束命令编组
();取消程序返回值
)
************************************************
10.程序调试时块注释的使用
我们经常会加上或屏蔽一段代码辅助程序调试,此时最常用的是在需要暂时屏蔽的代码前使
用行注释符号“;”,对于较多的代码就需要使用块注释“——|;”,如果一段代码需要频繁屏蔽,将行注释与块注释组合使用,可以带来极大方便。
下图是组合使用的示例。
附带了这个的图片:
编程技巧摘要
(1)
;;;**********************************************************
1.如何获取多义线上的所有顶点
:
((/n)
()
(("\n选取多线:
\n"))
(
(
(((0(()))))
(((="")(=""))
(
((>()))
(())
((>()))
(n0)
()
((/()2)
(((((n)((1