明经CAD社区

 找回密码
 注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 351|回复: 10

[讨论] 比较笨的办法,变量保存与恢复,有更好的吗?

[复制链接]
发表于 2020-2-8 20:05 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2020-2-8 20:39 编辑

如题:
     这种笨办法备份变量,恢复变量,存在很多问题,不但影响命令执行速度,而且,程序中途退出,往往恢复不了。
目的:
    备份:要备份所有变量
    恢复:要恢复所有变零
    速度:要求,速度飞快


有没有这样的办法?


;;;;;;;;;;;;标注变量备份----------------------------------------------------------
(defun dimbf ( )
  (setq
    oldblk (getvar "dimblk")
    oldblk1 (getvar "dimblk1")
    oldblk2 (getvar "dimblk2")
    oldasz (getvar "dimasz")
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    oldadec (getvar "DIMADEC")
    oldaltd (getvar "DIMALTD")
    oldaltf (getvar "DIMALTF")
    oldtrnd (getvar "DIMALTRND")
    oldattd (getvar "DIMALTTD")
    oldlttz (getvar "DIMALTTZ")
    oldaltu (getvar "DIMALTU")
    oldaltz (getvar "DIMALTZ")
    oldtfit (getvar "DIMATFIT")
    oldunit (getvar "DIMAUNIT")
    oldazin (getvar "DIMAZIN")
    oldfrac (getvar "DIMFRAC")
    oldunit (getvar "DIMLUNIT")
    oldmlwd (getvar "DIMLWD")
    oldmlwe (getvar "DIMLWE")
    oldmsd1 (getvar "DIMSD1")
    oldmsd2 (getvar "DIMSD2")
    oldmse1 (getvar "DIMSE1")
    oldmse2 (getvar "DIMSE2")
    oldtdec (getvar "DIMTDEC")
    oldtfac (getvar "DIMTFAC")
    oldimtm (getvar "DIMTM")
    oldmtol (getvar "DIMTOL")
    oldtolj (getvar "DIMTOLJ")
    oldimtp (getvar "DIMTP")
    oldtzin (getvar "DIMTZIN")
    oldmupt (getvar "DIMUPT")
    oldlrt (getvar "DIMCLRT")
    oldlrd (getvar "DIMCLRD")
    oldlre (getvar "DIMCLRE")
    oldtih (getvar "DIMTIH")
    oldust (getvar "dimjust")
    oldtoh (getvar "DIMTOH")
    oldtad (getvar "dimtad")
    oldexe (getvar "dimexe")
    oldexo (getvar "dimexo")
    oldgap (getvar "dimgap")
    oldcen (getvar "DIMCEN")
    oldrblk (getvar "DIMLDRBLK")
    oldsah (getvar "dimsah")
    oldlim (getvar "DIMLIM")
    oldtsz (getvar "dimtsz")
    oldtvp (getvar "dimtvp")
    olddli (getvar "DIMDLI")
    olddec (getvar "DIMDEC")
    olddle (getvar "DIMDLE")
    oldtxt (getvar "dimtxt")
    oldoxd (getvar "dimsoxd")
    oldalt (getvar "dimalt")
    oldtix (getvar "dimtix")
    oldsep (getvar "DIMDSEP")
    oldofl (getvar "dimtofl")
    oldsho (getvar "dimsho")
    oldrnd (getvar "dimrnd")
    oldove (getvar "DIMTMOVE")
    oldsty (getvar "DIMTXSTY")
  )
)
;;;;;;;;;;;;标注变量恢复----------------------------------------------------------
(defun dimhf ( )
  (setvar "dimblk" oldblk)
  (setvar "dimblk1" oldblk1)
  (setvar "dimblk2" oldblk2)
  (setvar "dimasz" oldasz)
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (setvar "DIMADEC" oldadec)
  (setvar "DIMALTD" oldaltd)
  (setvar "DIMALTF" oldaltf)
  (setvar "DIMALTRND" oldtrnd)
  (setvar "DIMALTTD" oldattd)
  (setvar "DIMALTTZ" oldlttz)
  (setvar "DIMALTU" oldaltu)
  (setvar "DIMALTZ" oldaltz)
  (setvar "DIMATFIT"oldtfit)
  (setvar "DIMAUNIT" oldunit)
  (setvar "DIMAZIN"oldazin)
  (setvar "DIMFRAC" oldfrac)
  (setvar "DIMLUNIT"oldunit)
  (setvar "DIMLWD" oldmlwd)
  (setvar "DIMLWE" oldmlwe)
  (setvar "DIMSD1" oldmsd1)
  (setvar "DIMSD2" oldmsd2)
  (setvar "DIMSE1" oldmse1)
  (setvar "DIMSE2" oldmse2)
  (setvar "DIMTDEC" oldtdec)
  (setvar "DIMTFAC"oldtfac)
  (setvar "DIMTM"oldimtm)
  (setvar "DIMTOL" oldmtol)
  (setvar "DIMTOLJ"oldtolj)
  (setvar "DIMTP" oldimtp)
  (setvar "DIMTZIN"oldtzin)
  (setvar "DIMUPT" oldmupt)
  (setvar "DIMCLRT" oldlrt)
  (setvar "DIMCLRD" oldlrd)
  (setvar "DIMCLRE" oldlre)
  (setvar "DIMTIH" oldtih)
  (setvar "dimjust" oldust)
  (setvar "DIMTOH" oldtoh)
  (setvar "dimtad" oldtad)
  (setvar "dimexe" oldexe)
  (setvar "dimexo" oldexo)
  (setvar "dimgap" oldgap)
  (setvar "DIMCEN" oldcen)
  (setvar "DIMLDRBLK" oldrblk)
  (setvar "dimsah" oldsah)
  (setvar "DIMLIM" oldlim)
  (setvar "dimtsz" oldtsz)
  (setvar "dimtvp" oldtvp)
  (setvar "DIMDLI" olddli)
  (setvar "DIMDEC" olddec)
  (setvar "DIMDLE" olddle)
  (setvar "dimtxt" oldtxt)
  (setvar "dimsoxd" oldoxd)
  (setvar "dimalt" oldalt)
  (setvar "dimtix" oldtix)
  (setvar "DIMDSEP" oldsep)
  (setvar "dimtofl" oldofl)
  (setvar "dimsho" oldsho)
  (setvar "dimrnd" oldrnd)
  (setvar "DIMTMOVE" oldove)
  (setvar "DIMTXSTY" oldsty)(gc)
)



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2020-2-8 22:00 | 显示全部楼层
用list存储数据,而不是如你所说的这种笨方法。

点评

哪个我也看了,更好些,但是也不是目的。  发表于 2020-2-8 22:03
发表于 2020-2-8 22:03 | 显示全部楼层
entget ,tblobjname 获取某个dimstyle的数据,然后剔除几个不需要的group codes ,剩余的部分保存即可。
 楼主| 发表于 2020-2-9 09:07 | 显示全部楼层
本帖最后由 尘缘一生 于 2020-2-9 09:35 编辑
e2002 发表于 2020-2-8 22:03
entget ,tblobjname 获取某个dimstyle的数据,然后剔除几个不需要的group codes ,剩余的部分保存即可。

经过搜索,现贴出来





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2020-2-9 10:12 | 显示全部楼层
本帖最后由 e2002 于 2020-2-9 10:14 编辑

一般的,在基础函数库中 先写好sysvar-save,sysvar-set,sysvar-restore 三个通用函数。然后各个程序均调用这几个函数。
另外,不建议使用全局变量保存数据。需要在程序外部保存数据有很多方法,注册表,cfg或ini文本文件,dwg内部还可以使用 xrecord,lisp还有专用的 ldata。

 楼主| 发表于 2020-2-9 10:50 | 显示全部楼层
本帖最后由 尘缘一生 于 2020-2-9 11:03 编辑
e2002 发表于 2020-2-9 10:12
一般的,在基础函数库中 先写好sysvar-save,sysvar-set,sysvar-restore 三个通用函数。然后各个程序均调 ...

假如:使用者,他CAD挂有几个插件情况,比如:插件A+探索者

   当操作一个插件A的一个开发命令,操作完后,恢复到什么状态?
   一种是恢复到初始状态,从而不影响探索者,这种方法,再次使用本插件A另一个命令,还得再加载本系统设置,重复繁琐,觉得不可取。
   另一种,不全部恢复,只恢复到本系统设置初始部分,就不敢保证会不会影响其他插件。

有一大部分系统变量,设置可能不用恢复,常规都那么设置的,比如:我筛选的这些:

但这部分如何拿捏,是个纠结、测试、反复实验的过程............

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2020-2-9 10:58 | 显示全部楼层
合格的程序,应该做到不影响用户的喜好设置,而且应该做到使用独立的命名空间,不会影响其他程序。

不合格的请弃用。
发表于 2020-2-9 11:16 | 显示全部楼层
e2002 发表于 2020-2-9 10:58
合格的程序,应该做到不影响用户的喜好设置,而且应该做到使用独立的命名空间,不会影响其他程序。

不合 ...

版主 能说下 (独立的命名空间) 这个怎么弄吗?  没有找到这方面的贴子
能写个简单的程序例子吗?
发表于 2020-2-9 13:30 | 显示全部楼层
e2002 发表于 2020-2-9 10:58
合格的程序,应该做到不影响用户的喜好设置,而且应该做到使用独立的命名空间,不会影响其他程序。

不合 ...

实际情况会相当复杂,比如A/B两个程序都需要自定义设置,就算二者都能做到启动自己前先记录好,退出时候再恢复。设想一个场景,原始设置C0,先运行A程序,记录A1,然后运行B程序,记录B1,此时的B1就已经是A修改后的设置了,然后退出A,恢复到C0, 最后退出B,此时恢复的是A1了。
这事说大不大,一般程序不会改太多设置,是程序必须要用的才会改,多数场景下也会恢复,即便有少量被修改了的,自己再改回来呗。做个简单的程序reset一下即可。
发表于 2020-2-9 21:27 | 显示全部楼层
本帖最后由 e2002 于 2020-2-9 21:39 编辑
mikewolf2k 发表于 2020-2-9 13:30
实际情况会相当复杂,比如A/B两个程序都需要自定义设置,就算二者都能做到启动自己前先记录好,退出时候 ...

在一个当前打开的文档中,应该不会出现这种InA/InB/OutA/OutB的顺序吧?InA/InB/OutB/OutA是常见的。

另外,如果存在特定的反应器,可能会出现复杂的情况,不过AutoCAD也提供了SysvarMonitor这个功能,还是很方便的。之前测试maicy的mini工具,也是遇到每次启动就提示某个系统变量发生了改变,然后就自己改了其初始设置lisp中的相应代码。

如上面一生贴出的图,这些常用系统变量的设置,设置为什么值,基本属于个人喜好,默认值可能有些人就是不习惯呢。所以这些初始环境相关的设置,写在初始化设置lisp源文件内即可。这些并不属于我们通常意义上说的“程序”的范畴。我们自己的具有功能性,用于实现某种目的,解决某些需求的“程序”,就需要在程序中处理相关sysvar的保存,设置,在处理完成后,程序结束前,还是要恢复到这个程序对这些系统变量的改动之前的状态(不是所有都要恢复,例如切换到某个layout处理完成后,CTAB显然是改变了,是不是要回到之前的那个Layout,还是看实际是否需要)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2020-9-24 00:37 , Processed in 0.123966 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2013 Comsenz Inc.

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