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

iCAx开思网

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

AutoCAD 技巧

[复制链接]
111
发表于 2005-6-29 12:13:54 | 只看该作者
DIESEL入门:
  
DIESEL语言是一种处理字符串的语言。
  
由于MODEMACRO系统变量是一个字符串类型的系统变量,它的内容也就是AutoCAD图形屏幕的状态行中的显示内容,所以,通过DIESEL就可以控制状态行中信息的显示。
  
所有DIESEL的表达式都是由组成的。一个DIESEL函数的一般调用格式如下所示:
  
$(function,argument1,argument2...)
  
函数和函数的变元都被放在圆括符中,函数名永远放在第一的位置上。这一点与AutoLISP是相同的。函数和变元之间,变元和变元之间都用逗号分隔,这一点与AutoLISP语言不同。然而,为了与AutoLISP相区别,DIESEL函数用$符号开头。
  
<回到顶部>
  
 
  
与DIESEL配合使用的系统变量:
  
有几个系统变量常与DIESEL配合使用,以下将列出代大家参考。
  
1.MODOMACRO系统变量:
  
  它控制状态栏中显示的内容。
  
2.MACROTRACE系统变量:
  
  它是DIESEL表达式的调试工具。在隐含情况下,它的值设置为0(关)。如果将它设置成1(开),就会对所有表达式进行求值,包括在菜单中和状态栏中所使用的那些表达式。
  
3.USERS1-USERS5系统变量:
  
  这五个变量为字符串变量,可由用户随意定义其值。
  
4.MENUECHO系统变量:
  
  它是另一个有用的DIESEL调试工具。若将它设置为8,AutoCAD显示所有菜单宏中DIESEL表达式的输入和输出。
  
<回到顶部>
  
 
  
在菜单文件中使用DIESEL表达式:
  
  您可以在菜单文件中实现DIESEL字符串表达式,并用它们作为生成宏的补充工具。这些表达式所返回的字符串值,可以作为AutoCAD命令、AutoLISP和ADS例程以及其它菜单宏的响应。它们也可以将字符串值返回到菜单本身,从而改变菜单的外观或一个菜单标示的内容。
  
  用在一个菜单项中的一个DIESEL表达式必须跟在$section=submenu格式之后,这里的段名(section)是M,而submenu是您想要的DIESEL表达式。一般来说,AutoLISP实现一个菜单项可能比较容易,但也并非总是如此。
  
  下面给出两个产生相同结果的菜单项实例,其中一个用DIESEL实现,另一个用AutoLISP实现。
  
  使用DIESEL表达式实现的这个菜单项如下:
  
  [图纸空间/模型空间]^C^C^P$M=S(if ,$(getvar,cvport),1),mspace,pspace)
  
  使用AutoLISP表达式实现的这个菜单项如下:
  
  [图纸空间/模型空间]^C^C^P(if (=(getvar "cvport") 1)(command"mspace")+
  
                    (command "pspace"))(princ)
  
  两个菜单项都为在模型空间与图纸空间之间切换提供了一种方法如果TILEMODE设置为0的话),但DIESEL表达式更短,而且其求值是透明的,且不需要调用AutoLISP的pronc函数。如果在这两种情况下都把专用字符^P省略(^P控制MENUECHO变量的打开和),DIESEL表达式公显示所发出的命令,而AutoLISP表达式则显示事先代码。
  
  由于由DIESEL表达式所返回的是一个文本字符串值,所以它能用来响应AutoLISP的getxxx函数调用的请求。这就使得菜单项可以根据现行图形的条件进行求值,并返回一个值AutoLISP例程。
  
  DIESEL表达式还能返回一个字符串值给下拉式菜单项的标示(labels),这样您就能使一个菜单项标志变成灰色或者改变菜单项的显示方式。为了在一个下拉式菜单标示中使用一个DIESEL表达式,您必须确保该菜单项标志的第一个字符为文本字符。
  
  在下面的实例中,我们假设现行图层名设置成了BASE,并将下面的表达式用作菜单文件中一个***popn段中的一个菜单项标示:
  
  [ $ (eval,"当前图层:"$(getvar,clayer))]
  
  运行后,在该菜单项标示中就会显示:“当前图层:BASE”,无论何时现行图层被改变时,它的内容都会被自动更新。
  
  您也可以用这种方法交互式地改变显示在下拉式菜单中的文本。您可能将要选择的文本用AutoLISP例程写入到系统变量USERS1-USERS5中,再用一个菜单标示中的一个DIESEL宏检索相应系统变量中的值。
  
  下面的实例中,使用相同的DIESEL表达式作为菜单项标示和菜单项的一部分,它提供了一种将现行日期和时间录入到图形中去的现实方法。
  
  [$(edtime,$(getvar,date),DDD","D MON YYYY}}^C^Ctext+
  
  \\\$M=$(edtime,$(getvar,date),DDD","D MON YYYY);
  
  另外,使用DIESEL宏还能实现使菜单项变灰或对一个下拉式菜单项作标示。当某个命令处理激活状态时,下面的DIESEL宏使下拉式菜单中的ERASE命令变灰显示(一个菜单项变灰时,说明此时本菜单项不可选择)。
  
  [$ (if ,$(getvar,cmdactive),~)ERASE]erase
  
  使用类似的方法可以在一个下拉式菜单项里面放置一个标记(mark),或者交互式地改变标记所使用的字符。
  
<回到顶部>
  
 
  
在AutoLISP中使用DIESEL表达式:
  
通过调用menucmd函数,您可以在AutoLISP例程中DIESEL表达式。其格式类似于在菜单文件中DIESEL。
  
下面的代码片段将变量ctime设置成现行时间:
  
(setq c_time (menucmd "M = $(edtime,$(getvar,data),HH:MM a/p)"))
  
<回到顶部>
  
 
  
使用DIESEL定义状态栏:
  
使用AutoLISP语言可以实现对MODEMACRO变量的定义。下面给出的程序代码可以模拟AutoCAD的现行内部状态行。
  
    (defun C:ACADMODE()
  
        (setvar"modemacro"
  
            (strcat
  
                "图层 $(substr,$(getvar,clayer),1,8)"
  
                "$ (if,$(getvar,orthomode),正交)"
  
                "$ (if,$(getvar,snapmode), 捕捉)"
  
                ")"
  
           &nbsp
  
       &nbsp
  
    &nbsp
  
您可以将这个程序保存在一个名为ACADMODE。LSP文件中。然后加载并执行它,这时就可产生一个不同的状态行。然而,这并不是使用这一特性的最有用的应用方式,它仅提供了一个实例。加载并这个程序后,也许您并没有感觉到有什么不同,但如果您将图层改为L时,您就会知道MODEMACRO正在起作用。
  
您可以将该程序定义在ACAD.LSP文件中并定义成S::STARTUP()函数,这样在每次启动都可以启用自己定义的状态栏。
  
(defun startup()
        (setvar "modemacro"
            (strcat
                "A$(getvar,useri1)图"
                ",字型(getvar,textstyle)"
                ",标注(getvar,dimstyle)"
            &nbsp
       &nbsp
  
  )
  
<回到顶部>
112
发表于 2005-6-29 12:14:09 | 只看该作者
多文档处理:
  
就象其它应用软件(如Word、CorelDraw等)一样,可同时打开多个文档,在进行装配图绘制、校核装配关系及参考样图时非常方便,可以在多个图形间转换而不必关闭当前编辑的图形。
  
1.可在多个文档之间复制和粘贴:你可以通过菜单中的复制和粘贴命令进行操作,就象Windows的其它程序一样方便。你也可以选定对象后直接拖动到另一文档中,该操作可通过鼠标左键或右键完成,用左键拖动时,直接粘贴到到鼠标所在的位置,而用右键拖动时会弹出菜单选择粘贴的方式。
  
2.可在多个文档之间复制属性:我们可以用格式刷(matchprop)在多个文档中复制属性(如对象的颜色、线型、线宽、图层等),并且可选择复制哪些属性。操作是这样的,你在第一个文档中选定要复制属性的对象后,再点击格式刷工具图标,然后激活第二个文档后,选取要修改的对象就可以。注意文档应该是打开的状态,不能在选取了格式刷后再打开要修改属性对象的文档。
  
<回到顶部>
  
 
  
设计中心:
  
方便文档的管理,设计中心能显示出未打开图形文档中的图块、标注型式、线型、图层、字型等内容,并且设计中心还预设了很多的标准件图形,用户可通过拖动将设计中心中的图块等插入增加到当前图形中。
  
<回到顶部>
  
 
  
三维造型:
  
新增了三维造型的编辑功能,能单独复制三维造型的边和面,偏移整个面等,改进取UCS坐标系,使用三维的操作更方便,增加了三维的视图盘旋功能,提供了在平滑等造型时的实时盘旋操作。但在建立复杂的三维模型方面操作难度还很大。
  
<回到顶部>
  
 
  
改进了属性编辑功能:
  
采用了很多Windows应用程序所应用的属性列表框,可同时编辑多个不同或相同的图元对象的同一属性,使用方便,但有些方面却没有R14版直接。特别是在编辑标注尺寸时,由于属性太多,查找起来较难,花的时间也长。
  
<回到顶部>
  
 
  
新增的捕捉及跟踪功能:
  
新增了平行线的捕捉、延伸线的捕捉及极向捕捉、对象跟踪等辅助制图功能,大大提高了绘图的速度。用户可在绘图设置对话框中设置这些新功能。在绘图中采用极向捕捉功能将比采用正交捕捉功能方便,适应的范围更广。
  
<回到顶部>
  
 
  
新增的出图打印功能:
  
该功能取代了旧版的出图打印功能,完全是一种新的概念,每个图形文档及不同布局均可设置不同的页面设置及打印机。图开中增加了线宽设置,系统增加了打印机管理及打印型式管理,并提供了多个向导,方便用户导入旧版本的打印型式及创建新的打印型式表。
  
<回到顶部>
  
 
  
AutoCAD 2000的整体效率提高44%:
  
   1999年8月30日,Autodesk公司在美国加利福尼亚州的San Rafael公布了由两家第三方机构独立完成的调查分析报告,这些报告总结了关于最新的设计平台软件AutoCAD 2000的效率提高和一些客户的评价。  
  
根据英国曼彻斯特技术学院发布的数据,在其每一项评测中,AutoCAD 2000的性能都明显优于其上一版本AutoCAD R14。通过对设计项目5个阶段的基准测试,AutoCAD 2000的效率提高范围是从38%到56%不等,整体效率提高了44%。换言之,?假定生产效率不变的前提下,每周完成同样工作量所需的时间大约可以减少8小时。  
  
“在每一项性能对比中,AutoCAD 2000都比AutoCAD R14软件更快,这是我们所期待的。”曼彻斯特技术学院的研究主任Richard Sheperd博士说,“真正令我们感到惊奇的,是新功能对生产效率提高具有的累加倍增效应,比如在同一设计过程中打开多个图形,在同一项目中多专业协同工作的能力和工作组整体设计效率的提高等。AutoCAD 2000是真正智能化的设计环境,其图形和几何信息能自动反馈给设计人员。几乎?每一种情况下,单凭这种智能化就可以提高设计人员40%的工作效率。”  
  
一家专门从事于CAD软件和设计业的分析和统计公司 [$#0] Daratech也做了一次针对AutoCAD 2000新特性和增强功能的客户调查。通过调查,该公司收集了许多衡量这一新软件应用效果的定性和定量的数据。研究结果以绝对优势表明,该软件以其新增的3D功能的优异特性,整体速度的提高,以及坚如磐石般的软件稳定性,赢得了客户的一致肯定。  
  
Daratech调查的客户来自世界各地的各种技术应用领域。100%的调查反馈表明他们的部门或公司都非常青睐AutoCAD软件,并正在计划使大部分或全部的现有AutoCAD装机量升级到AutoCAD 2000。  
  
曼彻斯特技术学院和Daratech公司的报告都广泛地比较了AutoCAD R14和AutoCAD 2000的性能,结果不容质疑:在每一比较实例中,AutoCAD 2000软件都很明确地被确立为性能的优胜者和客户的首选。为单一用户提供的优异软件性能固然极为重要,但AutoCAD 2000不止?,它同时还是第一个真正支持工作组协同工作的CAD平台软件,因此,统一采用这一平台的设计组会使其工作效率成倍提高。这是多种测试条件下完成的结果,不同的用户对此的感受可能有略微的不同。  
  
“AutoCAD 2000改善了用户的输入方法,代替了原先那种按部就班式的命令交互机制。同以前相比,现在只需要很少几步就可完成相同的任务,”Garry Drinkall先生,HWA的CAD系统负责人说,“要特别指出的是,极轴捕捉和对象跟踪捕捉功能的增加,使得用户不再需要使用临时构造线,同时也加速了对象的定位操作。这些已经成为我们日常设计工作中必不可少的部分。”  
  
在AutoCAD 2000的网址www.autodesk.com/autocad2000上,可以获取Daratech公司和曼彻斯特技术学院的研究报告以及其它更多的有关报告。  
  
<回到顶部>
113
发表于 2005-6-29 12:14:40 | 只看该作者
为AutoCAD R14添加分页打印功能  
Http://www.cnzzlm.com 2003-3-22 11:57:32 狂沙工作室  
  
AutoCAD 堪称当今最流行的计算机辅助设计制图软件。它不仅应用于机械设计行业,而且还应用于其他各种行业,诸如工程分析、化学工程、电器工程等行业。它之所以应用之广还因为它具有开放的体系结构,它允许用户和开发者采用高级语言编程对其进行扩充和修改,以最大限度地满足用户的特殊要求。众所周知,AutoCAD R14没有预定分页打印功能。对于大图纸(如:A2图纸)及没有与之相匹配的打印机时,AutoCAD R14无法按设计要求将图纸打印出来。当然,如果您有宽幅打印机,那就最好,也就没有必要进行分页打印了。为了实现大图纸分页打印,本文利用AutoLISP语言编写一段程序并将其命名为myplot.lsp文件,为AutoCAD R14添加分2页或4页打印功能。  
  
(defun c:myplot() ;;;主程序  
(if (= 1 (getvar "cmddia"))  
(setvar "cmddia" 0)  
)  
(setq num (getint "\nEnter the Number of Page:"))  
(setq pmax (getvar "extmax"))  
(setq x0 0)  
(setq xm (car pmax))  
(setq ym (cadr pmax))  
(if (= 4 num) ;;;分4页打印  
(progn  
(setq dx (/ xm 2))  
(setq dy (/ ym 2))  
(winplt 2 1)  
)  
(progn  
  
(if (= 2 num) ;;;分2页打印  
(progn  
(setq dx (/ xm 2))  
(setq dy (/ ym 1))  
(winplt 2 0)  
)  
)  
)  
)  
(setvar "cmddia" 1)  
(princ)  
)  
  
(defun winplt(k n) ;;;窗选分页打印程序  
(setq i 1)  
(while ($#@60;= i k)  
(setq j 0)  
(while ($#@60;= j n)  
(setq x1 (+ x0 (* (- i 1) dx)))  
(setq y1 (- ym (* j dy)))  
(setq x2 (+ x1 dx))  
(setq y2 (- y1 dy))  
(command "plot" "w" (list x1 y1) (list x2 y2) "")  
(setq j (+ 1 j))  
)  
(setq i (+ 1 i))  
)  
)  
  
  启动AutoCAD后,在其菜单项Tools中的Loadapps…将myplot.lsp文件装载,并在命令行输
入myplot即可。
  
  对上述程序进行稍加修改便可实现4页以上的分页打印,限于篇幅,在此就不再详细介绍了
  
114
发表于 2005-6-29 12:14:54 | 只看该作者
在AutoCAD同一张图上自动实现不同的标注比例
  
       ----系统变量的使用、截获鼠标消息、自定义实体知识
  
    做机械制图的同学可能经常遇到这样的问题,装配图或者零件图的某一部分经常需要
局部放大。出图时也需要出在同一张纸上。如果不涉及标注,可能并没有太大的问题,但
常常不得不处理标注的比例。Auto CAD标注时可以选择自动测尺寸标注,这样当改变标注
线位置时标注的尺寸数值自动变化。如果不是自动测尺寸,而是强行输入一个数值字符串,
那么如果尺寸线位置变动(比如你改变设计尺寸),标注数值是不变化的,这不符合客观
情况。        在同一张图上标注不同比例的实体时,虽然作为Auto CAD实体,他们的大
小是不一样的,但作为实际设计模型,尺寸是一样的,不过是局部放大显示罢了!假如使
用自动测尺寸,照顾了原图就照顾不了放大图,必须有一个图是使用不自动检测尺寸,这
对改图又改尺寸标注是很不方便的。如果开不同视窗,又会涉及到文字比例问题,因为图
放大了文字也放大,而实际需要的是图放大而文字不放大。
  
    解决这个问题有一个方法可以参考,就是使用DIMSCALE系统变量控制,例如,我们需
要将原图一部分局部放大10倍,原图标注尺寸是150的地方,在放大图上也是150,虽然图
变大了10倍,绝对不会检测成1500, 我们只要在标注时将DIMSCALE系统变量设成0.1就可
以了。
    
    改变系统变量固然可以解决尺寸自测问题,但是,DIMSCALE变量是全局的,他将影响
以后所有的标注,如果在实际操作时反复切换这个变量,又为绘图添加很多新的麻烦,所
以,下一步就是考虑如何自动切换标注比例问题。
  
    以笔者的成功范例,采用下列方式达到自动切换标注比例的功能,只要指定了一个矩
形框,确定在此框内的比例,以后凡是在此框内绘图都自动设置DIMSCALE变量,在框外绘
图标注比例会设回去。
   
    第一 : 截获Auto CAD鼠标按键消息;重新编制窗口处理过程,采用SetWindowLong
将此过程附加到Auto CAD绘图窗口。
  
    第二 : 在窗口处理过程里面判断鼠标的位置,是否落在规定的矩形框内,如果在则
改变系统变量。
  
    第三 : 为了记录特定的矩形框位置,设计了一个新实体,新实体可以显示可以隐藏,
可以移动、缩放,但不能随意删除,必须用指定的命令才可删除,如果使用Auto CAD命令
删除它,在存盘时可以恢复,并设为隐藏状态,新实体的一个重要属性就是标注比例,可
以随时改动,并影响框内所有实体。
  
    综上所述,采取这几个简单的技术,就实现了在同一张图上自动实现不同的标注比例,
有关截获鼠标消息、自定义实体以及程序源码等等细节,将在后期推出。
115
发表于 2005-6-29 12:15:07 | 只看该作者
在程序中实现图层的检查及新建
  
  有些编程者编程时没有考虑到用户环境的不同,经常所编制的程序能运行在自制的模板图形上,而不能在用户的图形中运行,这种情况也是我经常碰到的。
最容易碰到的是图层。程序中,经常会使用特定的图层来放置程序所生成的对象,比如说你将图层设置为“3”层,写出的程序如下:
  
(setq oldLayer ( getvar "clayer")) ;将当前图层保存起来,以便以后的恢复
  (setvar "clayer" "3")              ;将图层“3”转换为当前图层
  
    这时,如果用户当前图形中在存在“3”图层,程序就会出错并中断。为此,你首先应判断“3”图层是否存在,采用以下的聚光灯中判断图层的存在:
  
(tblobjname "layer" "3")
  
    这时,如果图层“3”确实不存在时,则可用以下函数内容建立该名称的图层:
  
(entmake (list
            '(0 . "LAYER")
            '(100 . "AcDbSymbolTableRecord")
            '(100 . "AcDbLayerTableRecord")
            '(6 . "CONTINUOUS")
            '(62 . 3)
            '(70 . 0)
            '(2. "3")
       &nbsp
)
  
    这样就可以建立新图层,完整的程序如下:
  
(setq old_lay (getvar "clayer"))
(if (=(tblobjname "LAYER" "3") nil)
    (progn
        (entmake (list
                    '(0 . "LAYER")
                    '(100 . "AcDbSymbolTableRecord")
                    '(100 . "AcDbLayerTableRecord")
                    '(6 . "CONTINUOUS")
                    '(62 . 3)
                    '(70 . 0)
                    (cons 2 "3")
                 &nbsp
       &nbsp
   &nbsp
)
(setvar "clayer" "3")
  
  可能有人会说,使用command转换及新建图层不是更加简单吗?但我总认为其它函数能完成的动作,最好不要使用“command”函数,因为可能下一个版本中,command所引用的命令内容会有变化(如功能的加强),使用程序出错。就象R12、R13、R14版中的清理命令[Purge]就各不相同。
  <回到顶部>
  
 
  
将一个大程序分成多个小程序以简化编写过程
  
初学者常常会将所有的功能都编入到一个程序(或函数)中。这不仅会使程序冗长难读,也会给修改和重用带来麻烦。AutoLISP是一种函数式的语言,因此,将一个单独的功能编制成一个函数可以使程序简明易读。对于重复调用次数较多的程序,应编制一个通用函数并在初始化时加载到环境中,以便于调用。
  
<回到顶部>
  
将自己编制的程序或函数的调用放在菜单系统中
  
不要让自己编制的程序只能够从命令行调用,要将它们安排在菜单中以方便用户的调用。
  
<回到顶部>
  
不要将自己编制的程序全都放入ACAD.LSP文件中
  
一些程序只喜欢将自己编写的程序或函数放在ACAD.LSP文件中,因为该文件可以在AutoCAD启动时装载到环境中。这样做的确可以方便自己编制函数的调用。不过,如果ACAD.LSP文件太大,则调入每个绘图的时间将变长,因为内存减小了。
  
事实上,ACAD.LSP是用来存放通用函数的,只有频率很高的函数才应放入到ACAD.LSP中。例如:用户库函数通常都放在ACAD.LSP中,或在ACAD.LSP中加载。
  
<回到顶部>
  
加载文件前应判别程序是否已被加载
  
在调用用户自己定义的函数之前,应将与之相关的应用程序加载到AutoCAD环境中,否则AutoCAD会报告不存在该函数。当一个函数会被多次调用时,如果每次调用之前都加载一次文件,则会浪费很多时间,因为一个文件只需加载一闪即可。这时,判别一下某文件是否已经装入是非常必要的,这种用法在菜单文件的语句中很常见,例如:
  
...
  
[技术要求](if(not jsyq)(load"jsyq"));(jsyq);
  
...
  
这里我们假定jsyq是文件jsyq.lsp中的一个函数(不是一个变量),在调用函数(jsyq)之前,(if not...)语句首先判断一下该函数是否已经存在。如果不存在,就加载相关文件jsyq.lsp;否则说明步过加载语句。
  
<回到顶部>
  
为自己的应用程序建立一个单独的目录
  
不要将自己的应用程序放在AutoCAD软件包所在的目录下,这样不仅会扰乱软件包中文件的排列,也不便于管理。通常开发者会建立一个单独的目录来旋转自己的应用程序。此建立目录的名字应尽量避免可能会因安装 AutoCAD或其它第三方软件包而产生的冲突。
  
<回到顶部>
  
尽量减小应用程序的文件数
  
AutoLISP程序通常都很短小,因为一个功能一般只需几十条语句就可以完成,这也是AutoLISP语言的效率所在。不过,如果将每一个编制的功能都生成一个单独的文件,不仅会使程序的数量繁多,而且使用时也要一次次加载,十分不方便。因此,应尽量将相关甚至相关性不太强的文件合并为一。这样,您可以将多个文件合为一个,使用时只要装载一次而无需多次装载。如本站提供的图栏程序和流程程序就是这样,图栏程序将六个相关的功能组合在一起,而流程程序将四个相关的功能组合在一起。
  
<回到顶部>
  
用缩进方法使程序便于阅读
  
和其它软件开发程序一样,AutoLISP程序也可以使用缩进的方法进行编写以便于阅读,缩进后程序的调用并不多占用内存。
  
<回到顶部>
  
为变量取名应便于理解但不要太长
  
在为变量取名时,应力求简洁且含义清晰。例如:ABC、QQX会被认为是无意义的,它不便于理解和记忆变量cornerpoint1虽然很便于理解,但它太冗长,会多占用内存。另外,变量名p1或pt1要比point1更为合适。
  
<回到顶部>
  
修改系统变量时应注意对原有变量的保存以便恢复
  
AutoCAD启动之后,会为每个系统变量都初始化一个缺省值。在应用程序运行时,可能需要暂时将某系统产生的值修改一下。不过应注意在修改之前应将其原始值加以保存,使用完毕后再将其恢复回原始值。
  
例如:在进行对象捕捉时,我们希望它使用终点捕捉方式,这时只要将系统变量OSMODE的值设为1即可。不过,在修改OSMODE的值之前,应将其原始值保存起来:
  
(setq oldosmode(getvar "osmode"))
  
然后再进行修改:
  
(setvar"osmode" 1)
  
这样再进行对象捕捉时,将使用终点方式。当捕捉结束之后,应将其恢复为原始的值:
  
(setvar"osmode" oldosmode)
  
此处oldosmode是一个用以保存OSMODE原始值的中间变量。
  
<回到顶部>
  
第三方开发的ACAD.LSP的引用
  
很多第三方软件开发商在开发AutoCAD时会改写ACAD.LSP文件甚至将其加密。如果用户要在此基础上再开发自己的程序,则需要建立自己的ACAD.LSP文件。
  
首先,将原来的ACAD.LSP文件为ACADOLD.LSP,然后建立一个自己的ACAD.LSP文件并在最后将原先的ACAD.LSP文件装载:
  
(load "acadold")
  
这样,AutoCAD启动时会自己装载ACAD.LSP文件,同时也装入ACADOLD.LSP文件,但有一点请注意,如果原先的ACAD.LSP文件中带有(S::STARTUP)函数,则按上述方法装入之后,该函数不会被自动执行,这时,你还应该在装载原先的ACAD.LSP文件之后运行如下语句:
  
(S::STARTUP)
  
<回到顶部>
  
抑制函数运行之后返回的nil显示
  
在一个AutoLISP运行结束之后,它常会在命令行上返回一个nil,我们可以在函数的最后一个右括号之前加上一条(princ)语句抑制nil的出现。
  
注意:如果函数是用来返回一个值,则不能使用上述的方法。
  
<回到顶部>
  
为用户选择提供缺省值
  
在AutoLISP应用程序中,当需要用户输入时,应为用户提供一个缺省的值。用户想输入的值刚好就是缺省的值时,只需按回车键或空格键即可,这样可以给用户带来方便。
  
通常,缺省值跟在输入提示串之后并用尖括号(<...&gt括起来,下面的例子中将最后一次用户输入的字符串存放在一个变量defvar中,当提示用户输入时,它将前一次用户输入的字符串做为缺省的值。
  
(defun c:testpgm(/a)
  
    (if (= defvar nil)(setq defvar ""))
  
    (pormpt "\n输入名称:<")(princ defvar)(princ ">:")
  
    (setq a (getstring))
  
    (if (= a "")(setq a defvar))
  
    (setq defvar a)
  
)
  
注意:上面这段程序中,变量defvar是做为全局变量使用的,它将存在于AutoCAD环境中,运行testpgm之后,用户可以通过!字符检查defvar的当前值。
  
<回到顶部>
  
为命令行的选项提供右键快捷菜单
  
在AutoCAD2000中,命令行中的可选项可以使用鼠标的右键显示,提高了用户的操作速度,但这种方法必须按照一定的格式书写程序,一般,选项内容是用中括号[...]括起来,每个选项之间使用"/"分隔。例如:
  
(initget "Single Horizonal Vertical")
   (setq sele(getkword "\n部装明细序号填写方式[水平多项(H)/垂直多项(V)/单一序号(S)]<单一序号>:"))
  
这样,在程序运行到当前提示时,用户可点击鼠标右键弹出快捷菜单显示各选项的内容选取。
  
<回到顶部>
  
关于程序调试的一些建议
  
一个程序在编制是没有一定的规定的,因此,程序的调试方法也没有一定的规律。机器是不会告诉你程序到底错在哪里,你只能从逻辑上一遍又一遍地检查一个程序,可不幸的是,在某些情况下它还是会出错。
  
从这种角度出发,我们说编程是非常令人生厌的,也是极具有挑战性的。其中最大困难的就是调试这一步,调试方法是否合适将直接影响到程序编制的进度。
  
下面我们将介绍一些调试的策略。
  
1.不要和计算机较劲
  
请记住,计算机是不知疲惫的,可你不行。如果感到累了,可以暂时放下工作去花园散散步或干脆去看场电影,等你精神转好了再重新投入工作中去。
  
2.计算机是非常公正的
  
计算机的眼睛是雪亮的,它绝不会让任何错误的数据蒙混过关。加外,计算机几乎不会犯错误,因此,请多找一找自身的原因吧!
  
3.在计算机中,相是的激励应该得到相同的结果
  
有时,你的程序可能会在相同的输入下得到不尽相同的结果,这时你要提醒自己:一定有什么条件被改变了,虽然它还未暴露出来。
  
在调试程序时更要注意这一点,不要因之而影响你的判断力。
  
4.两种常见的错误类型
  
语法错误和逻辑错误是程序中两种常见的错误类型。语法错误是较容易发现的,因为其中存在错误的命令,例如:
  
(setq a (ang1 p1 p2))
  
此处函数(ang1)拼写错了,正确的名字是(angle),系统会提示发现空函数而终止。
  
逻辑错误是不容易发现的,例如:
  
(angle pnt1 pnt2)
  
这条语句看上去似乎是正确的,但如果pnt2的值为空,程序同样运行不下去。
  
5.通过“断点”检查与变量有关的错误
  
如果希望在程序运行到某处时检查变量a的当前值,可在程序中的该处加入如下语句:
  
(princ a )
  
(setq bp(getstring))
  
这样,到印出a的值之后,函数(getstring)可使程序暂停,就好象遇到了一个断点一样,观察完a的值之后,可按任意键使程序继续。
  
6.变量作用哉的定义
  
在刚开始编程时,应将函数中用到的变量定义成全局性的。在AutoLISP中,函数中的变量只要不在函数定义defun命令的函数名之后的()中用斜杠说明,该变量就是全局的,例如:
  
(defun drawline()
  
...
  
)
  
假设(drawline)用到了两个点pnt1和pnt2,则这两个将成为全局性的.用户可在命令秆用!字符检查它们的值.
  
一旦将程序调试完毕确认无错之后,便可将变量定义成局部的,例如:
  
(defun drawline(/ pnt1 pnt2)
  
...
  
)
  
这样,函数运行过程中pnt1和pnt2有效,运行完毕之后它们将消失,这样可以节省出一点内存空间来。
  
7.注意不要混淆度和弧度
  
当使用到角度时,最常见的错误是混淆了度和弧度两种单位,请记住,AutoLISP函数使用弧度为单位,AutoCAD命令使用度为单位。
  
8.对相关的系统变量进行检查
  
程序运行得正常与否与系统变量也有着直接的关系。例如:将对象捕捉系统变量OSMODE设置为终点捕捉模式(1)或交战捕捉模式(32),同一个程序在运行效果上可能就会产生很大的差别。
  
9.从屏幕上的细微变化观察程序运行
  
在AutoLISP程序运行时,屏幕上常会产生一些微小的变化,如:若出现一个表示点的小叉丝然后又消失,这有可能是在执行insert或与插入点有关的命令。若屏幕上的对象变成虚线表示,这有可能是在执行(ssget)函数并选中了这些对象,总之,仔细观察屏幕上的细微变化将有助于了解程序运行的进程,这对于程序的调试是有益的。
  
10.调试通则
  
程序出错通常是由多个错误引发的,而许多错误会导致同一种现象,因此,在分析错误时,应将它们分享出来进行检查,不要企图一次性将所有的错误都改正过来。
  
<回到顶部>
  
使命令暂停以等待用户输入
  
在AutoLISP函数(command)中,您可以加入pause项使命令在执行到该处时暂时停下来以等待用户输入,例如:
  
(command "circle" pnt1 pause)
  
该命令将pnt1指定为圆心之后暂停,等待用户输入圆的半径值。
  
<回到顶部>
  
AutoCAD原始命令的取消与恢复
  
UNDEFINE和REDEFINE是AutoCAD的两条命令。UNDEFINE用来取消AutoCAD的原始命令。例如:如果你在命令行上键入INDEFINE  FILLET,AutoCAD会禁止FILLET命令的使用,这样你使可以使用自己定义的FILLET命令。如果你想再使用AutoCAD的FILLET命令,这时应使用.FILLET命令,当然,你也可以干脆使用REDEFINE来恢复原先的状态。
  
<回到顶部>
  
(findfile)——查找文件
  
(findfile)函数用来在磁盘上查找指定的文件,若只给出了文件名,则它会在当前路径、DOS的PATH环境变量所指定的路径和ACAD环境变量所指定的路径中查找该文件(找到第一个便停止)。例如:若要查找TYL.INI文件,则使用:
  
(findfile "tyl.ini)
  
它将返回:
  
"c:\\program files\\acad2000\\tyl.ini"
  
<回到顶部>
  
(getenv)——取系统的环境变量
  
库函数允许用户在AutoCAD环境中取系统的环境变量。例如:
  
(getenv "acad")
  
它将返回:
  
"C:\\program files\\acad2000\\support;C:\\program files\\acad2000\\fonts;C:\\program files\\acad2000\\express"
  
除ACAD之外,AutoCAD还有两个系统环境变量,它们是ACADCFG和ACADDRV。其用法相同。
  
<回到顶部>
  
(setcfg)——设置应用程序配置
  
从AutoCAD  R13版开始,AutoCAD为应用程序开发者和用户提供了在ACAD14.CFG(AutoCAD2000中为ACAD2000.cfg)文件中保存半永久性配置信息的方法。该文件可以用记事本打开,文件分成两个部分。应用程序开发者和用户可以控制的那一部分被称为[AppData]。
  
在本站所提供的图栏程序中就采用了该命令设置图栏的默认设计单位在tyl.ini文件中的位置及其它设计单位的名称,词句如下:
  
(setcfg "AppData/Tyl/Number" 1 )
   (setcfg "AppData/Tyl/Other" "明经通道")
   该语句在ACAD.CFG文件中生成如下语句:
  
[AppData/Tyl]
  
Number=1
  
Other="明经通道"
   <回到顶部>
  
(getcfg)——取应用程序配置
  
(getcfg)是(setcfg)的对偶函数,它用于从ACAD14.CFG(AutoCAD2000中为ACAD2000.cfg)文件中取出应用程序配置,以前面一节的例子为样板,下面语句:
  
(getcfg "appdata/tyl/other")
  
可取出ACAD14.CFG(AutoCAD2000中为ACAD2000.cfg)文件中Appdata中的Other的值。
  
<回到顶部>
116
发表于 2005-6-29 12:17:11 | 只看该作者
这样子比较直观^_^
117
发表于 2005-6-30 22:55:30 | 只看该作者
顶先
118
发表于 2005-7-1 10:02:52 | 只看该作者
好东西!!!!!!!!!!!!
119
发表于 2005-7-1 15:35:31 | 只看该作者
既然下了就要顶!
120
发表于 2005-7-3 15:51:28 | 只看该作者
我也顶!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

GMT+8, 2025-2-11 21:46 , Processed in 0.031892 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2025 www.iCAx.org

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