条件问题
你好我已经计算了2个表的输入,我希望用户给出3个选择,其中一个绘制:第一个表,第二个表或两个表。如果我像下面这样做,我必须将表代码写3次,还是效率更高?
(initget "1 2 3")
(setq choice
(getkword ( "\nTable for Position 1 \Table for Position 2 \<Table for Both Positions >: ")
)
(COND
((= choice "2")
Table code
)
((= choice "3")
Table code
)
(T
Table code both tables with a repeat
)
)
这是我当前绘制这两个表的代码:
(setq tbl_pt1 (vlax-3D-point 312 289))
(setq tbl_pt2 (vlax-3D-point 312 227.828))
(setq num 1)
(if (/= "" lay)
(progn
(repeat 2
(setq rows (+ (length lbl_names) 2))
(setq objtable
(vla-addtable
(vla-get-block (vla-item (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) lay))
(eval (read (strcat "tbl_pt" (itoa num))))
rows 10 4.652 9.356
)
)
(vla-settext objtable 0 0 (strcat "STINGRAY ANCHORS POSITION " (itoa num)))
(vla-settext objtable 1 1 "EASTING")
(vla-settext objtable 1 3 "NORTHING")
(vla-settext objtable 1 5 "ANGLE")
(vla-settext objtable 1 6 "LENGTH ANCHORE WIRE")
(vla-settext objtable 1 7 "MIDLINE BUOY 1 *")
(vla-settext objtable 1 8 "MIDLINE BUOY 2 *")
(vla-settext objtable 1 9 "MIDLINE BUOY 3 *")
(vla-MergeCells objtable 1 1 1 2)
(vla-MergeCells objtable 1 1 3 4)
(vla-put-HorzCellMargin objtable 0.25)
(vla-put-VertCellMargin objtable 0.25)
(vla-setrowheight objtable 1 10)
(vla-setcolumnwidth objtable 0 15.182); 0 is first column
(vla-setcolumnwidth objtable 1 4.756)
(vla-setcolumnwidth objtable 2 13.956)
(vla-setcolumnwidth objtable 3 4.756)
(vla-setcolumnwidth objtable 4 13.956)
(vla-setcolumnwidth objtable 5 9.969)
(foreach col '(6 7 8 9)
(vla-setcelltextheight objtable 1 col 1.25)
(vla-setcolumnwidth objtable col 9.356)
)
; Fill Table With Anchor Wire Details
(if (/= (length lbl_names) nil)
(progn
;Add Anchor Labels to table
(setq row 2)
(foreach item lbl_names
(vla-settext objtable row 0 item)
(setq row (1+ row))
)
;Add X= Labels to table
(setq row 2)
(while (< row (+ (length lbl_names) 2))
(vla-settext objtable row 1 "X=")
(setq row (1+ row))
)
;Add Anchor Wire End Easting values to table
(setq row 2)
(foreach item anchor_east
(vla-settext objtable row 2 (rtos item 2 0))
(setq row (1+ row))
)
;Add X= Labels to table
(setq row 2)
(while (< row (+ (length lbl_names) 2))
(vla-settext objtable row 3 "Y=")
(setq row (1+ row))
)
;Add Anchor Wire End Northing values to table
(setq row 2)
(foreach item anchor_north
(vla-settext objtable row 4 (rtos item 2 0))
(setq row (1+ row))
)
;Add Anchor Wire Angle values to table
(setvar "DIMZIN"
(setq row 2)
(foreach item (eval (read (strcat "anchor_angles" (itoa num))))
(vla-settext objtable row 5 (strcat (rtos item 2 1) "%%D"))
(setq row (1+ row))
)
(setvar "DIMZIN" 1)
;Add Anchor Wire Distance values to table
(setq row 2)
(foreach item (eval (read (strcat "anchor_distance" (itoa num))))
(vla-settext objtable row 6 (rtos item 2 0))
(setq row (1+ row))
)
;Add Anchor Wire Midline Buoy 1 values to table
(setq row 2)
(foreach item anchor_buoy1
(if (= item nil)
(vla-settext objtable row 7 "")
)
(if (/= item nil)
(vla-settext objtable row 7 item)
)
(setq row (1+ row))
)
;Add Anchor Wire Midline Buoy 2 values to table
(setq row 2)
(foreach item anchor_buoy2
(if (= item nil)
(vla-settext objtable row 8 "")
)
(if (/= item nil)
(vla-settext objtable row 8 item)
)
(setq row (1+ row))
)
;Add Anchor Wire Midline Buoy 3 values to table
(setq row 2)
(foreach item anchor_buoy3
(if (= item nil)
(vla-settext objtable row 9 "")
)
(if (/= item nil)
(vla-settext objtable row 9 item)
)
(setq row (1+ row))
)
)
)
(setq num (1+ num))
)
)
)
如果我理解正确:
((or (= choice "2")
(= choice "3"))
Table code
)
或
((member choice '("2" "3"))
table code
)
-大卫 是的,但是,选择2和3的表格数据不同。这就是为什么我使用(setq num 1)和(eval(read(strcat“anchor\u angles”(itoa num)))来更改列表名称 将生成表格的代码构造为一个单独的函数,表格插入点(以及在选项之间更改的任何其他参数)作为函数的参数。 例如,作为对代码的快速修改:
表函数可以是(根据需要本地化变量):
(defun createtables ( lst num )
(if (/= "" lay)
(progn
(foreach ins lst
(setq rows (+ (length lbl_names) 2))
(setq objtable
(vla-addtable
(vla-get-block (vla-item (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) lay))
ins
rows 10 4.652 9.356
)
)
(vla-settext objtable 0 0 (strcat "STINGRAY ANCHORS POSITION " (itoa num)))
(vla-settext objtable 1 1 "EASTING")
(vla-settext objtable 1 3 "NORTHING")
(vla-settext objtable 1 5 "ANGLE")
(vla-settext objtable 1 6 "LENGTH ANCHORE WIRE")
(vla-settext objtable 1 7 "MIDLINE BUOY 1 *")
(vla-settext objtable 1 8 "MIDLINE BUOY 2 *")
(vla-settext objtable 1 9 "MIDLINE BUOY 3 *")
(vla-MergeCells objtable 1 1 1 2)
(vla-MergeCells objtable 1 1 3 4)
(vla-put-HorzCellMargin objtable 0.25)
(vla-put-VertCellMargin objtable 0.25)
(vla-setrowheight objtable 1 10)
(vla-setcolumnwidth objtable 0 15.182); 0 is first column
(vla-setcolumnwidth objtable 1 4.756)
(vla-setcolumnwidth objtable 2 13.956)
(vla-setcolumnwidth objtable 3 4.756)
(vla-setcolumnwidth objtable 4 13.956)
(vla-setcolumnwidth objtable 5 9.969)
(foreach col '(6 7 8 9)
(vla-setcelltextheight objtable 1 col 1.25)
(vla-setcolumnwidth objtable col 9.356)
)
; Fill Table With Anchor Wire Details
(if (/= (length lbl_names) nil)
(progn
;Add Anchor Labels to table
(setq row 2)
(foreach item lbl_names
(vla-settext objtable row 0 item)
(setq row (1+ row))
)
;Add X= Labels to table
(setq row 2)
(while (< row (+ (length lbl_names) 2))
(vla-settext objtable row 1 "X=")
(setq row (1+ row))
)
;Add Anchor Wire End Easting values to table
(setq row 2)
(foreach item anchor_east
(vla-settext objtable row 2 (rtos item 2 0))
(setq row (1+ row))
)
;Add X= Labels to table
(setq row 2)
(while (< row (+ (length lbl_names) 2))
(vla-settext objtable row 3 "Y=")
(setq row (1+ row))
)
;Add Anchor Wire End Northing values to table
(setq row 2)
(foreach item anchor_north
(vla-settext objtable row 4 (rtos item 2 0))
(setq row (1+ row))
)
;Add Anchor Wire Angle values to table
(setvar "DIMZIN"
(setq row 2)
(foreach item (eval (read (strcat "anchor_angles" (itoa num))))
(vla-settext objtable row 5 (strcat (rtos item 2 1) "%%D"))
(setq row (1+ row))
)
(setvar "DIMZIN" 1)
;Add Anchor Wire Distance values to table
(setq row 2)
(foreach item (eval (read (strcat "anchor_distance" (itoa num))))
(vla-settext objtable row 6 (rtos item 2 0))
(setq row (1+ row))
)
;Add Anchor Wire Midline Buoy 1 values to table
(setq row 2)
(foreach item anchor_buoy1
(if (= item nil)
(vla-settext objtable row 7 "")
)
(if (/= item nil)
(vla-settext objtable row 7 item)
)
(setq row (1+ row))
)
;Add Anchor Wire Midline Buoy 2 values to table
(setq row 2)
(foreach item anchor_buoy2
(if (= item nil)
(vla-settext objtable row 8 "")
)
(if (/= item nil)
(vla-settext objtable row 8 item)
)
(setq row (1+ row))
)
;Add Anchor Wire Midline Buoy 3 values to table
(setq row 2)
(foreach item anchor_buoy3
(if (= item nil)
(vla-settext objtable row 9 "")
)
(if (/= item nil)
(vla-settext objtable row 9 item)
)
(setq row (1+ row))
)
)
)
(setq num (1+ num))
)
)
)
)
然后在主程序中,您将看到以下内容:
(initget "1 2 Both")
(setq choice (getkword "\nTable for position <Both>: "))
(cond
( (= "1" choice) (createtables '((312.0 289.0)) 1))
( (= "2" choice) (createtables '((312.0 227.828)) 2))
( (createtables '((312.0 289.0)(312.0 227.828)) 1))
) 这正是我一段时间后想到的李!正常运转
页:
[1]