局部重生成命令BUG讨论
如下部分的代码,是在网络上找到的局部重生成命令,具体出处,当时未有记录,请见谅。
此命令,可对选择部分重生成,还可以对屏幕范围内重生成。
此程序有如下问题:
在初次打开这命令时,不选择内容直接回车对屏幕内部分重生成时,会有命令出错;而对手动选择内容进行重生成后,再进行屏幕内重生成时,没有问题。
经过查找,发现在是 (setq ss (apply 'ssget (cons "c" (getscreen))))在初次运行时,返回为空,请高手帮忙看一下,此段代码如何进行优化。
感谢!
(defun getscreen (/ fact hhalf viewcnt viewh vieww vieww1 whalf)
(setq viewcnt (getvar "viewctr"))
(setq viewH (getvar "viewsize"))
(setq viewW (getvar "screensize"))
(setq fact (/ viewH (cadr viewW)))
(setq viewW1 (* fact (car viewW)))
(setq Hhalf (/ viewH 2))
(setq Whalf (/ viewW1 2))
(list (list (- (car viewcnt) Whalf) (- (cadr viewcnt) Hhalf))
(list (+ (car viewcnt) Whalf) (+ (cadr viewcnt) Hhalf))
)
)
;当前屏幕范围内内容刷新
(defun c:tt(/ ss)
(setq ss (ssget))
(or ss (setq ss (apply 'ssget (cons "c" (getscreen)))))
(vl-cmdf "MOVE" ss "" "0,0,0" "0,0,0")
)
nyistjz 发表于 2020-12-16 09:20
3楼和6楼的道理是一致的,都能解决问题,但还是不太明白,我原来的那个到底为什么会返回为空,感觉很是疑惑 ...
可能是软件问题,我在2021上没有发现你说的初次运行为空这个问题。只有在视野内无图元时出错,那是因为SS为nil ,在运行后面的(vl-cmdf "MOVE" ss "" "0,0,0" "0,0,0")时报错。所有要加上判断
(If ss (vl-cmdf "MOVE" ss "" "0,0,0" "0,0,0"))。也可以加上and,and的运行逻辑是前面条件为0,后面就不运行了。只有前面条件为1,在运行后面程序进行判断。 (setq ss (ssget))
(or ss (setq ss (apply 'ssget (cons "c" (getscreen)))))
(vl-cmdf "MOVE" ss "" "0,0,0" "0,0,0")
更改为:
(and (or (setq ss (ssget))
(setq ss (apply 'ssget (cons "c" (getscreen))))
)
(vl-cmdf "MOVE" ss "" "0,0,0" "0,0,0")
) nyistjz 发表于 2020-12-16 09:20
3楼和6楼的道理是一致的,都能解决问题,但还是不太明白,我原来的那个到底为什么会返回为空,感觉很是疑惑 ...
把你的or改成and就成。 当前屏没图元的时候就有问题啦 好资料,收藏学习了。 lijiao 发表于 2020-12-15 17:18
测试显示满足要求,谢谢! (If ss (vl-cmdf "MOVE" ss "" "0,0,0" "0,0,0")) 3楼和6楼的道理是一致的,都能解决问题,但还是不太明白,我原来的那个到底为什么会返回为空,感觉很是疑惑。 删掉再oops,不是一样也能达到局部再生的效果吗? 自贡黄明儒 发表于 2020-12-16 21:46
把你的or改成and就成。
把原程序中的or直接改在and不行的,功能就变了。
页:
[1]
2