xshrimp 发表于 2011-12-21 09:53:34

今天整理机器发现几个函数,什么作用?怎么使用,大家讨论一下呢

本帖最后由 xshrimp 于 2011-12-21 10:09 编辑

1.pragma

(pragma   '((unprotect-assign   myFun)))
(defun myFun () (alert "My defun!"))
(pragma   '((protect-assign   myFun)))
(princ)


2.(acad-push-dbmod) (acad-pop-dbmod)

(acad-push-dbmod)
(setvar "cmdecho" 0)
(setq layer (getvar "clayer"))
(if (not (tblsearch "layer" "A-DIM"))(command "_.layer" "_m" "A-DIM" "_c" "4" "" ""))
(if layer(setvar "clayer" layer))
(setq layer nil)
(setvar "cmdecho" 1)
(acad-pop-dbmod)
(princ)


待续...........

Gu_xl 发表于 2011-12-21 22:30:29

看了半天英文资料,才大致搞明白pragma什么意思!
pragma函数相当于发出一个编译指令,它可用的指令有如下部分:
(link not-link
LOCALIZE NOT-LOCALIZE
drop not-drop
protect-assign unprotect-assign
trace untrace
debug-on-entry undebug-on-entry
export-to-acad unexport-to-acad)
调用方式: (pragma '((指令 函数符号...)))
例如:
(pragma '((protect-assign my-sym)))
该函数功能是再Vlide编辑器里,将符号my-sym保护起来,并显示蓝色,防止用户重定义!
在vlide编辑器里可以通过点击符号,右键选择符号服务,可以看到符号保护选项已打上钩:

其实这个并没有多少实际的意义,只有在vlide打开时才有意义,重定义保护的符号,
会得到提示!
可以定义如下两个函数批量保护和解除保护的函数

(defun protect-assign (syms)
(eval
    (list 'pragma
   (list 'quote
(list (cons 'protect-assign syms))
   )
    )
)
)
保护调用:
(protect-assign '(myfun1 myfun2 myfun3))
;;;(unprotect-assign syms) 解除保护符号函数
(defun unprotect-assign (syms)
(eval
    (list 'pragma
   (list 'quote
(list (cons 'unprotect-assign syms))
   )
    )
)
)
解除调用:
(unprotect-assign '(myfun1 myfun2 myfun3))


其它几个指令:如trace是跟踪,符号服务跟踪标志会打钩,debug-on-entry 是进入时调试等等!

cabinsummer 发表于 2011-12-21 17:04:26

怎么找到的?

cabinsummer 发表于 2011-12-21 19:45:27

acad-pop-dbmod
  恢复 DBMOD 系统变量的值到最近用 acad-push-dbmod 保存的值
  (acad-pop-dbmod) 该函数使用 acad-push-dbmod 控制 DBMOD 系统变量。DBMOD 系统变量跟踪图形的修改状态和触发保存图形请求。
  该函数在 acapp.arx 中实现,acapp.arx 默认状态下是加载的。该函数可将 DBMOD 系统变量的当前值转到内部堆栈。    返回值
  如果成功时返回 T;否则,如果堆栈为空时,返回 nil。
acad-push-dbmod
  储存 DBMOD 系统变量的当前值
  (acad-push-dbmod)该函数使用 acad-pop-dbmod 来控制 DBMOD 系统变量。用户可使用该函数来更改图形而保持 DBMOD 系统变量不变。DBMOD 系统变量跟踪图形的修改状态和触发保存图形请求。
  该函数在 acapp.arx 中实现,acapp.arx 默认状态下是加载的。该函数可将 DBMOD 系统变量的当前值转到内部堆栈。要使用 acad-push-dbmod 和 acad-pop-dbmod,必须先进行 acad-push-dbmod 操作,再使用 acad-pop-dbmod 来恢复 DBMOD 系统变量的初始状态。
  返回值
  总是返回 T。

Gu_xl 发表于 2011-12-21 20:06:42

本帖最后由 Gu_xl 于 2011-12-21 20:06 编辑

很少用到这个函数,查了一下,意义如下:
acad-push-dbmod 储存系统变量DBMOD的值
acad-pop-dbmod 恢复系统变量DBMOD的值
该函数由acapp.arx加载
系统变量DBMOD是一个只读变量,用以保存图形修改状态的位码值,其值如下:
1 对象数据库被修改
4 数据库变量被修改
8 窗口被修改
16 视图被修改
32 字段被修改
下面是一个如何保存,修改,恢复DBMOd系统变量的例子
(acad-push-dbmod); 保存DBMOD 值
(setq new_line '((0 . "LINE") (100 . "AcDbEntity") (8 . "0")
             (100 . "AcDbLine") (10 1.0 2.0 0.0) (11 2.0 1.0 0.0)
             (210 0.0 0.0 1.0)))
(entmake new_line)            ; 设置 DBMOD 值为 1
(command "_color" "2")      ; 设置 DBMOD 值为 4
(command "_-vports" "_SI")    ; 设置 DBMOD 值为 8
(command "_vpoint" "0,0,1")   ; 设置 DBMOD t值为 16
(acad-pop-dbmod)            ; 恢复 DBMOD 为初始状态值

具体有什么现实应用意义,我还不清楚!

highflybir 发表于 2011-12-21 22:41:52

本帖最后由 highflybir 于 2011-12-21 22:44 编辑

Gu_xl 发表于 2011-12-21 20:06 http://bbs.mjtd.com/static/image/common/back.gif
很少用到这个函数,查了一下,意义如下:
acad-push-dbmod 储存系统变量DBMOD的值
acad-pop-dbmod 恢复系 ...

用acad-push-dbmod存DBMOD变量的状态,acad-pop-dbmod这个用来恢复DBMOD 变量状态。
试一下:打开一个空白文件,在命令行输入(acad-push-dbmod) 回车,它应返回T.
现在你画一些东西,放大缩小视图,修改或者删除一些东西,做这样之类的事情,然后输入
(acad-pop-dbmod),回车,然后关闭AutoCAD.你会发现,没有出现以往的提示。
这些很有用,当你运行一个程序(里面可能有脚本或者startup),但你不希望强制用户必须回应是否保存。

The DBMOD system variable keeps track of changes to a drawing that would prompt you to save, when you close. In other words, anything that you do after issuing acad-push-dbmod will not be seen as having changed the drawing.

EDIT: In retrospect, I shouldn't say that it puts the variable on hold... what it does is store the value of the DBMOD variable. If you don't issue the acad-pop-dbmod command you'll still be prompted to save.

acad-pop-dbmod

This restores the DBMOD variable to it's state when you issued the acad-push-dbmod command.

Try it out. Open a blank drawing and type (acad-push-dbmod) and the command line, then press ENTER. It should return T. Now draw some things, zoom around, erase some things, etc. Now type (acad-pop-dbmod), press ENTER, and close AutoCAD.

No prompt for saving the drawing.

Very helpful when you're running a routine that you don't want to force the user to have to reply to a save query, such as in a script or at startup.

cnks 发表于 2011-12-22 00:33:50

见过没用过,thanks 高飞

自贡黄明儒 发表于 2013-8-30 13:48:33

顶,上面各位都是高手呀!!

shh_188 发表于 2013-9-11 19:52:46

很有趣的变量啊,对文件状态的了解很有帮助。
留个记号,以后有方向了~~~

xhq1954425 发表于 2013-9-11 20:17:20

厉害!
页: [1] 2
查看完整版本: 今天整理机器发现几个函数,什么作用?怎么使用,大家讨论一下呢