




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、建筑設(shè)計(jì)14.1墻 的 繪 制在本節(jié)中將帶領(lǐng)讀者畫(huà)出一個(gè)如圖 14-1 所示的墻。按【Enter】鍵后 光標(biāo)線所在就是墻心線光標(biāo)線圖 14-1 本程序的畫(huà)墻功能完成圖本例將主要用到幾個(gè)程序,其中:vwall 為主程序,midvpt詳細(xì)講述它們的功能以及程序設(shè)計(jì)的技巧。本范例完成文件:vwall.lsp(見(jiàn)本書(shū)范例光盤(pán))為子程序。接下來(lái)主程序 vwall作用:畫(huà)雙線墻(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將光標(biāo)定在 光標(biāo)線的左邊,則 墻線將向左 位移 12將光標(biāo)定在 (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*)*)*);獲取當(dāng)前的圖層,并將之在變量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建筑設(shè)計(jì)如果圖層“ WALL” 不存在,那么就再增加一個(gè)。這是因?yàn)樵谠O(shè)計(jì)上這個(gè)墻必須繪于“ WALL” 圖層上,以與其他用 LINE 或 PLINE 指令畫(huà)的線區(qū)隔開(kāi)。這樣,當(dāng)后續(xù)有程序還要用來(lái)編輯墻線時(shí),就不會(huì)再去使用所有圖層里的一大堆線來(lái)判斷,而延誤執(zhí)行的時(shí)間。
5、(37)(vla-put-activelayer *acad* walla);將當(dāng)前圖層設(shè)定為“WALL”(38)(setvar cmdecho 0)(39)(setq sv_osmode (getvar osmode) (40)(setvar osmode 0);設(shè)定一些需要暫時(shí)關(guān)閉的系統(tǒng)變量(41)(VL-CMDF fillet r 0);設(shè)定圓角半徑為 0,即欲實(shí)現(xiàn)無(wú)半徑修交角(42)(setq wallthk 12.0);設(shè)定墻厚為 12.0,并存在變量 wallthk 中(43)(prompt 請(qǐng)輸入墻厚: );顯示墻厚并提示輸入(43)(setq temp (getreal)260
6、(44)(if temp(45)(setq wallthk temp) (46);如果使用者輸入其他數(shù)值,則將該值存入 wallthk 變量中(47)(setq sp (getpon 請(qǐng)點(diǎn)取墻起點(diǎn):);提示輸入墻起始點(diǎn)(48)(setqy);設(shè)定變量來(lái)判斷是否第一根墻線(49)(while (setq ep (getposp n 請(qǐng)點(diǎn)取墻端點(diǎn):);當(dāng)輸入墻的第二點(diǎn)非 nil(即空白)時(shí),執(zhí)行以下程序段(50)(setq vl3 (vla-addline *mSpace* (vlax-3d-posp) (vlax-3d-poep);畫(huà)出墻線(51)l3 (vlax-vla-object-enam
7、e vl3);將墻線轉(zhuǎn)換為 ename(實(shí)體名稱(chēng))vl3midp (midvpt (vlax-3d-posp) (vlax-3d-poep)l3midp(vlax-safearray-list vl3midp);求得墻線中點(diǎn)并將其轉(zhuǎn)換為表的形式(54) )(55) (setq wal&midp (list l3 l3midp)261建筑設(shè)計(jì);將實(shí)體名稱(chēng)和中點(diǎn)作為一個(gè)表在wal&midp 變量中(56)halfthk(/ wallthk 2.0) ;一半墻厚 (57)ang(angle sp ep)angp90(+ ang (/ pi 2)angm90(- ang (/ pi 2);計(jì)算直線的角
8、度及加 pi/2 和減 pi/2 的角度值,以備偏移使用(60)ws (getpo“n 請(qǐng)點(diǎn)取要以墻的哪邊作為標(biāo)準(zhǔn),按【Enter】鍵則以墻中心為準(zhǔn)畫(huà)墻”);提示輸入另一條墻線位置,以點(diǎn)輸入(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);如果使用者沒(méi)有按下【Enter】鍵,則判斷使用者所點(diǎn)取的點(diǎn)是在原墻線的左邊或右邊(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 所示在其兩邊進(jìn)行偏移(offset)1/2 墻厚,并刪除中線(88)(89)(90)(91)(= wallside l)(vl-cmdf offset wallthk wal&midp ws ) (setq l4 (entlast);如果點(diǎn)取的是左邊,則向左偏移一個(gè)墻厚(92)(93)(94)(95)(96)(97) )(= wallside r)(vl-cmdf offset wallthk wal&midp ws ) (setq l4 l3)(setq l3 (entlast);如果點(diǎn)取的是右
11、邊,則向右偏移一個(gè)墻厚263建筑設(shè)計(jì)(98)(setvar osmode sv_osmode)(99)(if (=n)(100)(vl-cmdf fillet lone l3 fillet l2 l4) (101);如果不是第一條墻線,則兩條墻線交接處就要修一個(gè)半徑為 0 的圓角(即修交角)(102)(setqn)(103)(setq sp ep (104)lone l3(105) l2 l4 (106)(107);之后,將lone 設(shè)為l3,l2 設(shè)為l4,它們將與另 2畫(huà)出的墻線l3 和l4 修交角(108)(vla-put-activelayer *acad* curla);畫(huà)完墻后,將
12、當(dāng)前圖層恢復(fù)回程序執(zhí)行前的狀態(tài)(109)(princ)(110)子程序 midvpt作用:計(jì)算并獲取兩點(diǎn)的中點(diǎn)。(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)本范例的執(zhí)行步驟假設(shè) vwall.lsp 被置于:AutoCAD 設(shè)計(jì)院/NO.7Sles 目錄下,如果您將這些文件放在另外的目錄里,那么本范例中有關(guān)存取這些文件的路徑也要更改(請(qǐng)參考 2.5 節(jié))。然后,再按如下步驟執(zhí)行。在 AutoCAD 指令提示號(hào)后輸入(參考圖 2.22 也可以):指令: (load vwall.lsp) 請(qǐng)輸入墻厚:(按【Ent
15、er】或輸入數(shù)值)請(qǐng)點(diǎn)取墻起點(diǎn):(點(diǎn)取一點(diǎn)) 請(qǐng)點(diǎn)取墻端點(diǎn):(點(diǎn)取另一點(diǎn))請(qǐng)點(diǎn)取要以墻的哪邊作為標(biāo)準(zhǔn),按【Enter】鍵則表以墻中心為準(zhǔn)畫(huà)墻請(qǐng)點(diǎn)取墻端點(diǎn):.請(qǐng)點(diǎn)取墻端點(diǎn):【Enter】14.2窗 的 繪 制265建筑設(shè)計(jì)本范例將畫(huà)出一個(gè)如圖 14-2 所示的窗。本例將主要用到幾個(gè)程序,其中:Hwindows 為主程序,drawswing、getthk、dtr、rtd、distvp、midvpt、svar 與 rvar 等為子程序。接下來(lái)計(jì)的技巧。詳細(xì)講述它們的功能以及程序設(shè)二扇推拉窗 三扇推拉窗 四扇推拉窗 圖 14-2 本程序的畫(huà)窗功能完成圖本范例完成文件:Hwindow.lsp(本書(shū)范例光
16、盤(pán))本范例配合文件:winblk1.dwg(本書(shū)范例光盤(pán)) winblk2.dwgwinblk3.dwg winblk4.dwgwinblk5.dwg主程序 Hwindows作用:在 14.1 節(jié)所畫(huà)的墻中水平方向的窗。(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推開(kāi)窗固定窗(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)*)*)*);獲取當(dāng)前的圖層,并將之在整體變量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);設(shè)定以角度為 0,窗寬度為 120 來(lái)水平窗268(59)(setq refpt T)(60)(While (member refpt (T W)(61)(Prompt n 請(qǐng)點(diǎn)取欲安放窗的參考點(diǎn)位置或 : (62);提示使用者輸入點(diǎn)(63)(setvar osmode 544);設(shè)定圖形鎖點(diǎn)方式(64)(initget W T) (65)(setq refpt (getpo ) (66)(cond(67)(= refpt T);先定義W(設(shè)窗寬)與T(窗類(lèi)型),準(zhǔn)備讓使用者選擇(68)(prompt n 請(qǐng)選擇窗型式 :(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);根據(jù)使用者的選擇,而賦值對(duì)應(yīng)的圖塊名稱(chēng)269建筑設(shè)計(jì)(80)(= refpt W)(81)(82)(83
21、)(84)(85)(86)(87)(88)(prompt 請(qǐng)輸入窗寬 :)(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);設(shè)計(jì)窗圖塊時(shí)的預(yù)覽影像(107)(prompt n 請(qǐng)將之平移到窗的實(shí)際位置上:);提示使用者將窗移到適當(dāng)位置上(108)(setvar dragmode 2)(109)(setvar osmode 544);設(shè)定需要的系統(tǒng)變量(110)(setq rblk (vlax-vla-object-ename vb);將圖塊轉(zhuǎn)換為圖元名稱(chēng)(111)(d move rblk refpt pause);移動(dòng)圖塊至適當(dāng)位置(
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建筑設(shè)計(jì)(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)計(jì)算獲取個(gè)點(diǎn) vp1,vp2,vp3,vp4 及 vp1,vp2 和 vp3,vp4 的中點(diǎn)。其中的兩個(gè)中點(diǎn)用于選取墻線。(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);執(zhí)行斷開(kāi)墻線并聯(lián)結(jié)vp1,vp3 及vp2,vp4(152)(if (= wallthk 15.0);如果墻的厚度小于或等于 15 的話(huà),就執(zhí)行下面的程序段(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);設(shè)定窗所在的圖層。(160)(if (= winblk winblk4.dwg) (161)(drawswing)(162)(163)如果窗類(lèi)型為 4,則調(diào)用子程序(drawswing)來(lái)繪圖。如果墻厚超過(guò) 15.0,則執(zhí)行以273建筑設(shè)計(jì)下代碼:(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);如果要改變,就執(zhí)行以下程序段: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 類(lèi)窗,就執(zhí)行以下程序段:(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建筑設(shè)計(jì);鏡像窗中的線(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作用:畫(huà)第類(lèi)型的窗。(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);計(jì)算一些需要的數(shù)值(d arc c ss (polar ss rang rs) es);畫(huà)弧(setq s3 (entlast)(setq warc (vlax-ename-vla-object s3) (vla-put-layer warc o
34、pen)276;將弧轉(zhuǎn)換為 vla 對(duì)象(setq wline (vla-addline *mSpace* (vlax-3d-poss) (vlax-3d-poes)(vla-put-layer wline open);畫(huà)線(setq pm13 (midvpt (vlax-3d-pop1) vp31) pm24 (midvpt (vlax-3d-pop2) vp41);計(jì)算用于鏡像所需的兩個(gè)中點(diǎn)(setq temp nilimage 1)(while (/= temp y) (initget y n)(prompt n 以上所畫(huà)的正確嗎?(Y/N) 按 【ENTER】 鍵就會(huì)上下左右對(duì)調(diào)!);
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建筑設(shè)計(jì))(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);設(shè)計(jì)讓使用者以按【Enter】來(lái)切換這 4 種模式,直到按下【Y】鍵來(lái)結(jié)束程序?yàn)橹棺映绦?getthk作用:根據(jù)輸入的點(diǎn)和給定角度來(lái)尋找與另一條墻線之間的距離
37、。從 fixp 點(diǎn)開(kāi)始畫(huà)一條線,與另一條墻線交于 otht,然后計(jì)算 fixp 與 otht 之間的距離,也就是墻的厚度。如果兩條墻線之間的距離大于 40,則程序?qū)⒁筮x擇另一條墻線,以再計(jì)算兩個(gè)點(diǎn)的距離。(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 請(qǐng)點(diǎ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作用:將角度量轉(zhuǎn)換成弧度量。(defun dtr (deg) (* (/ deg 180.0) pi)子程序 rtd作用:將弧度量轉(zhuǎn)換成角度量。(defun rtd (rad) (* (/ ri) 180)子程序 distvp作用:計(jì)算并返回二點(diǎn)的距離。(defun distvp (vpt1 vpt2 / pt1x pt1y pt1z pt2x pt2y pt2z)(setq pt1x (vlax-safearray-geement
40、 (vlax-variant-value vpt1) 0)279建筑設(shè)計(jì)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作用:計(jì)算并返回二點(diǎn)的中點(diǎn)。(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作用:設(shè)定執(zhí)行此程序所需要的整體變量值。(defun svar ()(setq *z_orth* (getvar orthomode)*z_osmo* (getvar o
44、smode)*z_snap* (getvar snapmode)*z_cmde* (getvar cmdecho)子程序 rvar作用:恢復(fù)未執(zhí)行此程序前的系統(tǒng)變量設(shè)定值。(defun rvar ()(setvar orthomode *z_orth*) (setvar osmode *z_osmo*) (setvar snapmode *z_snap*) (setvar cmdecho *z_cmde*)本范例的執(zhí)行步驟假設(shè) Hwindow.lsp 被置于:AutoCAD 設(shè)計(jì)院/NO.7Sles 目錄下,如果您將這些文件放在另外的目錄里,那么本范例中有關(guān)存取這些文件的路徑也要更改(請(qǐng)參考
45、2.5 節(jié))。然后,再按如下步驟執(zhí)行。在 AutoCAD 指令提示號(hào)后輸入(參考圖 2-22 也可以)指令:(load hwindow.lsp)后按【Enter】鍵。參考圖 14-3 所示執(zhí)行操作。281建筑設(shè)計(jì)當(dāng)還是孩子的時(shí)候,要盡自己做孩子的本份,努力充實(shí)自己,不要“ 人丑就怪父母” ;當(dāng)身為父母時(shí),盡教育的職責(zé),處處以身作則,不要“ 子女不好就怪命苦” ;當(dāng)身為社會(huì)的支柱時(shí),就更應(yīng)明白是非之道,黑白之理,從自身做起社會(huì)才能發(fā)展!動(dòng)物園應(yīng)征暑期工讀生,跑去應(yīng)征,恰好動(dòng)物園里的猩猩病了,于是就請(qǐng)阿呆扮演猩猩在園里蕩來(lái)蕩去表演給游客看,結(jié)果一個(gè)不就蕩到隔壁的區(qū)去了,眼一步一步地,正想大呼救命,
46、忽然開(kāi)口說(shuō):“ 學(xué)弟不要怕,我是學(xué)長(zhǎng)”。點(diǎn)取欲安放窗的參考點(diǎn)位置或圖 14-3 畫(huà)窗程序的執(zhí)行操作282將之平移到窗的實(shí)際位置上:點(diǎn)取欲安放窗的參考點(diǎn)位置或:t選擇窗型式:214.3門(mén) 的 繪 制本范例將畫(huà)出一個(gè)如圖 14-4 所示的門(mén)。圖 14-4 本程序的畫(huà)門(mén)功能完成圖本例將主要用到幾個(gè)程序,其中:Hdoor 為主程序,insertdoor、getthk、dtr、rtd、distvp、midvpt、svar 與 rvar 等為子程序。以下部分技巧。本范例完成文件:Hdoor.lsp (本書(shū)范例光盤(pán))本范例配合文件:doorblks90.dwg (本書(shū)范例光盤(pán))詳細(xì)來(lái)講述它們的功能以及程序設(shè)
47、計(jì)的主程序 Hdoor作用:在 14.1 節(jié)所畫(huà)的墻中水平方向的門(mén)。(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建筑設(shè)計(jì)(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 中;獲取當(dāng)前的圖層,并將之(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”不存在,那就新增一個(gè),并設(shè)該圖層的顏色為紅色(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);設(shè)定選擇過(guò)濾要放置窗的墻線一定要在“wall”圖層上(47)(svar);調(diào)用子程序 (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) );設(shè)定一些變量的初始值(55)(setq dblk doorblks90.dwg);設(shè)定門(mén)的圖塊名稱(chēng)285建筑設(shè)計(jì)(56)(setq refpt W)(57)(while (member refpt (W T) (58)(setvar osmode 544) (59)(initget W T)(60)(prompt n 門(mén)檻寬 = )(61)(princ thldw)(62)(prompt , 要不要門(mén)檻 = ) (63)(princ thld)(64)(prompt n 請(qǐng)選取門(mén)參考點(diǎn)或 :);提示輸入點(diǎn)或改變門(mén)的寬度或指定是否需要門(mén)檻(65)(setq re
52、fpt (getpo );如果使用者選擇了(W),就執(zhí)行以下程序段:(66)(cond (67)(68)(69)(70)(71)(72)(73)(74)(75)(76)(= refpt W) (prompt n 門(mén)寬 : )(setq temp (getreal) (if (eval temp)(setq opngw temp)(= refpt T);如果使用者選擇了(T),就執(zhí)行以下程序段:(77)(78)(79)(if (= thld No)(setq thld Yes) (setq thld No)286thld 變量即代表是否需要門(mén)檻。于此設(shè)計(jì)讓使用者經(jīng)過(guò)連續(xù)按下【T】鍵來(lái)切換“Yes
53、”與“ No”。(80)(81)(82)(83)(84)(= refpt nil) (exit)(85)(insertdoor typ dblk ang open);調(diào)用insertdoor 子程序來(lái)于“open”圖層上門(mén)(86)(rvar);調(diào)用子程序(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 請(qǐng)平移到實(shí)際的門(mén)位置上:)287建筑設(shè)計(jì)(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作用:設(shè)定執(zhí)行此程序所需要的系統(tǒng)變量值。(defun svar ()(setq *z_orth* (getvar orthomode)*z_osmo* (getvar osmode)*z_snap* (getvar snapmode)*z_cmde* (getvar cmdecho)289建筑設(shè)計(jì)子程序:rvar作用:恢復(fù)未執(zhí)行此程序前的整體變量設(shè)定值。(defun rvar ()(setvar orthomode *z_orth*) (setvar osmode *z_
60、osmo*) (setvar snapmode *z_snap*) (setvar cmdecho *z_cmde*)子程序:midvpt作用:計(jì)算并返回二點(diǎn)的中點(diǎn)。(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國(guó)燈插配線行業(yè)投資前景及策略咨詢(xún)報(bào)告
- 2025至2030年中國(guó)淋膜銅版紙行業(yè)投資前景及策略咨詢(xún)報(bào)告
- 2025至2030年中國(guó)晶玉石材行業(yè)投資前景及策略咨詢(xún)報(bào)告
- 北師大版英語(yǔ)九年級(jí)Unit 8 Discoveries Lesson 23 Discovery of the Year 教學(xué)設(shè)計(jì)
- 山西省長(zhǎng)治市二中2021-2022學(xué)年高二上學(xué)期第二次月考生物試題(原卷版)
- 山東省青島市三中2020-2021學(xué)年高二上期中生物試題(解析版)
- 小學(xué)信息技術(shù)跨學(xué)科教學(xué)中的學(xué)生能力培養(yǎng)與發(fā)展
- 閥門(mén)產(chǎn)品質(zhì)量河南省監(jiān)督抽查實(shí)施細(xì)則
- 波形鋼腹板-鋼管混凝土桁式弦桿組合梁抗震性能研究
- 電路實(shí)習(xí)報(bào)告8篇
- 中國(guó)古建筑文化與鑒賞智慧樹(shù)知到期末考試答案章節(jié)答案2024年清華大學(xué)
- 廣東省汕尾市海豐縣2024年數(shù)學(xué)八年級(jí)下冊(cè)期末學(xué)業(yè)水平測(cè)試模擬試題含解析
- 陰囊佩吉特病
- 隱龍山墓園規(guī)劃方案
- 超聲引導(dǎo)下心包穿刺置管術(shù)
- 周公山隧道施工組織設(shè)計(jì)最終版樣本
- 玻璃幕墻清洗施工方案
- lcd制造工藝流程
- 霍納綜合征學(xué)習(xí)課件
- 腫瘤病人護(hù)理講課
- 安全生產(chǎn)管理的工作流程與規(guī)范
評(píng)論
0/150
提交評(píng)論