找回密码 注册 QQ登录
开思网工业级高精度在线3D打印服务

iCAx开思网

CAD/CAM/CAE/设计/模具 高清视频【积分说明】如何快速获得积分?快速3D打印 手板模型CNC加工服务在线3D打印服务,上传模型,自动报价
查看: 16556|回复: 2
打印 上一主题 下一主题

【转帖】利用AutoLISP开发大型项目

[复制链接]
跳转到指定楼层
1
发表于 2003-11-5 15:46:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多同行朋友,交流,分享,学习。

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

x
无论利用ADS还是 AutoLISP,开发大型项目都需要组织编排。  
本文为编程人员拟定了 一个基本框架。  
保证开发工作容易  
  
许多人喜欢用 AutoLISP 来做常用的小程序和小项目,其原因是一目了然的。例  
如,由于 AutoLISP 的解释器嵌入在 AutoCAD 内部,在命令提示行内输入  
AutoLISP 函数就可以立 即获得响应。如果你熟悉 AutoLISP 的标准函数调用,  
就可以用:  
  
(min (/11.0 8.5) (/17.0 11.0)) 1.29412  
  
找到从A号图幅(8 .5 x 11 英寸)转换到B号图幅(11 x 17 英寸)的准确比例值。  
  
假设你在当前图形中使用过多次名为XXYY的图块,但是不知道确切的使用数量,  
没有现 成的 AutoCAD 命令能提供这一信息,而编写一段ADS程序来求解又耗时  
太多,这时你可 以键入:  
  
(sslength (ssget "x" ((0 . "INSERT") (2 . "XXYY"))))  
  
但有的情况并非限于简单的查询或计算程序,而可能是几百行甚至上千行的程  
序。此时就 需要写成一个文件或多个文件,以便于存储和编译。对这种规模的  
程序项目,大量的形式 化的程序规划和设计通常都是不需要的。如果你对问题  
很熟悉,很多程序可以快捷地完成  
  
。你可以在下述编程语言中作出选择:AutoLISP, ADS 或在 Windows 环境下任  
何一种支 持动态数据交换(DDE)的程序语言,例如 Visual Basic 或 Borland  
公司的Delphi。  
  
如何在诸多编程环境中作出选择?主要考虑的因素是对编程语言的使用经验。只  
熟悉 C/ C 的人趋向于选用ADS,而对 AutoLISP 和C都熟悉的人就可以考虑实  
用的需要。数学 计算量大的程序用C语言比较有利,因为它是经过编译的。引用  
很多 AutoCAD 命令或包 括大量用户输入的程序采用ADS不见得有帮助。通常人  
们倾向于使用 AutoLISP,因为在 AutoLISP 中返回一个实体数据表比在ADS中使  
用结果缓存器的链表要简单得多。  
  
通常对 AutoLISP 而言,1000行的代码已经是很长的程序了。人们通常认为  
AutoLISP 不 适用于大型程序项目,而应该采用C语言。然而,有人曾经在一些  
大型项目中编写过30000 多行的 AutoLISP 程序代码,并成功地运行。当然,无  
论使用哪种语言,如此大型项目的 编程工作都必需进行编程规划和设计。  
  
※来源: 华南木棉站 bbs.gznet.edu.cn --  
※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: 202.103.155.25]  
发件人: wenxr.bbs@melon.gznet.edu.cn  
收件人: wenxr@nease.net  
主题: [转寄] 利用AutoLISP语言开发大型项目(转贴)(2)  
日期: 1998年10月26日 0:19  
  
发信人: Qlin@kapok (Qlin), 信区: CAD  
标 题: 利用AutoLISP语言开发大型项目(转贴)(2)  
发信站: (Sat Jul 26 14:54:24 1997)  
转信站: kapok (local)  
  
编程规划  
  
组织编排大型项目可以用多种方法,下列步骤对规划大型项目通常是必需的:  
  
制订项目计划  
编写用户使用与需求说明  
程序设计  
编程  
测试与调试  
后期规划和推出软件成品  
软件维护与文档制作  
  
项目计划是对项目要完成什么,由谁完成,什么时间完成的一个大纲。项目计划  
通常采用 的形式可以是简单文字、文档文件或规划软件中的甘特图表。在需要  
分配多种资源(例如 人力与硬件设备)的情况下,采用规划软件是很有帮助  
的。  
  
在编写用户使用与需求说明时,要包括从用户观点提出的对系统的预期目标。这  
个过程包 括对现有系统的分析、对用户们的访问、进行可行性研究并确认优越  
性。在确定需求的过 程中,必需要有大量的反馈信息。特别是在包括好几个分  
组而且信息描述更为详尽的时候, 你可能要生成需求文档的多次修订版本。生  
成多次的修订版本并不是坏事,因为在早期的 制订需求与系统设计阶段发现错  
误并进行更正,比在已经完成设计、编成程序和通过若干 测试等阶段后再修改  
程序要省事得多。  
  
在软件开发中常犯的两个错误是在程序设计决策过程中缺少最终用户的参与和不  
了解用户 的文化背景或使用环境。虽然你可能觉得已经确切地了解用户的需  
求,但是让他们在更早 的阶段参与设计,并且参加设计的全过程更加重要。因  
为这样可以使他们具有主人翁意识 并接受开发出的最终产品。  
  
程序设计  
  
程序设计过程分为两部分,第1部分是确定程序的外观与操作即外部设计;第2部  
分是定 义系统的结构体系,即程序如何运行的设计,这是内部设计。  
  
构思周密的外部设计可能需要一本内容繁多的文档来定义,对 AutoCAD 应用系  
统来说, 外部设计通常包括对全部系统功能的描述、菜单及其功能、对话框、  
报告、符号(图块) 和图框、图层设置、颜色、线型和用户输入及编辑等项内  
容。该文档应该和用户使用指南 相类似,它将成为以后编制的用户使用指南的  
基本部分。因为它的读者对象是用户,所以 该文档应写得尽量通俗易懂(尽可  
能避免使用编程专用的技术术语)。  
  
有一些内部设计方法可供选用,包括自顶向下的结构化、自底向上的数据流或面  
向对象的 设计方法。有些人在开发中比较喜欢一种利用功能分解的、改进的自  
顶向下的设计方法, 开始时在最高层次定义一些需求模型,然后把每一模型分  
开或分解到能直接转换为代码的 程度。然而在设计过程的早期,利用一切机会  
来定义所谓的应用模型(最底层),使它们 能在整个设计过程都可使用。这些  
应用模型应该尽可能是通用的,不仅在本项目而且在今 后的项目中也能反复使  
用。  
  
上述分解是以功能为基础进行的。但试图把多种功能塞进一个函数是不明智的,  
这容易导 致设计思路混乱,并显著增加程序测试的难度。  
  
函数之间的通讯应尽量通过参数传递而不应该通过全局变量。使用参数传递有多  
种理由。 第一,依赖于全局变量的函数使程序测试变得更为困难,因为它们依  
赖函数以外的信息。 第二,在使用多个 AutoLISP 程序定义的环境中,可能由  
于使用相同名称的全局变量而导 致出现程序相互干扰的情况。  
  
※来源: 华南木棉站 bbs.gznet.edu.cn --  
※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: 202.103.155.25]  
发件人: wenxr.bbs@melon.gznet.edu.cn  
收件人: wenxr@nease.net  
主题: [转寄] 利用AutoLISP语言开发大型项目(转贴)(3)  
日期: 1998年10月25日 23:53  
  
发信人: Qlin@kapok (Qlin), 信区: CAD  
标 题: 利用AutoLISP语言开发大型项目(转贴)(3)  
发信站: (Sat Jul 26 14:55:16 1997)  
转信站: kapok (local)  
  
协同操作指南  
  
在程序设计和编程时,应该考虑多个程序和平共处的能力。为了提供各类整体解  
决方案, AutoCAD 需要一些第3方应用软件产品,为了解决由于这些应用软件在  
AutoCAD环境中 协同作业而可能发生的问题,Autodesk 制订了“R13 应用程序  
协同操作指南”,它涉及下列基本问题:  
  
开发者登录名  
应用程序目录结构  
搜索路径的ACAD环境变量  
支持文件名  
命令重定义  
命令、符号表、程序文件和程序符号命名  
  
基本上,这些问题的处理原则是分配一个唯一的由4个字符组成的开发者/应用程  
序标识符 (ID),该标识符用作所有全局和公用资源名称的前缀,例如全局变  
量名、供存取扩展实 体数据(XDATA)用的REGAPP符号名和程序名等等。  
  
编程/测试  
  
编写程序自然是程序设计的后续工作。在编程时通常采用两种处理方法,这就是  
自顶向下 和自底向上的编程方法。在采用自顶向下的编程方法时,应从建立顶  
层模型开始,然后逐 级向下,同时测试各级模型。当测试中调用到尚未编写的  
下一层模型时,可以造一个“桩 函数”。“桩函数”就是定义一个简单函数,  
使它调用时总是返回一个固定值(或者没有 返回值),在下一步编程中,再用  
完整的模型来替换这些“桩函数”。  
  
另一种方法时从编写最底层的模型程序开始,测试每一个程序,然后按层次结构  
关系顺序 地向上处理上层模型。这种方法的优点是不需要构造“桩函数”,自  
下而上的编程方法往 往是被优先考虑的方法。  
  
函数定义的规模大小极大地影响到程序的可读性、可重用性和测试的难度(程序  
可能运行 的分支数目)。函数定义的规模愈大,要了解它的难度也愈大。按通  
常的规则,一个函数 定义大约包含10到100行(每行通常都要调用若干其它函  
数)。  
  
创建某一函数定义时,应该让所有变量均为全局变量,这对测试是很有帮助的,  
因为检查 变量的值可以找到出错的来源。然而,这种处理可能引发一些问题。  
当变量在局部变量表 中作出说明时,程序员可以确保在启用这个函数时这些变  
量的值为nil。而使这些变量成为 全局变量就意味着在第一次测试后,这些变量  
已赋了值。一个最好的策略是不依赖局部变 量表,而是清晰地把它们的初值设  
为nil(用setq函数)。  
  
利用 trace 和 untrace 函数有时很有帮助。利用 trace 函数为每个特定的函  
数设置一个标 记,来表明已进入或退出该函数。trace 函数根据函数调用的层  
次缩进显示函数调用信息。 同时显示传递给函数的参数的值和函数的返回值。  
下面是 trace 函数跟踪一个简单的递归 调用的阶乘函数的例子:  
  
Command:  
(defun fact (n)  
(if (= n 1) n (* n (fact (1- n)))))  
FACT  
Command: (trace fact)  
FACT Command: (fact 3)  
Entering FACT: 3  
Entering FACT: 2  
Entering FACT: 1  
Result: 1  
Result: 2  
Result: 6 6  
  
通常,了解变量在进入函数和退出函数时的值会有助于发现问题,但这对于发现  
产生问题 的所在是不够的。因此你必须深入分析函数的内部运行情况。一种方  
法是在函数的关键部 位设置 getstring 函数,该函数可以设置在进入一个循环  
之前(调用 while 或 foreach 函数 时),在循环内部,在一次插入调用之前  
等等。getstring 函数给测试者能中断程序运行的 机会(相当于或  
的功能),当程序停止运行后,就可以检查程序变量的值。 Getstring 函  
数还可以告诉你程序运行的当前位置:  
  
(getstring "\nAbout to enter the while loop")  
  
※来源: 华南木棉站 bbs.gznet.edu.cn --  
※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: 202.103.155.25]  
发件人: wenxr.bbs@melon.gznet.edu.cn  
收件人: wenxr@nease.net  
主题: [转寄] 利用AutoLISP语言开发大型项目(转贴)(4)  
日期: 1998年10月26日 0:21  
  
发信人: Qlin@kapok (Qlin), 信区: CAD  
标 题: 利用AutoLISP语言开发大型项目(转贴)(4)  
发信站: (Sat Jul 26 14:55:44 1997)  
转信站: kapok (local)  
  
比利用 getstring 函数更为有效的方法是设计一个 debug 函数,调用该函数可  
以在程序运 行中显示变量的值,该函数提供一个用于显示变量名和值的表,也  
能处理数据类型为表的 变量,并把表的每一个元素按行显示以增强可读性。下  
面给出 debug 函数的定义及调用情 况。  
  
Command: (setq real 1.5 listvar (1 (2 3) 4) el (entget (entnext)) int 1)  
1  
Command: (debug (Before entering loop real listvar int el))  
Before entering loop-->  
REAL: 1.5  
LISTVAR:  
(  
1  
(2 3)  
4  
)  
INT: 1  
EL:  
(  
(-1 . )  
(0 . LINE)  
(8 . 0)  
(10 4.3984 6.9283 0.0)  
(11 7.7934 6.3425 0.0)  
(210 0.0 0.0 1.0)  
)  
  
(defun debug (lst / x xe)  
(terpri)  
(foreach x lst  
(if (= (type (eval x)) STR)  
(progn  
(princ x) (princ "-->\n")  
)  
(progn  
(if (= (type (eval x)) LIST)  
(progn  
(terpri)  
(if (= (type x) SYM)  
(progn (terpri) (princ x) (princ ":"))  
)  
(princ "\n (" )  
(foreach xe (eval x)  
(princ "\n ")  
(if (and (= (type xe) LIST) (= (type (car xe)) LIST)  
  
)  
(progn  
foreach xee xe  
(princ "\n ")  
(prin1 xee)  
)  
)  
(prin1 xe)  
)  
)  
(princ "\n )")  
)  
(progn  
(terpri) (princ x) (princ ":") (prin1 (eval x))  
)  
)  
)  
)  
)  
(princ)  
)  
  
一旦测试通过底层的函数定义,就可以把它们的变量分别加入到局部变量表中。  
保证调用 的变量为局部变量,这可以减少产生副作用的机会,即避免由于若干  
函数采用同名变量而 引起的干扰与混淆。这种情况在面向对象的程序设计中称  
为“封装”。当底层的函数定义 和较高层的函数定义组合在一起后,还要再进  
行测试。该过程一直继续下去,直至到达顶 层并同时进行系统测试。在顶层所  
发现的错误大都涉及不同函数定义之间的交互作用。你 可以通过尽量减少使用  
全局变量的方法来减少这类错误。在函数之间的信息传送要尽可能 利用参数。  
  
后期规划和推出成品  
  
后期工作不一定象系统设计与编程那样进行规划,但它对用户的使用效果和认可  
程度是关 键的。后期规划大致应包括下述工作,如用户培训、安装、问题报  
告、软件校验规程和并 行测试等。用户培训对成功地使用软件是一个关键。缺  
少培训,无论系统有多好的设计,用 户都不可能有效地使用和喜欢这一系统。  
  
除非你编写程序只是为自己使用,一般不清楚用户将会如何使用该程序。因此,  
让用户在 实际使用软件之前有机会测试程序是很重要的。软件维护与文档制作  
软件维护与文档制作 是密切联系的。这不是因为文档是规划表中的最后一项而  
去制作,(如果是最后一项,就可 能永远不去做了。)而是因为文档制作改进了  
软件维护,而且应该在维护过程中不断改进。  
  
用户文档的大部分应该来自需求说明文件,应该常把需求文件交给用户,为他们  
增添用以 了解软件设计方式和过程处理信息的机会。  
  
系统文档应尽量在程序源代码中予以保留。只编写大而详细的外部文档可能很快  
地会过时。 为了解决这一问题,可以把一些外部文档制作成综述性的文档。这  
样,它们在整个软件生 命周期中就不可能有多大的变动。  
  
大型项目和工具  
  
上述建议不仅可用于 AutoLISP,而且也适用于其它编程语言。然而,AutoLISP  
具有同时 用于开发小型和大型项目的一些独有的优点。这些优点包括  
AutoLISP 的交互作用和可利 用灵活的表数据结构,用以控制各式各样的图形数  
据。AutoLISP 中的很多函数都支持表数 据结构。在其它语言中表达复杂的图形  
数据可能是额外的编程工作,它可能会使你进入指 针的“迷宫”或需要编写专  
门的支持程序,而在 AutoLISP 中,利用简单而功能强大的表 结构通常可以满  
足结构化数据方面的所有需求。  
  
另外,出现在第3方市场上的辅助工具也有助于 AutoLISP 能同类似C语言(具有  
一个丰 富的编程环境的语言)那样的语言竞争。这些辅助工具包括 用于  
AutoLISP的语法检查编 辑器、调试器、库和代码分析器。  
  
用AutoLISP开发大型项目不仅是可能的,而且也是理想的选择。所以,根据你的  
经验和需 求来选用一种语言,遵循一种结构化方法规划、设计和完成。在过程  
中自始至终与用户密 切配合,所有这些都是出色完成项目开发的关键。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 赞一下!赞一下!
2
发表于 2006-5-18 22:47:06 | 只看该作者

马上注册,结交更多同行朋友,交流,分享,学习。

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

x
3
发表于 2006-5-19 00:25:41 | 只看该作者

马上注册,结交更多同行朋友,交流,分享,学习。

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

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3D打印手板模型快速制作服务,在线报价下单!

QQ 咨询|手机版|联系我们|iCAx开思网  

GMT+8, 2024-11-27 08:29 , Processed in 0.031622 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

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