大家好,
最近,我被要求修复一些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)
- )
- '()
- )
感谢阅读 |