2autocad2009-建筑图学基础随书光盘3.01g ch14n_第1页
2autocad2009-建筑图学基础随书光盘3.01g ch14n_第2页
2autocad2009-建筑图学基础随书光盘3.01g ch14n_第3页
2autocad2009-建筑图学基础随书光盘3.01g ch14n_第4页
2autocad2009-建筑图学基础随书光盘3.01g ch14n_第5页
已阅读5页,还剩120页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、建筑设计14.1墙 的 绘 制在本节中将带领读者画出一个如图 14-1 所示的墙。按【Enter】键后 光标线所在就是墙心线光标线图 14-1 本程序的画墙功能完成图本例将主要用到几个程序,其中:vwall 为主程序,midvpt详细讲述它们的功能以及程序设计的技巧。本范例完成文件:vwall.lsp(见本书范例光盘)为子程序。接下来主程序 vwall作用:画双线墙(1)(defun c:vwall (/wallsidesp ep halfthk ang angp90 angm90tang ws lone l2 l3 l4 wal&midp temp sv_osmodemsgwa4 msgwa

2、5 wallthk)(2)()(3)(if *acadObject* (4)()(5)(setq *acadObject* (vlax-get-acad-object)(6)258向右(向下)模式向左(向上)模式【Enter】模式的右边,则 墙线将向右 位移 12将光标定在 光标线的左边,则 墙线将向左 位移 12将光标定在 (7)(if *acad (8)()(9)(setq *acad (10)(11)(if *mSpace*(12)()* (vla-get-Active*acadObject*)(13)(setq *mSpace* (vla-get-M (14)(15)(if *Util

3、*(16)()Space *acad*)(17)(setq *Util* (vla-get-Utility *acad (18)(19)(if *Layers* (20)()(21)(setq *Layers* (vla-get-layers *acad (22)(23)(setq curla(vla-get-ActiveLayer *acad*)*)*);获取当前的图层,并将之在变量curla 中(24)(setq lalen(vla-get-count *Layers*) (25)i 0(26)existwalla n) (27)(while ( i lalen)(28)(if (= (v

4、la-get-name(vla-item *Layers* i) wall) (29)(setq existwalla y)(30) )(31)(setq i (1+ i) (32)(33)(if (= existwalla y) (34)()(35)(setq walla(vla-add *Layers* wall)(36)259建筑设计如果图层“ WALL” 不存在,那么就再增加一个。这是因为在设计上这个墙必须绘于“ WALL” 图层上,以与其他用 LINE 或 PLINE 指令画的线区隔开。这样,当后续有程序还要用来编辑墙线时,就不会再去使用所有图层里的一大堆线来判断,而延误执行的时间。

5、(37)(vla-put-activelayer *acad* walla);将当前图层设定为“WALL”(38)(setvar cmdecho 0)(39)(setq sv_osmode (getvar osmode) (40)(setvar osmode 0);设定一些需要暂时关闭的系统变量(41)(VL-CMDF fillet r 0);设定圆角半径为 0,即欲实现无半径修交角(42)(setq wallthk 12.0);设定墙厚为 12.0,并存在变量 wallthk 中(43)(prompt 请输入墙厚: );显示墙厚并提示输入(43)(setq temp (getreal)260

6、(44)(if temp(45)(setq wallthk temp) (46);如果使用者输入其他数值,则将该值存入 wallthk 变量中(47)(setq sp (getpon 请点取墙起点:);提示输入墙起始点(48)(setqy);设定变量来判断是否第一根墙线(49)(while (setq ep (getposp n 请点取墙端点:);当输入墙的第二点非 nil(即空白)时,执行以下程序段(50)(setq vl3 (vla-addline *mSpace* (vlax-3d-posp) (vlax-3d-poep);画出墙线(51)l3 (vlax-vla-object-enam

7、e vl3);将墙线转换为 ename(实体名称)vl3midp (midvpt (vlax-3d-posp) (vlax-3d-poep)l3midp(vlax-safearray-list vl3midp);求得墙线中点并将其转换为表的形式(54) )(55) (setq wal&midp (list l3 l3midp)261建筑设计;将实体名称和中点作为一个表在wal&midp 变量中(56)halfthk(/ wallthk 2.0) ;一半墙厚 (57)ang(angle sp ep)angp90(+ ang (/ pi 2)angm90(- ang (/ pi 2);计算直线的角

8、度及加 pi/2 和减 pi/2 的角度值,以备偏移使用(60)ws (getpo“n 请点取要以墙的哪边作为标准,按【Enter】键则以墙中心为准画墙”);提示输入另一条墙线位置,以点输入(61)(62)(if (= ws nil) (63)(setq wallside c);如果使用者按下【Enter】键,则将“c”存入 wallside 变量中(64)(progn (setq tang (- (angle ep ws) (angle ep sp) (65)(if (or (and ( tang 0) ( tang pi) ( tang (* -1 pi)(setq wallside r)

9、(setq wallside l) (68)(69) )(70);如果使用者没有按下【Enter】键,则判断使用者所点取的点是在原墙线的左边或右边(cond (= wallside c)(vl-cmdf offset(73)halfthk262(74)(75)(76)(77)(78)(79)(80)(81)(82)(83)(84)(85)(86)(87)wal&midp(polar sp angp90 halfthk) )(setq l4 (entlast)(vl-cmdfoffset halfthk wal&midp(polar sp angm90 halfthk)(setq l3 (ent

10、last)(vl-cmdf erase wal&midp );如果墙在墙线中间,则如图 14-1 所示在其两边进行偏移(offset)1/2 墙厚,并删除中线(88)(89)(90)(91)(= wallside l)(vl-cmdf offset wallthk wal&midp ws ) (setq l4 (entlast);如果点取的是左边,则向左偏移一个墙厚(92)(93)(94)(95)(96)(97) )(= wallside r)(vl-cmdf offset wallthk wal&midp ws ) (setq l4 l3)(setq l3 (entlast);如果点取的是右

11、边,则向右偏移一个墙厚263建筑设计(98)(setvar osmode sv_osmode)(99)(if (=n)(100)(vl-cmdf fillet lone l3 fillet l2 l4) (101);如果不是第一条墙线,则两条墙线交接处就要修一个半径为 0 的圆角(即修交角)(102)(setqn)(103)(setq sp ep (104)lone l3(105) l2 l4 (106)(107);之后,将lone 设为l3,l2 设为l4,它们将与另 2画出的墙线l3 和l4 修交角(108)(vla-put-activelayer *acad* curla);画完墙后,将

12、当前图层恢复回程序执行前的状态(109)(princ)(110)子程序 midvpt作用:计算并获取两点的中点。(defun midvpt (vpt1 vpt2 / pt1x pt1y pt1z pt2x pt2y pt2z mptx mptymptz mpt)(setq pt1x (vlax-safearray-geement (vlax-variant-value vpt1) 0)pt1y (vlax-safearray-ge pt1z (vlax-safearray-ge pt2x (vlax-safearray-ge pt2y (vlax-safearray-gept2z (vlax-

13、safearray-geement (vlax-variant-value vpt1) 1) ement (vlax-variant-value vpt1) 2) ement (vlax-variant-value vpt2) 0) ement (vlax-variant-value vpt2) 1)ement (vlax-variant-value vpt2) 2)264(setq mptx (/ (+ pt1x pt2x) 2) mpty (/ (+ pt1y pt2y) 2) mptz (/ (+ pt1z pt2z) 2)(setq mpt (vlax-variant-value vp

14、t1)(vlax-safearray-pu (vlax-safearray-pu (vlax-safearray-pu (eval mpt)ement mpt 0 mptx) ement mpt 1 mpty)ement mpt 2 mptz)本范例的执行步骤假设 vwall.lsp 被置于:AutoCAD 设计院/NO.7Sles 目录下,如果您将这些文件放在另外的目录里,那么本范例中有关存取这些文件的路径也要更改(请参考 2.5 节)。然后,再按如下步骤执行。在 AutoCAD 指令提示号后输入(参考图 2.22 也可以):指令: (load vwall.lsp) 请输入墙厚:(按【Ent

15、er】或输入数值)请点取墙起点:(点取一点) 请点取墙端点:(点取另一点)请点取要以墙的哪边作为标准,按【Enter】键则表以墙中心为准画墙请点取墙端点:.请点取墙端点:【Enter】14.2窗 的 绘 制265建筑设计本范例将画出一个如图 14-2 所示的窗。本例将主要用到几个程序,其中:Hwindows 为主程序,drawswing、getthk、dtr、rtd、distvp、midvpt、svar 与 rvar 等为子程序。接下来计的技巧。详细讲述它们的功能以及程序设二扇推拉窗 三扇推拉窗 四扇推拉窗 图 14-2 本程序的画窗功能完成图本范例完成文件:Hwindow.lsp(本书范例光

16、盘)本范例配合文件:winblk1.dwg(本书范例光盘) winblk2.dwgwinblk3.dwg winblk4.dwgwinblk5.dwg主程序 Hwindows作用:在 14.1 节所画的墙中水平方向的窗。(1)(defun c:Hwindow (/ temp ipt refpt rang sang p1 p2 p3 p4 wdpth rblk s1 s2 s3 s4 pm12 pm34w1 w2 nalnth existopenla lalen i openla mdubs mstr vp1 vp2 vp3 vp4 curla walla ila vwb vp31 vp41 m

17、tempvbwb)(2)()(3)(if *acadObject*(4)()266推开窗固定窗(5)(setq *acadObject* (vlax-get-acad-object)(6)(7)(if *acad (8)()(9)(setq *acad (10)(11)(if *mSpace*(12)()* (vla-get-Active*acadObject*)(13)(setq *mSpace* (vla-get-M (14)(15)(if *Util*(16)()Space *acad*)(17)(setq *Util* (vla-get-Utility *acad (18)(19)(i

18、f *Selsets* (20)()(21)(setq *Selsets* (vla-get-SelectionSets *acad (22)(23)(if *Layers* (24)()(25)(setq *Layers* (vla-get-layers *acad(26)*)*)*);获取当前的图层,并将之在整体变量layers 中(27)(setq lalen (vla-get-count *Layers*) (28)i 0(29)existopenla n (30)(31)(while ( (strlen winblk) 9) (57)(setq winblk (substr winb

19、lk 1 9)(58);设定以角度为 0,窗宽度为 120 来水平窗268(59)(setq refpt T)(60)(While (member refpt (T W)(61)(Prompt n 请点取欲安放窗的参考点位置或 : (62);提示使用者输入点(63)(setvar osmode 544);设定图形锁点方式(64)(initget W T) (65)(setq refpt (getpo ) (66)(cond(67)(= refpt T);先定义W(设窗宽)与T(窗类型),准备让使用者选择(68)(prompt n 请选择窗型式 :(69)(70)(initget 1 2 3 4

20、 5) (71)(setq temp (getkword) (72)(cond(73)(= temp 1) (setq winblk winblk1.dwg)(74)(= temp 2) (setq winblk winblk2.dwg)(75)(= temp 3) (setq winblk winblk3.dwg)(76)(= temp 4) (setq winblk winblk4.dwg)(77)(= temp 5) (setq winblk winblk5.dwg)(78)(79);根据使用者的选择,而赋值对应的图块名称269建筑设计(80)(= refpt W)(81)(82)(83

21、)(84)(85)(86)(87)(88)(prompt 请输入窗宽 :)(setq temp (getreal) (if (eval temp)(setq wwdth temp);使用者如输入W,则提示其输入窗的宽度(89) (= refpt nil) (exit) (90)(91);如果使用者键入空的(nil),则跳出程序(92)(setvar osmode 0)(93)(setvar cmdecho 0)(94)(setvar orthomode 1) (95)(setq rang (dtr ang) (96)(setq ipt refpt) (97)(setqvb (vla-Inser

22、tBlock (98)*mSpace*(99)(vlax-3d-porefpt)winblkwwdth (102) 12.0(103) 1(104) 0(105) )270(106);设计窗图块时的预览影像(107)(prompt n 请将之平移到窗的实际位置上:);提示使用者将窗移到适当位置上(108)(setvar dragmode 2)(109)(setvar osmode 544);设定需要的系统变量(110)(setq rblk (vlax-vla-object-ename vb);将图块转换为图元名称(111)(d move rblk refpt pause);移动图块至适当位置(

23、112)(setq p1 (getvar lastpo );取得窗图块的最后位置(113)(setq vp1 (vlax-3d-pop1)(114)(d erase rblk );删除窗的辅助图块。(115)(setq sang (+ rang (/ pi 2)(116)(setq vp2 (vla-PolarPo*Util* vp1 rang wwdth) (117)(setq pm12 (midvpt vp1 vp2)271建筑设计(118)(setq wallthk (getthk pm12 sang)(119)(setq vp3 (vla-PolarPo*Util* vp1 sang

24、wallthk)(120) vp4 (vla-PolarPo*Util* vp3 rang wwdth) (121)(122)(setq pm34 (midvpt vp3 vp4)计算获取个点 vp1,vp2,vp3,vp4 及 vp1,vp2 和 vp3,vp4 的中点。其中的两个中点用于选取墙线。(123)(if sset (124)(vla-clear sset) (125)(126)(vla-Selec Po sset pm12 mdubs mstr) (127)(vla-Selec Po sset pm34 mdubs mstr) (128)(setq wlone (vla-item

25、 sset 0)(129)(setq wl2 (vla-item sset 1)(130)(setq ewlone (vlax-vla-object-ename wlone) (131)ewl2 (vlax-vla-object-ename wl2)(132)(133)(setq p2 (vlax-safearray-list (vlax-variant-value vp2)p3 (vlax-safearray-list (vlax-variant-value vp3)p4 (vlax-safearray-list (vlax-variant-value vp4) (136)(137)(set

26、q curla (vla-get-Activelayer *acad(138) walla(vla-get-layer wlone) (139)(140)(setq lalen (vla-get-count *Layers*)(141) ila 0 (142)(143)(while ( ila lalen)*)(144)(if (= walla (vla-get-name (vla-item *Layers* ila)(145)(vla-put-Activelayer *ACAD* (vla-item *Layers* ila)272(146) )(147)(setq ila (1+ ila)

27、 (148)(149)(d break ewlone p2 p1 break ewl2 p4 p3)(150)(vla-addline *mSpace* vp1 vp3)(151)(vla-addline *mSpace* vp2 vp4);执行断开墙线并联结vp1,vp3 及vp2,vp4(152)(if (= wallthk 15.0);如果墙的厚度小于或等于 15 的话,就执行下面的程序段(153)(progn (setq wdpth wallthk)(154)(setq vp31 (vla-PolarPo*Util* vp1 sang wdpth)(155)(156)vp41 (vla

28、-PolarPo*Util* vp2 sang wdpth)(157)(setq vwb (vla-InsertBlock *mSpace* vp1 winblk wwdth wdpth 1 (rtd rang)(158);窗图块(159)(vla-put-layer vwb open);设定窗所在的图层。(160)(if (= winblk winblk4.dwg) (161)(drawswing)(162)(163)如果窗类型为 4,则调用子程序(drawswing)来绘图。如果墙厚超过 15.0,则执行以273建筑设计下代码:(164)(progn(setq wdpth 12.0)(se

29、tqvp31 (vla-PolarPo*Util* vp1 sang 12)(167)(168) )vp41 (vla-PolarPo*Util* vp2 sang 12)(setq bwline (vla-addline *mSpace* vp3 vp4)(setq vbwb (vla-InsertBlock*mSpace*vp1winblkwwdthwdpth(176) 1(177) (rtd rang)(178) )(179) )(vla-put-layer vbwb open)(if (= winblk winblk4.dwg)(182)(183) )(drawswing)(initg

30、et y n)(prompt n 要不要将窗换到墙的另一边?;提示是否窗的方向要改变(186) )(setq temp (getkword)(if (= temp y);如果要改变,就执行以下程序段:274(189) (progn(190)(191)(192)(193)(194)(setq mbwline (vla-mirror bwline(midvpt vp1 vp3) (midvpt vp2 vp4);镜像原窗(setq mtemp bwline wbwline mbwline mbwline mtemp)(vla-delete mbwline);删除原窗(197) (setq mvbw

31、b (vla-mirror vbwb (midvpt vp1 vp3) (midvpt vp2 vp4);镜像窗线(setq mtemp vbwb vbwb mvbwb mvbwb mtemp)(vla-delete mvbwb)(200) );删除窗线(201) (if (= winblk winblk4.dwg);如果为第 4 类窗,就执行以下程序段:(progn(setq mwarc (vla-mirror warc (midvpt p1 p3) (midvpt p2 p4);镜像窗中的弧(setq mtemp warc warc mwarc mwarc mtemp)(vla-delet

32、e mwarc)275建筑设计;镜像窗中的线(setq mwline (vla-mirror wline (midvpt p1 p3) (midvpt p2 p4)(setq mtemp wline wline mwline mwline mtemp)(vla-delete mwline)(209) )(210) )(211) )(212) )(213) ) (214)(rvar) (215)(princ)(216) )子程序 drawswing作用:画第类型的窗。(defun drawswing (/ jw ss rs es image pm13 pm24 mwarc mwline warc

33、 pm13 pm24 temp wline ) (setq jw (* 0.03 wwdth)(setq ss (polar (polar p1 rang jw) (+ rang (/ pi 2) (/ wdpth 2) (setq rs (- wwdth (* jw 2)(setq es (polar ss (+ rang (dtr 30) rs);计算一些需要的数值(d arc c ss (polar ss rang rs) es);画弧(setq s3 (entlast)(setq warc (vlax-ename-vla-object s3) (vla-put-layer warc o

34、pen)276;将弧转换为 vla 对象(setq wline (vla-addline *mSpace* (vlax-3d-poss) (vlax-3d-poes)(vla-put-layer wline open);画线(setq pm13 (midvpt (vlax-3d-pop1) vp31) pm24 (midvpt (vlax-3d-pop2) vp41);计算用于镜像所需的两个中点(setq temp nilimage 1)(while (/= temp y) (initget y n)(prompt n 以上所画的正确吗?(Y/N) 按 【ENTER】 键就会上下左右对调!);

35、提示使用者是否要改变方向(setq temp (getkword) (setq image (* image -1) (if (/= temp y)(if (= image -1) (progn(setq mwarc (vla-mirror warc pm12 pm34) (setq mtemp warc warc mwarc mwarc mtemp) (vla-delete mwarc)(setq mwline (vla-mirror wline pm12 pm34) (setq mtemp wline wline mwline mwline mtemp)(vla-delete mwline

36、)277建筑设计)(progn(setq mwarc (vla-mirror warc pm13 pm24) (setq mtemp warc warc mwarc mwarc mtemp) (vla-delete mwarc)(setq mwline (vla-mirror wline pm13 pm24) (setq mtemp wline wline mwline mwline mtemp) (vla-delete mwline);设计让使用者以按【Enter】来切换这 4 种模式,直到按下【Y】键来结束程序为止子程序 getthk作用:根据输入的点和给定角度来寻找与另一条墙线之间的距离

37、。从 fixp 点开始画一条线,与另一条墙线交于 otht,然后计算 fixp 与 otht 之间的距离,也就是墙的厚度。如果两条墙线之间的距离大于 40,则程序将要求选择另一条墙线,以再计算两个点的距离。(defun getthk (fixp schd / p1 p2 ip ps pe temp num aline tl1 tl2) (setq p1 (vla-PolarPo*Util* fixp schd 3)p2 (vla-PolarPo*Util* fixp schd 40)(if sset(vla-clear sset)(setq sset (vla-add *Selsets* pt

38、set)(vla-select sset acSelectionSetCrossing p1 p2 mdubs mstr)(setq len (vla-get-count sset)278(while (/= len 1)(prompt n 请点取另一条墙线:) (if sset(vla-clear sset)(vla-SelectOnScreen sset mdubs mstr) (setq len (vla-get-count sset)(setq tl (vla-addline *mSpace* p1 p2) tl2 (vla-item sset 0)(setq otht (vla-er

39、sectWith tl tl2 acExtendThisEntity) (if tl(vla-delete tl)(distvp fixp otht)子程序 dtr作用:将角度量转换成弧度量。(defun dtr (deg) (* (/ deg 180.0) pi)子程序 rtd作用:将弧度量转换成角度量。(defun rtd (rad) (* (/ ri) 180)子程序 distvp作用:计算并返回二点的距离。(defun distvp (vpt1 vpt2 / pt1x pt1y pt1z pt2x pt2y pt2z)(setq pt1x (vlax-safearray-geement

40、 (vlax-variant-value vpt1) 0)279建筑设计pt1y (vlax-safearray-ge pt1z (vlax-safearray-ge pt2x (vlax-safearray-ge pt2y (vlax-safearray-ge pt2z (vlax-safearray-ge)ement (vlax-variant-value vpt1) 1) ement (vlax-variant-value vpt1) 2) ement (vlax-variant-value vpt2) 0) ement (vlax-variant-value vpt2) 1)ement

41、 (vlax-variant-value vpt2) 2)(sqrt (+ (expt (- pt1x pt2x) 2) (expt (- pt1y pt2y) 2) (expt (- pt1z pt2z) 2)子程序 midvpt作用:计算并返回二点的中点。(defun midvpt (vpt1 vpt2 / pt1x pt1y pt1z pt2x pt2y pt2z mptx mpty mptz mpt)(setq pt1x (vlax-safearray-geement (vlax-variant-value vpt1) 0)pt1y (vlax-safearray-ge pt1z (v

42、lax-safearray-ge pt2x (vlax-safearray-ge pt2y (vlax-safearray-gept2z (vlax-safearray-geement (vlax-variant-value vpt1) 1) ement (vlax-variant-value vpt1) 2) ement (vlax-variant-value vpt2) 0) ement (vlax-variant-value vpt2) 1)ement (vlax-variant-value vpt2) 2)(setqmptx (/ (+ pt1x pt2x) 2) mpty (/ (+

43、 pt1y pt2y) 2) mptz (/ (+ pt1z pt2z) 2)(setq mpt (vlax-variant-value vpt1)(vlax-safearray-pu(vlax-safearray-pu (vlax-safearray-puement mpt 0 mptx)ement mpt 1 mpty) ement mpt 2 mptz)280(vlax-make-variant mpt)子程序 svar作用:设定执行此程序所需要的整体变量值。(defun svar ()(setq *z_orth* (getvar orthomode)*z_osmo* (getvar o

44、smode)*z_snap* (getvar snapmode)*z_cmde* (getvar cmdecho)子程序 rvar作用:恢复未执行此程序前的系统变量设定值。(defun rvar ()(setvar orthomode *z_orth*) (setvar osmode *z_osmo*) (setvar snapmode *z_snap*) (setvar cmdecho *z_cmde*)本范例的执行步骤假设 Hwindow.lsp 被置于:AutoCAD 设计院/NO.7Sles 目录下,如果您将这些文件放在另外的目录里,那么本范例中有关存取这些文件的路径也要更改(请参考

45、2.5 节)。然后,再按如下步骤执行。在 AutoCAD 指令提示号后输入(参考图 2-22 也可以)指令:(load hwindow.lsp)后按【Enter】键。参考图 14-3 所示执行操作。281建筑设计当还是孩子的时候,要尽自己做孩子的本份,努力充实自己,不要“ 人丑就怪父母” ;当身为父母时,尽教育的职责,处处以身作则,不要“ 子女不好就怪命苦” ;当身为社会的支柱时,就更应明白是非之道,黑白之理,从自身做起社会才能发展!动物园应征暑期工读生,跑去应征,恰好动物园里的猩猩病了,于是就请阿呆扮演猩猩在园里荡来荡去表演给游客看,结果一个不就荡到隔壁的区去了,眼一步一步地,正想大呼救命,

46、忽然开口说:“ 学弟不要怕,我是学长”。点取欲安放窗的参考点位置或图 14-3 画窗程序的执行操作282将之平移到窗的实际位置上:点取欲安放窗的参考点位置或:t选择窗型式:214.3门 的 绘 制本范例将画出一个如图 14-4 所示的门。图 14-4 本程序的画门功能完成图本例将主要用到几个程序,其中:Hdoor 为主程序,insertdoor、getthk、dtr、rtd、distvp、midvpt、svar 与 rvar 等为子程序。以下部分技巧。本范例完成文件:Hdoor.lsp (本书范例光盘)本范例配合文件:doorblks90.dwg (本书范例光盘)详细来讲述它们的功能以及程序设

47、计的主程序 Hdoor作用:在 14.1 节所画的墙中水平方向的门。(1)(defun c:Hdoor(/ temp dblk refpt)(2)()(3)(if *acadObject* (4)()(5)(setq *acadObject* (vlax-get-acad-object)(6) )(7)(if *acad(8)()*283建筑设计(9)(setq *acad(10) )(11)(if *mSpace* (12)()* (vla-get-Active*acadObject*)(13)(setq *mSpace* (vla-get-M(14) ) (15)(if *Util* (1

48、6)()Space *acad*)(17)(setq *Util* (vla-get-Utility *acad(18) )(19)(if *Selsets* (20)()(21)(setq *Selsets* (vla-get-SelectionSets *acad(22) )(23)(if *Layers* (24)()(25)(setq *Layers* (vla-get-layers *acad(26) )*)*)*)在整体变量 Layers 中;获取当前的图层,并将之(27)(28)(29)(setq lalen(vla-get-count *Layers*) i 0existope

49、nla n)(30)(while ( i lalen)(31)(if (= (vla-get-name(vla-item *Layers* i) open)(32)(setq existopenla y) (33)(34)(setq i (1+ i)(35) )(36)(if (= existopenla y)(37) ()(38) (progn284(39)(40)(41)(42)(setq openla(vla-add *Layers* open)(vla-p)olor openla acRed);如果图层“open”不存在,那就新增一个,并设该图层的颜色为红色(setq mdubs(vl

50、ax-make-safearray vlax-vb eger (0 . 1)(vlax-safearray-fill mdubs (0 8)(setq mstr(vlax-make-safearray vlax-vbVariant (0 . 1)(46) (vlax-safearray-filtr (line wall);设定选择过滤要放置窗的墙线一定要在“wall”图层上(47)(svar);调用子程序 (svar)(48)(setq ang 0.0tiaoff 5.0opngw 90.0) (51)(setq thldw 8.0) (52)(if (= thld nil) (53)(set

51、q thld No)(54) );设定一些变量的初始值(55)(setq dblk doorblks90.dwg);设定门的图块名称285建筑设计(56)(setq refpt W)(57)(while (member refpt (W T) (58)(setvar osmode 544) (59)(initget W T)(60)(prompt n 门槛宽 = )(61)(princ thldw)(62)(prompt , 要不要门槛 = ) (63)(princ thld)(64)(prompt n 请选取门参考点或 :);提示输入点或改变门的宽度或指定是否需要门槛(65)(setq re

52、fpt (getpo );如果使用者选择了(W),就执行以下程序段:(66)(cond (67)(68)(69)(70)(71)(72)(73)(74)(75)(76)(= refpt W) (prompt n 门宽 : )(setq temp (getreal) (if (eval temp)(setq opngw temp)(= refpt T);如果使用者选择了(T),就执行以下程序段:(77)(78)(79)(if (= thld No)(setq thld Yes) (setq thld No)286thld 变量即代表是否需要门槛。于此设计让使用者经过连续按下【T】键来切换“Yes

53、”与“ No”。(80)(81)(82)(83)(84)(= refpt nil) (exit)(85)(insertdoor typ dblk ang open);调用insertdoor 子程序来于“open”图层上门(86)(rvar);调用子程序(rvar)(87)(princ)(88)子程序 insertdoor(defun insertdoor (typ drblk ang la / sang wang ipt rang dwth wla pctr pm12 pm34 wset i w1 w2 p1 p2 p3 p4)(setq rang (dtr ang) (setvar cmd

54、echo 0)(setvar orthomode 1) (setq dwth opngw)(setq vdb(vla-InsertBlock *mSpace* (vlax-3d-porefpt) drblk dwth dwth 1 ang)edb(vlax-vla-object-ename vdb)(prompt n 请平移到实际的门位置上:)287建筑设计(setvar dragmode 2)(d move edb refpt pause) (setq p1 (getvar lastpo )vp1 (vlax-3d-pop1) d erase edb )(setq wang rang) (s

55、etq vpctr vp1vp2 (vla-polarpo*util* vp1 wang opngw)vpm12 (midvpt vp1 vp2)()(setq sang (- wang (/ pi 2) wallthk (getthk vpm12 sang)(setq vp3 (vla-polarpo*util* vp1 sang wallthk) vp4 (vla-polarpo *util* vp3 wang opngw)vpm34 (midvpt vp3 vp4)(if sset(vla-clear sset)(vla-Selec Po sset vpm12 mdubs mstr) (

56、vla-Selec Po sset vpm34 mdubs mstr) (setq wlone (vla-item sset 0)wl2 (vla-item sset 1)ewlone(vlax-vla-object-ename wlone) ewl2(vlax-vla-object-ename wl2) (setq wala(vla-get-layer wl2)(setq p1(vlax-safearray-list(vlax-variant-value vp1) p2(vlax-safearray-list(vlax-variant-value vp2) p3(vlax-safearray

57、-list(vlax-variant-value vp3)p4(vlax-safearray-list(vlax-variant-value vp4)(setq svar_pickbox(getvar pickbox)288(setvar pickbox 1)(d break ewlone p3 p4 break ewl2 p1 p2)(setvar pickbox svar_pickbox)(setq dwlone(vla-addline *mSpace* vp1 vp3) dwl2(vla-addline *mSpace* vp2 vp4)(vla-put-layer dwlala)(vl

58、a-put-layer dwl2 wala) (if (= thld Yes)(progn(setq vp1 (vla-polarpo*util* vp3 (+ sang pi) thldw) vp2 (vla-polarpo*util* vp4 (+ sang pi) thldw)(setq dtlone(vla-addline *mSpace* vp1 vp2) dtl2(vla-addline *mSpace* vp3 vp4) (vla-put-layer dtlone la)(vla-put-layer dtl2 la)(setq vdb(vla-InsertBlock *mSpac

59、e* vpctr drblk dwth dwth 1 ang) (vla-put-layer vdb la)子程序:svar作用:设定执行此程序所需要的系统变量值。(defun svar ()(setq *z_orth* (getvar orthomode)*z_osmo* (getvar osmode)*z_snap* (getvar snapmode)*z_cmde* (getvar cmdecho)289建筑设计子程序:rvar作用:恢复未执行此程序前的整体变量设定值。(defun rvar ()(setvar orthomode *z_orth*) (setvar osmode *z_

60、osmo*) (setvar snapmode *z_snap*) (setvar cmdecho *z_cmde*)子程序:midvpt作用:计算并返回二点的中点。(defun midvpt (vpt1 vpt2 / pt1x pt1y pt1z pt2x pt2y pt2z mptx mpty mptz mpt)(setq pt1x (vlax-safearray-ge pt1y (vlax-safearray-ge pt1z (vlax-safearray-ge pt2x (vlax-safearray-ge pt2y (vlax-safearray-ge pt2z (vlax-safe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论