CAD程序设计课程设计指导书.docx

上传人:b****6 文档编号:14143337 上传时间:2023-06-21 格式:DOCX 页数:37 大小:24.58KB
下载 相关 举报
CAD程序设计课程设计指导书.docx_第1页
第1页 / 共37页
CAD程序设计课程设计指导书.docx_第2页
第2页 / 共37页
CAD程序设计课程设计指导书.docx_第3页
第3页 / 共37页
CAD程序设计课程设计指导书.docx_第4页
第4页 / 共37页
CAD程序设计课程设计指导书.docx_第5页
第5页 / 共37页
CAD程序设计课程设计指导书.docx_第6页
第6页 / 共37页
CAD程序设计课程设计指导书.docx_第7页
第7页 / 共37页
CAD程序设计课程设计指导书.docx_第8页
第8页 / 共37页
CAD程序设计课程设计指导书.docx_第9页
第9页 / 共37页
CAD程序设计课程设计指导书.docx_第10页
第10页 / 共37页
CAD程序设计课程设计指导书.docx_第11页
第11页 / 共37页
CAD程序设计课程设计指导书.docx_第12页
第12页 / 共37页
CAD程序设计课程设计指导书.docx_第13页
第13页 / 共37页
CAD程序设计课程设计指导书.docx_第14页
第14页 / 共37页
CAD程序设计课程设计指导书.docx_第15页
第15页 / 共37页
CAD程序设计课程设计指导书.docx_第16页
第16页 / 共37页
CAD程序设计课程设计指导书.docx_第17页
第17页 / 共37页
CAD程序设计课程设计指导书.docx_第18页
第18页 / 共37页
CAD程序设计课程设计指导书.docx_第19页
第19页 / 共37页
CAD程序设计课程设计指导书.docx_第20页
第20页 / 共37页
亲,该文档总共37页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

CAD程序设计课程设计指导书.docx

《CAD程序设计课程设计指导书.docx》由会员分享,可在线阅读,更多相关《CAD程序设计课程设计指导书.docx(37页珍藏版)》请在冰点文库上搜索。

CAD程序设计课程设计指导书.docx

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(r0r2))

(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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2