卡在空调和汽车上
我正在尝试编写一个程序来绘制屋顶板条。当在AutoCAD绘图上从左向右单击时,我能够使程序工作,但我想我会在程序中编写一些代码,用户可以从右向左进行选择。我尝试使用CAR获取x坐标,然后比较它们,并根据x是否大于或小于单击点来设置屋顶板条的角度。
这是我到目前为止编写的完整代码。
我很确定这与COND函数有关,因为在我介绍它之前,程序已经运行了。
(defun d2r (a)
(* pi (/ a 180))
)
(defun r2d (a)
(* 180.0 (/ a pi))
)
(defun c:rbt ()
(getVariables-Elevation-WDE)
(getInput-RoofBattenTile)
(setVariables-Elevation-WDE)
(ANGset)
;(processInput-RoofBattenTile)
)
(defun getInput-RoofBattenTile ();/ IP SP TP SH MDF ND
(setq IP (getpoint "\nPick Insertion Point << "))
(setq SP (getpoint IP "\nPick or Enter Width << "))
)
(defun ANGset ()
(setq x-checkIP (list (car IP)))
(setq x-checkSP (list (car SP)))
(cond
((< x-checkIP x-checkSP)
(setq ANG (angle IP SP))
(setq ANG (r2d ANG))
(setq ANG+180 (+ 180 ANG))
(processInput-RoofBattenTile)
)
((> x-checkIP x-checkSP)
(setq ANG (angle IP SP))
(setq ANG (r2d ANG))
(setq ANG (+ ANG 180))
(setq ANG+180 (+ 360 ANG))
(processInput-RoofBattenTile)
)
)
)
(defun processInput-RoofBattenTile ()
;(setq ANG (angle IP SP))
;(setq ANG (r2d ANG))
;(setq ANG+180 (- 360 ANG))
(setq width (distance IP SP))
;Roof Battens
(setq Batten-P1(polar IP (d2r (+ ANG 0)) 55))
(setq Batten-P2(polar Batten-P1 (d2r (+ ANG 0)) 70))
(setq Batten-P3(polar Batten-P2 (d2r (+ ANG 90)) 35))
(setq Batten-P3A (polar Batten-P3 (d2r (+ ANG 90)) 35))
(setq Batten-P4(polar Batten-P3 (d2r (+ ANG 180)) 70))
(setq Batten-P4A (polar Batten-P4 (d2r (+ ANG 90)) 35))
(setq Batten-P5(polar SP (d2r (+ ANG 180)) 65))
(setq Batten-P6(polar Batten-P5 (d2r (+ ANG 180)) 70))
(setq Batten-P7(polar Batten-P6 (d2r (+ ANG 90)) 35))
(setq Batten-P8(polar Batten-P7 (d2r (+ ANG 0)) 70))
;Batten UCS for array
(setq BattenUCS(* ANG -1))
;Batten Spacing
(setq BattenCtrs 330)
(setq BattenDist (distance IP SP))
(setq BattenSpace1 (/ BattenDist BattenCtrs))
(setq BattenSpace (+ (fix BattenSpace1) 1))
(setq BattenSpace-1 (- BattenSpace 1))
(setq WidthDivide (/ Width BattenSpace-1))
(CheckBatten)
)
(defun CheckBatten ()
(if (< WidthDivide 330)
(progn
(alert "Less than 330 ctrs")(DrawObject-RoofBattenTile<330)
)
(progn
(alert "More than 330 ctrs")(DrawObject-RoofBattenTile>330)
)
)
)
(defun DrawObject-RoofBattenTile<330 ()
(command
"cecolor" "yellow"
;Roof Battens
"pline" Batten-P1 Batten-P2 Batten-P3 Batten-P4 "c"
"ucs" "z" BattenUCS
"-array" "last" "" "r" "1" BattenSpace BattenCtrs
"ucs" ""
"pline" Batten-P4 Batten-P3 Batten-P3a Batten-P4a "c"
"cecolor" "8"
"line" Batten-P1 Batten-P3 ""
"ucs" "z" BattenUCS
"-array" "last" "" "r" "1" BattenSpace BattenCtrs
"ucs" ""
"line" Batten-P2 Batten-P4 ""
"ucs" "z" BattenUCS
"-array" "last" "" "r" "1" BattenSpace BattenCtrs
"ucs" ""
"line" Batten-P4 Batten-P3A ""
"line" Batten-P3 Batten-P4A ""
;Last Batten
;"cecolor" "yellow"
;"pline" Batten-P5 Batten-P6 Batten-P7 Batten-P8 "c"
;"cecolor" "8"
;"line" Batten-P5 Batten-P7 ""
;"line" Batten-P6 Batten-P8 ""
;Roof Tile
"-insert" "RoofTile" Batten-P3 "" "" ANG+180
"ucs" "z" BattenUCS
"-array" "last" "" "r" "1" BattenSpace BattenCtrs
"erase" "p" ""
"ucs" ""
;"-insert" "RoofTile" Batten-P8 "" "" ANG+180
)
(restore)
)
(defun DrawObject-RoofBattenTile>330 ()
(command
"cecolor" "yellow"
;Roof Battens
"pline" Batten-P1 Batten-P2 Batten-P3 Batten-P4 "c"
"ucs" "z" BattenUCS
"-array" "last" "" "r" "1" BattenSpace-1 BattenCtrs
"ucs" ""
"pline" Batten-P4 Batten-P3 Batten-P3a Batten-P4a "c"
"cecolor" "8"
"line" Batten-P1 Batten-P3 ""
"ucs" "z" BattenUCS
"-array" "last" "" "r" "1" BattenSpace-1 BattenCtrs
"ucs" ""
"line" Batten-P2 Batten-P4 ""
"ucs" "z" BattenUCS
"-array" "last" "" "r" "1" BattenSpace-1 BattenCtrs
"ucs" ""
"line" Batten-P4 Batten-P3A ""
"line" Batten-P3 Batten-P4A ""
;Last Batten
"cecolor" "yellow"
"pline" Batten-P5 Batten-P6 Batten-P7 Batten-P8 "c"
"cecolor" "8"
"line" Batten-P5 Batten-P7 ""
"line" Batten-P6 Batten-P8 ""
;Roof Tile
"-insert" "RoofTile" Batten-P3 "" "" ANG+180
"ucs" "z" BattenUCS
"-array" "last" "" "r" "1" BattenSpace-1 BattenCtrs
"erase" "p" ""
"ucs" ""
"-insert" "RoofTile" Batten-P8 "" "" ANG+180
)
(restore)
)
(defun getVariables-Elevation-WDE ()
(command "undo" "mark")
(command "undo" "begin")
(setq temperr *error*)
(setq *error* CCerror)
(setq CColdlayer (getvar "clayer"))
(setq CColdpickbox (getvar "pickbox"))
(setq CColdcmdecho (getvar "cmdecho"))
(setq CColdosmode (getvar "osmode"))
(setq CColdorthomode (getvar "orthomode"))
(setvar "cmdecho" 0)
(setvar "orthomode" 1)
)
(defun setVariables-Elevation-WDE ()
(setvar "pickbox" 0)
(setvar "osmode" 0)
(setvar "blipmode" 0)
)
(defun Restore ()
(setvar "clayer" CColdlayer)
(setvar "pickbox" CColdpickbox)
(setvar "cmdecho" CColdcmdecho)
(setvar "osmode" CColdosmode)
(setvar "orthomode" CColdorthomode)
(command "undo" "end")
;(command "undo" "mark")
(princ)
)
(defun CCerror (CCerrmsg)
(setq *error* temperror)
(setvar "osmode"CColdosmode)
(setvar "pickbox" CColdpickbox)
(setvar "cmdecho" CColdcmdecho)
(setvar "clayer" CColdlayer)
(setvar "orthomode" CColdorthomode)
(command "undo" "back")
(command "undo" "end")
(command "undo" "mark")
(prompt "\nCommand Cancelled°... ") ;inform user
(princ)
(princ)
)
点是一个列表,CAR将返回其第一个元素,即X坐标。 谢谢你。它现在(有点)起作用了。我只需要设置角度,使其正确绘制。但是删除列表确实有帮助,谢谢 只是对住房问题做了一点评论,为什么不考虑哪条路是向内的呢?这样做并不重要,因为你总是向内画。我的做法是,即使在顶部选择右侧,也总是选择左侧,然后比较两端的距离,确定哪一个是左端,这很简单。当你在接近终点时,画线的方向是什么并不重要。
(setq x-checkIP (list (car IP)))
(setq x-checkSP (list (car SP)))
页:
[1]