啊。。。我懂了。2件事。进一步检查项目的性质是否是该列表的成员:(“LINE”“LWPOLYLINE”“CIRCLE”“DIMENSION”“TEXT”“INSERT”“ARC”),因此如果是块插入,则需要检查两次。我将通过使用entsel而不是entsel来摆脱第一个额外步骤。在这里使用entsel对所有实体都是相同的操作。(仅当需要nentsel时才使用nentsel)。
通过在if中移动setq,可以进一步减少代码的长度。
- (defun C:CLC ( / selectedobject selectedobjecttype selectedobjectlayer layercolor colorbook colorbookcolor OLDCMDECHO)
- (setq OLDCMDECHO (getvar "cmdecho"))
- (setvar "cmdecho" 0)
- (command "UNDO" "BEGIN")
- (if (setq selectedobject (entsel "\nSelect a line, polyline, circle or arc to change its layers color: "))
- (progn
- (setq selectedobjecttype (cdr (assoc 0 (setq selectedobject (entget (car selectedobject))))))
- (if (member selectedobjecttype '("LINE" "LWPOLYLINE" "CIRCLE" "DIMENSION" "TEXT" "INSERT" "ARC"))
- (setq selectedobjectlayer (cdr (assoc 8 selectedobject)))
- )
- (if selectedobjectlayer
- (progn
- (if (setq layercolor (acad_truecolordlg 253 nil))
- (cond ((cddr layercolor)
- (setq layercolor (cdaddr layercolor))
- (setq colorbook (substr layercolor 1 (vl-string-position (ascii "$") layercolor 0 t)))
- (setq colorbookcolor (substr layercolor (+ 2(vl-string-position (ascii "$") layercolor 0 t))))
- (command-s "-Layer" "Color" "Colorbook" colorbook colorbookcolor selectedobjectlayer "")
- (princ (strcat "\nLayer: " selectedobjectlayer " changed to color: " colorbookcolor "."))
- )
- ((cdr layercolor)
- (setq layercolor (OLEtoRGB_color (cdadr layercolor)))
- (setq layercolor (strcat (itoa (car layercolor))","(itoa (cadr layercolor))","(itoa (caddr layercolor))))
- (command-s "-Layer" "Color" "Truecolor" layercolor selectedobjectlayer "")
- (princ (strcat "\nLayer: " selectedobjectlayer " changed to color: " layercolor "."))
- )
- ((setq layercolor (cdr (car layercolor)))
- (command-s "-Layer" "Color" layercolor selectedobjectlayer "")
- (princ (strcat "\nLayer: " selectedobjectlayer " changed to color: " (itoa layercolor) "."))
- )
- )
- (princ "\nCancelled...")
- )
- )
- (princ "\nInvalid selection.")
- )
- )
- (princ "\nCancelled...")
- )
- (command "UNDO" "END")
- (setvar "cmdecho" OLDCMDECHO)
- (princ)
- )
如果这是我的项目,我可能会做其他事情:制作OLEtoRGB_颜色的变体,直接返回您需要的颜色,即“99171207”,而不是需要进一步处理的(99171 207)。可能是一个接受任何颜色格式和图层作为参数的sub,以使颜色相应地改变。当诸如acad_truecolordlg(点对中的str或int((62.43)(420.13676676)(430。“RAL CLASSIC$RAL 1001”))之类的函数可以返回不同格式时,使用vl princ to string可以删除一堆代码。验证更少,处理方式独特。(vl princ将wathever串起来,而不必根据性质以不同的方式对其进行操作。(itoa/rtos/as is if str)
最后一点,当你有很多if时,遵循流程可能是一个挑战,代码可以跨越许多行。它们可以嵌套,也可以一个接一个地嵌套。
如果(…)比做一个
如果A大于B
如果B大于C
- [b]Nested if:[/b]
- (if (...)
- (if A
- (if B
- C)
- )
- )
- [b]Chain of if:[/b]
- (if (...)
- A
- )
- (if A
- B
- )
- (if B
- C
- )
- [b]And alternative:[/b]
- (and (...)
- A
- B
- C
- )
And和Or函数可以极大地帮助使代码更加简洁易读。看看Ron的例子
@Ronjonp你有一个(列表缺失! |