版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第页
AUTOLISP程序设计技巧
一、引言
在AutoCAD中的角度捕捉只有当正交状态翻开时的直和水平方向,对于其他特殊角度无能为力;另外,其网点捕捉也是相对于X轴和Y轴,无法实现其他方向的特殊长度捕捉,给绘图带来极大的不方便。在应用AutoCAD进展设计制图的操作中,LINE和POLYLINE是使用频率最高的两个命令,经常要遇到在某些特定角度上绘制特定长度的简单线或复合线的情况,因而实现这两个捕捉对提高AutoCAD作图效率很有实用价值。二、方法原理所谓角度捕捉,是指当十字光标在某一角度α的一定范围内选取一点时,该点自动落在该α角度线上;当我们设定捕捉角度为α时,将会以基准点作为原点、自X轴正方向出发,将整个屏幕划分为[360/α]个区间,那么NXα角度就是角度捕捉线,其中,0≤N≤[360/α],[360/α]表示不大于360/α的整数。所谓长度捕捉,是在角度捕捉的根底上,在某一角度线上有一系列捕捉点,该系列点离基准点的距离为捕捉长度的正整数倍,中选取直线上的一点时,落点自动落到离其最近的捕捉点上。实现特定角度和长度捕捉的关键点是:当十字光标(即十字穿插线)移动时,程序要随时跟踪其穿插点的位置,并将该位置与用户所设定的捕捉角度与长度对应起来,从而计算出在该角度上的落点。以下举例说明该两个捕捉的实现过程:假定捕捉角度为α=30°,捕捉长度为L。当十字光标在任意的某一区间内移动时,比方在第5区间(120°~150°)内移动时,此时,落点只能在120°或150°线上(该线在图中并不直接显示),该两根角度线的中心线为135°。当十字光标的中心点处在120°~135°之间时,那么落点应在120°线上,该落点的具体位置为由十字光标的中心点向120°线作垂线来获得,其交点D(称为垂点)即为落点,为直观起见,此时由基准点(此处为O点)向落点作一橡筋拖曳线,该橡筋拖曳线随十字光标的移动而相应移动,显示出拖动过程(见图1);同样,当十字光标的中心点处在135°~150°之间时,那么落点应在150°线上,并显示相应的橡筋拖曳线。该橡筋拖曳线并不是真正的线段,只是用XOR墨水绘制的一个向量,当用XOR墨水重新绘制一遍该向量时,该向量将从屏幕上消失,这就是本程序实现光标拖动的原理。落点落在某一捕捉角度线上时,还得落在捕捉长度L的整数倍的点(称为捕捉点)上,还是针对图1,其垂点必然处于某两个捕捉点A与B之间,设A与B的中点为C,当D处于A与C之间时,落点应为A;当D处于C与B之间时,落点应为B(见图1)。其中:----OA=nXL;OB=(n+1)XLn:非负整数。L:捕捉长度。此时,程序通过一定的操作将在屏幕的最上面的坐标提示行准确地显示落点相对基准点的偏移长度和偏移角度。用户可以滑动鼠标准确捕捉到目标点。至此,已实现某些特定角度及长度的捕捉。为了满足在程序执行过程中能随时更改捕捉角度和捕捉长度的需要,本程序还增加了相应的模块;另外,本程序中嵌入了窗口放缩功能模块,通过点取下拉菜单中窗口及漫游子菜单,方便了各种作图的需要。三、源程序清单;;OS.LSP源程序;;err(),出错处理子程序(defunerr(msg)(if(/=msg"Functioncancelled")(princ(strcat"\nError:"msg));打印错误内容);forif(setq*error*olderr)(setvar"cmdecho"scmd)(setvar"osmode"cosmode)(setvar"coords"ccoords)(princ"n\n\t--多谢使用角度捕捉2.0版,程序非正常完毕--!\n")(princ));fordefunerr;;ant(),设定捕捉角度子程序(defunant(/ang0ang1)(setqang0(*an0(/180pi)))(princ(strcat"\n请输入捕捉角度:<"(rtosang0)">_"))(INITGET4)(setqang1(getreal))(if(not(nullang1))(setqan0(*ang1(/pi180))))(princ"\nF2/F3/F4/F5/ESC/Return/下一点:"));fordefunant;;leng(),设定捕捉长度距离子程序(defunleng(/leng0leng1)(setqleng0len0)(princ(strcat"\n请输入捕捉长度距离:<"(rtosleng0)">_"))(INITGET4)(setqleng1(getreal))(if(not(nullleng1))(setqlen0leng1))(princ"\nF2/F3/F4/F5/ESC/Return/下一点:"));fordefunlent;;field(),判断十字光标所在区间,并投影到相应的捕捉角度线上(defunfield(pspeang0/ang1n)(setqang1(anglepspe))(setqn(fix(+(/ang1ang0)0.5)))(setqang2(*ang0n)));fordefun;;endp(),十字光标投影到相应的捕捉角度上后,以用户设定的长度;;捕捉计算落点(defunendp(pspeang0/p1p2p3p4dis)(setqp1psp2(polarpsang01)p3pep4(polarpe(+ang0(/pi2))1))(setqpend(intersp1p2p3p4nil))(setqdis(distancepspe))(if(/=len00)(setqdist(*(fix(+(/dislen0)0.5))len0));else(setqdistdis));forif(setqpend(polarpsang0dist)));fordefunendp;;drag(),对上一次显示的拖曳线进展"或"操作,使其从屏幕上消失,;;并绘制下一次拖曳线(defundrag(pold1pold2pold3/)(if(/=b24)(progn(grdrawpold1pold2-10)(grdrawpold2pold3-10)));forif(grdrawpstartpend-10)(grdrawpendpframe-10));fordefundrag;;coord(),在屏幕的最上一行的坐标栏显示长度和角度(defuncoord(/strleng1leng0ang0)(setqang0(*ang2(/180pi)))(setqstr(strcat(rtosdist)">"(rtosang0)))(grtext-2str));fordefuncoord;;init(),对程序进展初始化(defuninit(/)(setqscmd(getvar"cmdecho"));保存原命令回显方式(setqccoords(getvar"coords"));保存原坐标显示方式(setqcosmode(getvar"osmode"))(setqolderr*error**error*err);出错处理(setvar"cmdecho"0);不回显(setvar"coords"0);不显示坐标(setvar"osmode"0);取消捕捉(setqb0b10c'(00))(setqpstart(getpoint"\n请输入直线第一点:"))(if(or(nullan0)(<an00)(not(numberpan0)))(progn(setqan0(/pi6))(ant)));forif(if(or(nulllen0)(<len00)(not(numberplen0)))(progn(setqlen01)(leng)));forif(if(nulllen0)(leng))(princ"\nF2/F3/F4/F5/ESC/Return/下一点::")(setqa(grread2nil))(setqpframe(cadra))(fieldpstartpframean0)(endppstartpframeang2)(grdrawpstartpend-10)(grdrawpendpframe-10)(setqplastpframepoldepend)(setqb(cara)));fordefuninit;;home(),设置退出程序的控制变量(defunhome(/)(setqb3)(setqb11));fordefunhome;;pull(),承受用户输入控制子程序(defunpull(/)(setqb10)(while(/=b3)(progn(setqa(grread2nil))(coord)(if(and(=b2)(=b24))(setqb4))(setqb2b)(setqb(cara))(cond((or(=b5)(=b12));只移动十字光标时(progn(setqpframe(cadra))(fieldpstartpframean0)(endppstartpframeang2)(if(>=(distanceplastpframe)0.1)(progn(dragpstartpoldeplast)(setqplastpframepoldepend));forprogn);forif);forprogn);forcond1((=b3);用鼠标在屏幕上点取一点时(progn(setqpframe(cadra))(fieldpstartpframean0)(endppstartpframeang2)(if(>=(distanceplastpframe)0.1)(progn(grdrawpstartpolde-10)(setqplastpframepoldepend));forprogn);forif);forprogn);forcond1((=b2);键盘输入(progn(setqc1(cadra))(cond((=c1138)(ant));F2((=c1139)(leng));F3((=c1140);F4(progn(setqb24)(command"zoom""0.7x")));for(=c1140)((=c1141);F5(progn(setqb24)(command"zoom""1.4x")));for(=c1141)((=c113)(home))((=c127)(home))(T(princ"\n未定义的键")));forcond(princ"\nF2/F3/F4/F5/ESC/Return/下一点:"));forprogn);for(cond(=b2))((=b4);点取下拉菜单时(progn(setqc1(cadra))(princ"\n")(cond((=c16005)(progn(command"zoom""w")(princ"\n第一角点:")(commandpause)(princ"\n第二角点:")(commandpause)));for(=c16005)((=c16007)(command"zoom""p"))((=c16008)(command"zoom""a"))((=c16011)(progn(command"pan")(princ"\n第一参考点:")(commandpause)(princ"\n第二参考点:")commandpause)));for(=c16011);;else(T(princ"\n未定义的菜单")));forcond(princ"\nF2/F3/F4/F5/ESC/Return/下一点:"));FORPROGN);for(cond(=b4))(T(home));forelse);forcond);forprogn);forwhile);fordefunpull;;draw(),绘制直线子程序(defundraw(/)(while(/=b11)(progn(if(=b3)(progn(command"line"pstartpend"")(princ"\nF2/F3/F4/F5/ESC/Return/下一点:")(setqb0b11)(setqpstartpend));forprogn);forif(pull));forprogn);forwhile(grdrawpstartpend-10)(grdrawpendpframe-10));fordefundraw;;;;主程序(defunc:os(/bb1b2cpstartpendpframeplastang2distscmdccoordsolderrcosmode);;;an0len0aredefinedoutprogram(init)(draw)(princ"\n")(command"redraw")(setq*error*olderr)(setvar"cmdecho"scmd)(setvar"osmode"cosmode)(setvar"coords"ccoords)(princ"\n\n\t角度捕捉2.0版\n")(princ"\n\n\t**宁波大学建筑设计研究院--程建华,1996**\n")(princ));fordefunos四、程序的安装与使用1.程序的安装以下三种装载方式,用户任选一种即可:在AutoCAD环境下,将OS.LSP拷至当前目录,再执行(LOAD"OS")即可装载OS.LSP。也可先将OS.LSP拷至\ACAD\SUPPORT\子目录下,再在\ACAD\SUPPORT\ACADR12.LSP或ACADR13.LSP中参加下面一句语句实现启动AutoCAD时自动装载:(AUTOLOAD"OS"'("OS"))也可将OS.LSP拷至\ACAD\SUPPORT\子目录下,在\ACAD\SUPPORT\\子目录下的菜单文件ACAD.MNU中的适宜位置加上下面的一句语句,即可直接在菜单中点取角度捕捉操作:···[角度捕捉]^c^c(load"c:/acad/support/os.lsp")os···2.程序的使用在一幅图中第一次使用该程序时,需要用户输入捕捉角度和捕捉长度,第二次调用本程序时,程序可自动采用上一次最后设定的捕捉角度和长度作为默认值。然后,程序需要用户选择输入一点作为基准点,此时命令行提示:F2/F3/F4/F5/ESC/Return/下一点:用户根据该提示可任选其中的一种操作,具体解释如下:①按F2键重新设定捕捉角度;②按F3键重新设定捕捉长度;③按F4键窗口缩小0.7倍;④按F5键窗口放大1.4倍;⑤按ESC键、回车键、鼠标右键均可完毕操作,退出程序;⑥选取下一点,移动十字光标键,此时在屏幕的最上面的一行的坐标提示栏准确地显示出按用户设定的捕捉角度和长度所取得的落点相对于基准点的偏移角度和长度,滑动十字光标键直至用户寻找到所需要的下一点并按下鼠标左键,命令行重又出现上面的提示行,并进展下一轮循环;⑦另外,用户还可以点取View菜单下的Zoom菜单中的ZoomWindow、ZoomPrevious、ZoomAll等三个子项实现窗口放缩和Pan菜单实现屏幕漫游;对于其他操作,用户均可按屏幕命令行的中文提示方便地进展操作。在非汉化AutoCAD中运行本程序时,只需将程序中有关的中文提示行改成英文提示即可。另外,由于不同的机型在AutoCAD环境下键盘返回码可能稍有区别,所以要求用户在应用本程序之前对自己的机器键盘返回码按如下方法作一次核实:在AutoCAD命令状态下输入(grread)并回车,用户此时可按下F2或F3、F4、F5键:第一步:Command:(grread)回车第二步:按下F2键此时,屏幕上回显刚输入的键值,比方对笔者使用的机器(ASTPIII+4/66D)回显为:(2136)。其具体涵义为:第一个数字"2"表示刚刚是键盘输入;第二个数字"136"表示本机器的"F2"键的返回码。按上述步骤依次对FF4、F5键的返回码进展核实,笔者的机器该三键的返回码分别为137、138、139。如果核实结果与上述结果不符(比方,对某些机型,上述四键的返回码分别为138、139、140、141),那么应对程序中的相应语句作如下修改。在"承受用户输入控制子程序"pul
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度海上风电场建设施工合同
- 二零二四年度软件开发补充合同
- 简单版本租赁合同
- 二零二四年度技术研发合同:便利店科技创新与产品迭代
- 2024年度金融服务与产品经营承包合同
- 2024版企业融资期权合同范本
- 北京工业大学耿丹学院《论文写作与作品集排版》2023-2024学年第一学期期末试卷
- 2024餐厅顾客反馈与投诉处理合同
- 二零二四年度电商连锁加盟商合同解除合同3篇
- 黄牛托管合同范本
- CJJT148-2010 城镇燃气加臭技术规程
- 进料加工业务操作流程
- 《公路工程施工班组规范化安全管理指引》(T-GDPAWS 20-2023)
- 2024年秸秆收储合同4
- 陶瓷艺术一讲一做智慧树知到期末考试答案章节答案2024年沈阳理工大学
- 事业单位管理岗位职员等级晋升制度面临问题及实施对策探析
- 驾照考试题库及答案
- MOOC 中国文化概论-华南师范大学 中国大学慕课答案
- 密封条范文模板(A4打印版)
- 导管相关血流感染预防与控制技术指南课件
- Unit+5+Education+语法知识点 高中英语北师大版(2019)选择性必修第二册
评论
0/150
提交评论