明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 11324|回复: 33

[讨论] 从对象捕捉的开和关想到的

[复制链接]
发表于 2013-10-31 15:06 | 显示全部楼层 |阅读模式
本帖最后由 llsheng_73 于 2013-10-31 15:32 编辑


其实捕捉的开关相当相当的简单,本来都不想说什么的,但最近老有人纠结于此,于是就个人经验简单说下,同时也希望高人们多支招
      由于程序运行的需要,有的程序必须关掉对象捕捉,不然很多情况下会出现不希望的结果(主要是涉及到图元的绘制、复制、镜像、阵列等,这不多说,因为这不是要讨论的),所以自然有在程序开始有了类似(setq old (getvar "OSMODE"))之类的语句来关闭对象捕捉,接着就是(setvar "OSMODE" 0)关闭对象捕捉。最后在程序结束的时候(setvar "OSMODE" old)来恢复以前的捕捉方式。
      这其实是比较好的习惯,因为最后把修改过的系统变量恢复回来了。但实际上呢?实际上不一定能恢复得了,因为用程序的人通常不是程序原作者,所涉及到的数据根程序作者调试时不一样那再正常不过。于是就很可能程序运行不到正常结束,也就运行不到恢复它的地方,这就是有的人有时很烦的原因。设置好的捕捉方式一个也没了,只能打开对象捕捉一个个点了设置好,确实比较烦,虽然点不了几下,那也得看具体使用情况,一般说来,通常把捕捉开了一半左右的重新设置的时候还是要点好多下的。
     更有的很可能在程序最后根本就没有恢复语句,或者把它放到了某个条件执行过程内而没运行到也是有可能的。
     为了少给程序使用者造成不必要的小麻烦,于是有人把那个恢复语句写在错误处理过程里边,这当然值得称赞,因为这样基本上不会恢复不了。但不幸的是,有相当多的人并不一定就会写错误处理过程,就算会写也不见得一定会把它写在给别人的程序里边,当然,如果这种行为仅仅是个疏忽那应该谅解,写程序毕竟不是个轻松活,有时累了忘点什么并不致命的都应该得到谅解;如果仅仅是嫌麻烦或者觉得那根本不重要,那应该说不是一个好程序员(并不是指水平.也许有人说,我本来就不是程序员,没有好不好的说法。这种说法应该是不对的,不管你是不是专业的,你只要写程序并提供给别人,那就应该尽最大可能为别人考虑,这跟是否收费无关,只与我们做什么有关)
     前边说了这么多(本来开始没想到什么,说着扯到程序员上边就多说了两句,虽然我也不是专业的),其实就是想怎么尽可能解决这个问题。我能想到的不多,一是很多时候作为用户我们真不必过于纠结,对象捕捉没了再设置就是了,就算再忍受不了,也至少不必埋怨程序作者。前边说过了,程序作者也是很辛苦的。话说回来,你使用这个程序你付出相应代价了么?哪怕程序再小,也是有价值的,不然你也不会用它不是? 如果没有,那我们根本就没资格去埋怨人家,如果有,我们也大可不必埋怨。因为它给你所带来的仅仅是个真的很小的麻烦而不是无法挽回的损失。
    其次是程序作者呢要尽可能为用户着想,把自己当成一般用户,以这样的心态去认真写好每一句,当然也就没什么麻烦了。以对象捕捉状态的备份和恢复为例,关对象捕捉状态前先通过(setq old (getvar "OSMODE"))备份这肯定没问题。但很多时候关捕捉状态那个语句的写法是有问题的,一般都是通过(setvar "OSMODE" 0) 来完成这个动作,它的问题就在于这一下把捕捉状态完全清空了,所以后边要恢复的时候必须要用先前备份的old,如果不执行这一句,直接点开对象捕捉它什么都没有,这就是引起人家不满意的原因。那么不这样有办法么?当然有,首先,我们查对象捕捉相关的这个系统变量OSMODE,仔细看下,最后边有这么一句"使用状态行的“对象捕捉”按钮关闭对象捕捉模式,除了返回 OSMODE 的普通值,还将返回位码 16384 (0x4000)。 ....."也就是说,我们可以通过(setvar "OSMODE" 16384)来实现关闭这个动作。这样关闭之后,我们再看下 (getvar "OSMODE").....奇怪了,怎么它不是16384,刚才不是设为16384了么,状态栏那都灰了,是关掉了的没错呀,什么问题呢?其实什么问题都没有。因为cad在我们把OSMODE设为16384时,它相当于把我们先通过备份得到的那个old的值给加上去了,这其实才是直接点击鼠标关闭对象捕捉的真正过程(或者说是它的模拟,如果非要很专业的话)。 这样就有个明显的好处了,cad既然通过当前捕捉状态值加上16384,当然也就可以把当然捕捉状态值减去16384实现用鼠标点击去打开捕捉这个过程。所以最先的备份虽然没错,但不是必要的,因为恢复的时候完全可以不用它,而通过(if(>(getvar"OSMODE")16384)(setvar"OSMODE"(-(getvar"OSMODE"16384))来恢复。当然这样还是不能根本上解决程序中断执行不到而恢复不了的问题,但是,这时我们可以只点一下鼠标就能把捕捉状态完全恢复过来。如果还有人为这一点纠结,不知道你们会怎么样,反正我是尽量离他远点。
      还有一个问题是如果用了别人的程序正常结束而不恢复怎么办,程序事先有没有备份不知道,但至少是不知道它所用的变量,而且它关的时候很“坚决”,可以断定就是用(setvar "OSMODE" 0)来关掉的,因为点开对象捕捉那什么都没有了嘛。所以,对于不知道的情况,我们榀以事先做个备份,完了如果它没恢复过来,我就可以自己恢复它了。当然,每次运行程序前后都这样也很麻烦,那我们可以考虑一个很小的程序,命令简单一些,最好方便左手(好象用CAD的最后都只会用左手按键盘了,这不是CAD的错,要怪可以怪为什么要发明鼠标)。这里给有兴趣的拿去用,肯定不会有太多不方便和麻烦。
     
  1. (defun c:BZ()
  2.   (while(not(member(setq kw(getint"\n1.捕捉方式备份2.打开捕捉3.按备份恢复:"))'(1 2 3))))
  3.   (cond((= kw 1)(setq OLDOS(getvar"OSMODE")))
  4.        ((= kw 2)(if(>(getvar"OSMODE")16384)(setvar"OSMODE"(-(getvar"OSMODE")16384))))
  5.        ((= kw 3)(if OLDOS(setvar"OSMODE"OLDOS))))
  6.   )

     乱七八糟的说了一通,希望大家别介意。如果真说错了,可以回贴狠骂,不过最好不要一边去说“那个什么什么家伙,自以为怎么怎么的,其实就一个什么,说了那么大一堆,根本就什么都不是嘛”
   
      

点评

加个出错函数,会更好吧,也不用你再用一个BZ命令 (defun 程序() ;这里,你可以写你要的程序,比如下面 (setvar "osmode" 0) (setq pt (getpoint "\n输入一点:")) (while pt (command "c   发表于 2013-11-6 09:23
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2013-11-1 13:41 | 显示全部楼层
我在院长那里学到了一招。。。比这个好用点。。。不敢独享  

用到受捕捉影响的  函数

中间加个   “NONE”   相当于SHIFT+鼠标右键  选择了  无   捕捉
相当于临时关了捕捉。。。。

不影程序运行


如:(command "line" "none" pt1 "none"  pt2 "")

点评

赞!  发表于 2023-4-3 01:16
回复 支持 3 反对 1

使用道具 举报

 楼主| 发表于 2015-10-18 22:45 | 显示全部楼层
冰之绝恋 发表于 2015-10-18 21:55
楼主讲解得很透彻~!
同时感谢13楼提供的程序!

  1. (defun SetOsMode(F)(setvar'osmode((if F rem +)(rem(getvar'osmode)16384)16384)))

评分

参与人数 1明经币 +1 收起 理由
冰之绝恋 + 1 很给力!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2013-11-5 11:24 | 显示全部楼层
我的做法是不用(setvar "OSMODE" 0)
改用一个小函数
(Defun OSmode (Value)
  (if Value
    (Setvar "osmode" (rem (Getvar "osmode") 16384))
    (Setvar "osmode" (+ (rem (Getvar "osmode") 16384) 16384))
  )
)
(OSmode t)  ;开
(OSmode nil);关

点评

这种方法很给力!  发表于 2013-11-6 22:29
回复 支持 1 反对 0

使用道具 举报

发表于 2013-10-31 15:26 | 显示全部楼层
((= kw 3)(if OLDOS(setvar"OSMODE"OLDOS)(setvar"OSMODE"OLDOS))))
是写错了?
 楼主| 发表于 2013-10-31 15:31 | 显示全部楼层
本帖最后由 llsheng_73 于 2013-10-31 18:19 编辑
自贡黄明儒 发表于 2013-10-31 15:26
((= kw 3)(if OLDOS(setvar"OSMODE"OLDOS)(setvar"OSMODE"OLDOS))))
是写错了?

是错了,当时本来是想还有个什么处理的,结果想了半天没想出来,偏偏又忘了cut掉它,结果弄得那判断不起作用,谢谢哈,已经改了
发表于 2013-10-31 18:09 | 显示全部楼层
那个纠结那个捕捉的人是我,谢谢哈,感谢版主,顶
发表于 2013-10-31 19:15 | 显示全部楼层
学习了!这个太实用了
 楼主| 发表于 2013-11-1 13:56 | 显示全部楼层
ysq101 发表于 2013-11-1 13:41
我在院长那里学到了一招。。。比这个好用点。。。不敢独享  

用到受捕捉影响的  函数

感谢分享,毫无疑问这是一个好招,但疑惑的是,在ENTMAKE时能借用这种办法不?
发表于 2013-11-2 10:19 | 显示全部楼层
llsheng_73 发表于 2013-11-1 13:56
感谢分享,毫无疑问这是一个好招,但疑惑的是,在ENTMAKE时能借用这种办法不?

entmake  不受也捕捉影响...所以高手都建议我们用entmake
 楼主| 发表于 2013-11-2 10:47 | 显示全部楼层
ysq101 发表于 2013-11-2 10:19
entmake  不受也捕捉影响...所以高手都建议我们用entmake

谢谢,好在我基本上都用ENTMAKE,当然不是因为我是高手,我只因为CAD它同一命令在不同版本中不尽相同,让人很无语。。。。
发表于 2013-11-3 01:36 | 显示全部楼层
谢谢楼主分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-20 21:29 , Processed in 0.420919 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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