CAD程序设计课程设计指导书.docx
- 文档编号:26639938
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:37
- 大小:24.58KB
CAD程序设计课程设计指导书.docx
《CAD程序设计课程设计指导书.docx》由会员分享,可在线阅读,更多相关《CAD程序设计课程设计指导书.docx(37页珍藏版)》请在冰豆网上搜索。
CAD程序设计课程设计指导书
《CAD程序设计》课程设计
指导书
环境与建筑工程学院测绘教研室
《CAD程序设计》课程设计大纲
课程类别:
比修学时:
1周
课程性质:
实践教学开课学期:
第7学期
开课专业:
测绘工程
先修课程:
AutoCAD,计算机高级语言
一、课程设计的基本目的与任务
本课程设计是测绘工程的专业技术实践课。
本实践课的主要目的和任务是:
(1)、掌握VisualLisp程序设计的方法;
(2)掌握VisualLisp操纵AutoCAD的程序设计方法;(3)掌握在VisualLISP中使用AutoCADActiveX对象的方法;(4)掌握在VisualLISP中使用可编程对话框制作用户界面的方法;(5)掌握自定义AutoCAD界面的方法。
二、教学基本要求
课程设计的进行方式是在教师指导下由学生独立完成的。
每个学生都应该明确设计任务和要求,并拟定设计计划,注意掌握进度,按时完成。
设计分段进行,每一阶段的设计都要认真检查,没有原则错误时才能继续进行下一段设计,以保证设计质量,循序完成设计任务。
设计过程中要独立思考、深入钻研,主动地、创造性地进行设计,反对照抄照搬或依赖教师。
要求设计态度严肃认真,有错必改,反对敷衍塞责,容忍错误存在。
只有这样才能保证课程设计,达到教学基本要求,在设计思想、设计方法和设计技能等方面得到良好的训练。
三、课程设计的内容
(1)通过资料查阅和学习了解VisualLisp程序设计的方法;
(2)设计程序算法、绘制流程图;
(3)建立AutoCAD菜单、工具条、按钮;
(4)设计程序的用户界面;
(5)编写程序代码、调试程序;
(6)编写课程设计报告。
四、课程设计的学时分配
教学内容
学时
地点
1、集中学习
半天
教室
资料查阅与学习,讨论
1天
图书馆、实验室
设计程序算法、绘制流程图
2天
实验室
建立AutoCAD菜单、工具条、按钮
半天
实验室
设计程序的用户界面
1天
实验室
编写程序代码、调试程序
1天
实验室
编写课程设计报告
1天
教室
注:
课程设计总结论文业余时间完成。
五、课程设计总结论文要求
(1)综述;
(2)设计程序算法、绘制流程图;
(3)建立AutoCAD菜单、工具条、按钮的方法;
(4)设计程序的用户界面;
(5)设计总结。
(6)附录:
源程序
六、参考题目
(1)判断一个点是否在闭合多边形的里面,该多边形的边界是由线段和园弧组成。
(2)判断一个闭合多段线是否交叉,该多段线是由线段和园弧组成。
(3)用多段线生成Hatch实体的边界线。
(4)设计一个程序解决汉诺塔问题:
有三根柱子,分别为A、B、C,A柱上有一叠按大小顺序叠好的盘子,要求每次只能移动一个盘子,盘子的大小顺序不能改变,且盘子不能离开这三根柱子,将A柱上的盘子全部移到C柱。
(5)设计一个程序将指定区域外的图形剪断,并将区域内的图形保存到一个文件中。
七、主要参考资料
《AutoCAD2004命令参考》
《AutoCAD2004自定义手册》
《软件工程》
《AutoLISPDeveloper'sGuide》
《AutoLISPReference》
《DXF参考》
《ActiveX和VBA开发人员指南》
《ActiveXandVBAReference》
《计算机图形学》
几个VisualLisp程序设计实例
第一个实例:
判断一指定点与某个三角形的关系(用autolisp实现)
判断一指定点与某个三角形的关系:
1.在三角形三边上;2.在三角形内;3.在三角形外
算法:
一.输入的数据
假设三角形的三顶点为:
p1p2p3
指定点为:
p0
二.作辅助线
1.从p1p2p3中选择一点pt使之与p0不相同,三角形的其余点为pta,ptb
2.以pt和p0作一射线(p0端无限延长)RL,以pta和ptb作一构造线(两端无限延长)XL
3.求RL和XL的交点。
三.判断两辅助线是否平行
4.如果无交点,则p0在三角形外;如果有交点,则设交点为xp
四.判断p0是否在三角形的三边上
5.如果xp等于p0,则进一步判断:
如p0在线段(pta--ptb)外,则p0在三角形外;否则p0;在三角形的三边上
6.如果xp等于pta,则进一步判断:
如p0在线段(pt--pta)外,则p0在三角形外;否则p0;在三角形的三边上
7.如果xp等于ptb,则进一步判断:
如p0在线段(pt--ptb)外,则p0在三角形外;否则p0;在三角形的三边上
五.判断p0是否在三角形外
8.如果xp在线段(pta--ptb)外,则p0在三角形外
9.如果p0在线段(pt--xp)外,则p0在三角形外
10.以上条件都不满足,则p0在三角形内
实现方案
1.定义一函数GetTrianglePoints,获取三角形的三顶点表lst
2.获取指定点p0
3.调整顶点表lst使其第一点与p0不相等
4.以p0和lst中的第一点组成一构造线,再以lst中的第二,第三点组成另一构造线
并求得其交点xp.如无交点,则p0在三角形外out=1
5.定义一函数IsOutLine(pp1p2),用以判断一个点p是否在另外两个点p1p2组成得线段外
6.如果xp与p0相等,作进一步处理
调用IsOutLine判断p0是否在线段((cadrlst)--(caddrlst))外
如p0在该线段外,则p0在三角形外out=1;否则p0在三角形的三边上out=2
7.如果xp与lst中的第二点相等,作进一步处理
调用IsOutLine判断p0是否在线段((carlst)--(cadrlst))外
如p0在该线段外,则p0在三角形外out=1;否则p0在三角形的三边上out=2
8.如果xp与lst中的第三点相等,作进一步处理
调用IsOutLine判断p0是否在线段((carlst)--(caddrlst))外
如p0在该线段外,则p0在三角形外out=1;否则p0在三角形的三边上out=2
9.调用IsOutLine判断xp是否在线段((cadrlst)--(caddrlst))外
如xp在该线段外,则p0在三角形外out=1
10.调用IsOutLine判断p0是否在线段((carlst)--xp)外
如xp在该线段外,则p0在三角形外out=1
11.则p0在三角形内out=2
12.显示对话框输出处理结果
源程序如下:
;;;5.定义一函数IsOutLine(pp1p2),用以判断一个点p是否在另外两个点p1p2组成得线段外
;;;如p是在p1p2所组成的线段外,则返回t,否则nil;;;
(DEFUNIsOutLine(pp1p2/rt)
(IF(EQUAL(CARp1)(CARp2)MaxError)
(PROGN
(SETQrt(IsOutTwoDouble(CADRp)(CADRp1)(CADRp2)))
)
(PROGN
(SETQrt(IsOutTwoDouble(CARp)(CARp1)(CARp2)))
)
)
rt
)
;;;判断实数r0是否在r1r2所组成的区间外;;;
;;;如r0是在r1r2所组成的线段外,则返回t,否则nil;;;
(DEFUNIsOutTwoDouble(r0r1r2/tmprt)
(IF(>r1r2)
(SETQtmpr1
r1r2
r2tmp
)
)
(IF(OR(
(SETQrtT)
;;(setqrtnil)
)
rt
)
;;;.定义一函数GetTrianglePoints,获取三角形的三顶点表lst;;;
;;;如用户选择的是一闭合三角形,返回三顶点表,否则返回nil;;;
(DEFUNGetTrianglePoints(/entlstitmptlsti)
(SETQent(ENTSEL"选择一闭合三角形:
"))
(IF(ANDent
(="LWPOLYLINE"
(CDR(ASSOC0(SETQlst(ENTGET(CARent)))))
)
)
(PROGN
(SETQi0)
(WHILE(SETQitm(NTHilst))
(WHILE(ANDitm(/=10(CARitm)))
(SETQi(1+i))
(SETQitm(NTHilst))
)
(IFitm
(SETQptlst(APPENDptlst(LIST(CDRitm))))
)
(SETQi(1+i))
)
)
)
(IF(OR(=ptlstnil)(/=(LENGTHptlst)3))
nil
ptlst
)
)
;;;主函数;;;
;;;Out1--外2--线上3--内;;;
(DEFUNc:
IsOutTriangle(/lstp0MaxErrorxpOutstr)
(SETVAR"cmdecho"0)
(SETQMaxError0.0000001)
;;;1.调用函数GetTrianglePoints,获取三角形的三顶点表lst;;;
(SETQlst(GetTrianglePoints))
;;;2.获取指定点p0;;;
(WHILE(ANDlst(SETQp0(GETPOINT"\n请输入指定点:
")))
(SETQoutnil)
;;将三维p0变成二维p0;;
(SETQp0(LIST(CARp0)(CADRp0)))
;;;3.调整顶点表lst使其第一点与p0不相等;;;
(IF(EQUALp0(CARlst)MaxError)
(SETQlst(APPEND(CDRlst)(LIST(CARlst))))
)
;;;4.以p0和lst中的第一点组成一构造线,再以lst中的第二,第三点组成另一构造线;;;
;;;并求得其交点xp.如无交点,则p0在三角形外out=1;;;
(IF(=(SETQxp(INTERS(CARlst)p0(CADRlst)(CADDRlst)nil))
nil
)
(SETQout1)
)
;;;6.如果xp与p0相等,作进一步处理;;;
;;;调用IsOutLine判断p0是否在线段((cadrlst)--(caddrlst))外;;;
;;;如p0在该线段外,则p0在三角形外out=1;否则p0在三角形的三边上out=2;;;
(IF(AND(=outnil)(EQUALxpp0MaxError))
(PROGN
(IF(IsOutLinep0(CADRlst)(CADDRlst))
(SETQout1)
(SETQout2)
)
)
)
;;;7.如果xp与lst中的第二点相等,作进一步处理;;;
;;;调用IsOutLine判断p0是否在线段((carlst)--(cadrlst))外;;;
;;;如p0在该线段外,则p0在三角形外out=1;否则p0在三角形的三边上out=2;;;
(IF(AND(=outnil)(EQUALxp(CADRlst)MaxError))
(PROGN
(IF(IsOutLinep0(CARlst)(CADRlst))
(SETQout1)
(SETQout2)
)
)
)
;;;8.如果xp与lst中的第三点相等,作进一步处理;;;
;;;调用IsOutLine判断p0是否在线段((carlst)--(caddrlst))外;;;
;;;如p0在该线段外,则p0在三角形外out=1;否则p0在三角形的三边上out=2;;;
(IF(AND(=outnil)(EQUALxp(CADDRlst)MaxError))
(PROGN
(IF(IsOutLinep0(CARlst)(CADDRlst))
(SETQout1)
(SETQout2)
)
)
)
;;;9.调用IsOutLine判断xp是否在线段((cadrlst)--(caddrlst))外;;;
;;;如xp在该线段外,则p0在三角形外out=1;;;
(IF(AND(=outnil)(IsOutLinexp(CADRlst)(CADDRlst)))
(SETQout1)
)
;;;10.调用IsOutLine判断p0是否在线段((carlst)--xp)外;;;
;;;如xp在该线段外,则p0在三角形外out=1;;
(IF(AND(=outnil)(IsOutLinep0(CARlst)xp))
(SETQout1)
)
;;;11.则p0在三角形内out=2;;;
(IF(=outnil)
(SETQstr"内")
)
(IF(=out1)
(SETQstr"外")
)
(IF(=out2)
(SETQstr"的边线上")
)
;;;12.显示对话框输出处理结果;;;
(ALERT(STRCAT"指定点在选定的三角形"str))
)
(SETVAR"cmdecho"1)
(PRINC)
)
(PRINC"\n要执行本程序,请输入命令:
IsOutTriangle")
第二个实例:
判断一指定点与某个区域的关系(用active实现)
源程序如下:
(vl-load-com)
(defunInorOut(/entptobjminptmaxptptoutobjline
ptlstnixpParamDerivOnlinep1
p2
)
(setvar"cmdecho"0)
(setqent(entsel"\n选择一闭合图形"))
(ifent
(progn
(setqent(carent))
(setqobj(vlax-ename->vla-objectent))
(if(not(vlax-curve-isClosedobj))
(progn
(vlax-release-objectobj)
(setqobjnil)
)
)
)
)
(ifobj
(while(setqpt(getpoint"\n输入测试点="))
(setqOnlinenil)
(vla-getBoundingBoxobj'minpt'maxpt)
(setqptout(vlax-safearray->listminpt))
(setqptout(list(-(carptout)1000.0)(cadrpt)0.0))
;;得到与pt水平的图形外一点;;
(setqobjline
(vlax-ename->vla-object
(entmakex
(list(cons0"LINE")(cons10pt)(cons11ptout))
)
)
)
;;得到一不可见的直线;;
(setqptlst(vla-IntersectWithobjobjlineacExtendNone))
;;求交点;;
(vla-Deleteobjline)
(vlax-release-objectobjline)
(setqptlst(vlax-variant-valueptlst))
(if(>=(vlax-safearray-get-u-boundptlst1)
(vlax-safearray-get-l-boundptlst1)
)
(setqptlst(vlax-safearray->listptlst))
;;得到交点坐标组成的表;;
(setqptlstnil)
;;无交点;;
)
(setqn0
i0
)
(while(andptlst(nthiptlst)(=Onlinenil))
(setqxp
(list(nthiptlst)(nth(1+i)ptlst)(nth(+2i)ptlst))
)
(setqn(1+n))
(setqi(+i3))
(if(equalptxp0.000001)
(setqOnlinet)
)
(if(=Onlinenil)
(progn
(setqParam(vlax-curve-getParamAtPointobjxp))
(setqp1(vlax-curve-getPointAtParamobj(-Param0.01)))
(setqp2(vlax-curve-getPointAtParamobj(+Param0.01)))
(if
(or(and(<(cadrxp)(cadrp1))(<(cadrxp)(cadrp2)))
(and(>(cadrxp)(cadrp1))(>(cadrxp)(cadrp2)))
)
(setqn(1+n))
;;交点附近的图形在直线的一边时,此交点算两个;;
)
)
)
)
(ifOnline
(alert"在闭合图形的边界线上")
(if(=n(*(/n2)2))
(alert"在闭合图形的外面")
;;双数个交点,在闭合图形的外面;;
(alert"在闭合图形的里面")
;;单数个交点,在闭合图形的里面;;
)
)
)
)
(vlax-release-objectobj)
(setvar"cmdecho"1)
(princ)
)
第三个实例:
汉诺塔问题
源程序如下:
(defunDraw(/sssx0x1x3ientboxlst)
(initget7)
(setqCengShu(getint"输入层数="))
(setqs(*CengShu1.1))
;;删除原有图形;;
(setqss(ssget"x"))
(ifss
(vl-cmdf"erase"ss"")
)
;;定义块;;
(if(=*block*nil)
(progn
(setvar"clayer""0")
(setvar"CECOLOR""byblock")
(vl-cmdf"pline"
(list-0.50.00.0)
(list0.50.00.0)
(list0.510.0)
(list-0.510.0)
"c"
)
(vl-cmdf"bhatch""s"(setqent(entlast))"""p""solid""")
(entdelent)
(vl-cmdf"block""box"(list0.00.00.0)(entlast)"")
(setq*block*"box")
(setvar"CECOLOR""bylayer")
)
)
;;画柱0;;
(setqX00.0)
(vl-cmdf"line"
(list(+x0(*-0.5s))0.00.0)
(list(+x0(*0.5s))0.00.0)
""
)
(vl-cmdf"line"(listx00.00.0)(listx0s0.0)"")
;;画柱1;;
(setqx1(+x0(*s1.2)))
(vl-cmdf"line"
(list(+x1(*-0.5s))0.00.0)
(list(+x1(*0.5s))0.00.0)
""
)
(vl-cmdf"line"(listx10.00.0)(listx1s0.0)"")
;;画柱2;;
(setqx2(+x1(*s1.2)))
(vl-cmdf"line"
(list(+x2(*-0.5s))0.00.0)
(list(+x2(*0.5s))0.00.0)
""
)
(vl-cmdf"pline"
(list(*-1.0s)(*-1.0s)0.0)
(list(+x2s)(*-1.0s)0.0)
(list(+x2s)(*1.2s)0.0)
(list(*-1.0s)(*1.2s)0.0)
"c"
)
(vl-cmdf"line"(listx20.00.0)(listx2s0.0)"")
;;在柱0上画方块;;
(setqi0)
(while( (vl-cmdf"insert"*block*(listx0i0.0)(-CengShui)10) (setqent(entlast)) (vl-cmdf"change"ent"""p""c"(-CengShui)"") (setqboxlst(appendboxlst(listent))) (setqi(1+i)) ) (vl-cmdf"zoom""e") (list(listx0boxlst)(listx1nil)(listx2nil)) ) (defunMoveOne(FromTo/boxlstFromboxlstToXFrom XToitmEntsp1p2pn angiang0mplst ) (setqitm(nthFrom*Boxs*)) (setqXFrom(nth0itm) boxlstFrom(nth1itm) ) (setqitm(nthTo*Boxs*)) (setqXTo(nth0itm) boxlstTo(nth1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CAD 程序设计 课程设计 指导书