有人帮我整理口齿不清
大家好,最近,我被要求修复一些lisp例程,这些例程在过去10多年来一直在我的工作中使用。问题是,我的lisp知识相当有限,虽然我能够通过尝试理解代码以及一些线索和错误来修改很多例程,但我现在遇到了一个例程,代表我进行任何修补都无法修复。
这是一个例程,通过询问用户列数(默认为1)和行数(默认为20)来创建材料列表,然后构建一个由标题块(matlhd)、材料描述行块(matlitem)和总质量块(matltot)组成的表。
当您想要创建单行材质列表时,会出现问题,因为使用数组构造表的方式,它会返回一个错误。1的数组显然不是数组。这就留下了一个不完整的表,没有总质量块。
当用户只需要一行时,我需要找到一种方法绕过代码中为行创建数组的部分,但我现在不知道如何创建。如果我删除这段代码,它实际上适用于一行表,但不再适用于多行表。
它必须是一些更深入的lisp知识简单的人,所以我想我应该试试我的运气在这里,因为这个论坛已经帮助了我在许多以前的场合。
这是代码:(这是一个12年/月的文件,不幸的是,文件中没有学分)
(apply '(lambda (/ b c d dx dy cmd att lay col row pt1 ptx pty pt2 sel)
(princ "\nInsert Material List")
(setq cmd (getvar "cmdecho"))
(setq att (getvar "attdia"))
(setvar "cmdecho" 0)
(setvar "attdia" 0)
(setq lay (getvar "clayer"))
(setvar "clayer" "0")
(setq b (getvar "dimscale"))
(setq c (getvar "tilemode"))
(if (= c 1 )(setq d b)(setq d 1))
(setq col (getint "\nNumber of columns<1>: "))
(if (null col)(setq col 1))
(setq row (getint "\nNumber of rows<20>: "))
(if (null row)(setq row 20))
(setq pt1 (getpoint "\nInsertion point..."))
(setq ptx (car pt1))
(setq pty (cadr pt1))
(setq dx (* d -200))
(setq dy (* d -7))
(setq pt2 (list (+ ptx dx)(+ pty dy)))
(command "insert" "matlhd" pt1 d d "0")
(setq sel (ssget "L"))
(if (/= col 1)
(command "array" sel "" "r" 1 col dx)
)
(command "insert" "matlitem" pt2 d d "0")
(setq sel (ssget "L"))
;The next 4 lines I want to bypass when number of rows is 1
(if (= col 1)
(command "array" sel "" "r" row 1 dy)
(command "array" sel "" "r" row col dy dx)
)
(setq pt3 (list ptx (+ pty (* d (* -7 (+ 1 row))))))
(command "insert" "matltot" pt3 d d "0")
(setvar "cmdecho" cmd)
(setvar "clayer" lay)
(setvar "attdia" att)
(princ)
)
'()
)
感谢阅读 试试这个:
;The next 4 lines I want to bypass when number of rows is 1
(if (/= row 1)
(if (= col 1)
(command "array" sel "" "r" row 1 dy)
(command "array" sel "" "r" row col dy dx)
)
)
谢谢你,卡尔,效果很好。
我之前曾多次尝试在代码中的某个地方插入“if(/=行1)”行,但我想我的位置错了。 *删除重复条目*
页:
[1]