明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2190|回复: 14

[讨论] 局部重生成命令BUG讨论

[复制链接]
发表于 2020-12-15 16:35:13 | 显示全部楼层 |阅读模式

如下部分的代码,是在网络上找到的局部重生成命令,具体出处,当时未有记录,请见谅。
此命令,可对选择部分重生成,还可以对屏幕范围内重生成。

此程序有如下问题:
在初次打开这命令时,不选择内容直接回车对屏幕内部分重生成时,会有命令出错;而对手动选择内容进行重生成后,再进行屏幕内重生成时,没有问题。

经过查找,发现在是 (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")
)

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2020-12-20 04:15:15 | 显示全部楼层
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,在运行后面程序进行判断。
发表于 2020-12-15 17:18:01 | 显示全部楼层
  1. (setq ss (ssget))
  2.   (or ss (setq ss (apply 'ssget (cons "c" (getscreen)))))
  3.         (vl-cmdf "MOVE" ss "" "0,0,0" "0,0,0")


  4. 更改为:

  5. (and (or (setq ss (ssget))
  6.            (setq ss (apply 'ssget (cons "c" (getscreen))))
  7.        )
  8.        (vl-cmdf "MOVE" ss "" "0,0,0" "0,0,0")
  9.   )
发表于 2020-12-16 21:46:20 来自手机 | 显示全部楼层
nyistjz 发表于 2020-12-16 09:20
3楼和6楼的道理是一致的,都能解决问题,但还是不太明白,我原来的那个到底为什么会返回为空,感觉很是疑惑 ...

把你的or改成and就成。
发表于 2020-12-15 16:46:10 | 显示全部楼层
当前屏没图元的时候就有问题啦
发表于 2020-12-16 08:52:35 | 显示全部楼层
好资料,收藏学习了
 楼主| 发表于 2020-12-16 09:02:33 | 显示全部楼层

测试显示满足要求,谢谢!
发表于 2020-12-16 09:06:47 | 显示全部楼层
(If ss (vl-cmdf "MOVE" ss "" "0,0,0" "0,0,0"))
 楼主| 发表于 2020-12-16 09:20:21 | 显示全部楼层
3楼和6楼的道理是一致的,都能解决问题,但还是不太明白,我原来的那个到底为什么会返回为空,感觉很是疑惑。
发表于 2020-12-17 08:09:46 | 显示全部楼层
删掉再oops,不是一样也能达到局部再生的效果吗?
 楼主| 发表于 2020-12-17 09:00:38 | 显示全部楼层
自贡黄明儒 发表于 2020-12-16 21:46
把你的or改成and就成。

把原程序中的or直接改在and不行的,功能就变了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-17 11:16 , Processed in 0.167286 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表