gschmidt 发表于 2022-7-5 19:55:30

条件问题

你好
 
我已经计算了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))
   )
)
)

David Bethel 发表于 2022-7-5 20:09:11

如果我理解正确:

((or (= choice "2")
    (= choice "3"))
      Table code
    )

 


((member choice '("2" "3"))
    table code
)

 
-大卫

gschmidt 发表于 2022-7-5 20:20:55

是的,但是,选择2和3的表格数据不同。这就是为什么我使用(setq num 1)和(eval(read(strcat“anchor\u angles”(itoa num)))来更改列表名称

Lee Mac 发表于 2022-7-5 20:39:28

将生成表格的代码构造为一个单独的函数,表格插入点(以及在选项之间更改的任何其他参数)作为函数的参数。

Lee Mac 发表于 2022-7-5 20:52:17

例如,作为对代码的快速修改:
 
表函数可以是(根据需要本地化变量):
(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))
)

gschmidt 发表于 2022-7-5 21:02:14

这正是我一段时间后想到的李!正常运转
页: [1]
查看完整版本: 条件问题