明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4373|回复: 12

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

[复制链接]
发表于 2011-12-21 09:53 | 显示全部楼层 |阅读模式
本帖最后由 xshrimp 于 2011-12-21 10:09 编辑

1.pragma
  1. (pragma   '((unprotect-assign   myFun)))
  2. (defun myFun () (alert "My defun!"))
  3. (pragma   '((protect-assign   myFun)))
  4. (princ)


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


待续...........
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2011-12-21 22:30 | 显示全部楼层
看了半天英文资料,才大致搞明白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打开时才有意义,重定义保护的符号,
会得到提示!
可以定义如下两个函数批量保护和解除保护的函数
  1. (defun protect-assign (syms)
  2.   (eval
  3.     (list 'pragma
  4.    (list 'quote
  5.   (list (cons 'protect-assign syms))
  6.    )
  7.     )
  8.   )
  9. )
  10. 保护调用:
  11. (protect-assign '(myfun1 myfun2 myfun3))
  12. ;;;(unprotect-assign syms) 解除保护符号函数
  13. (defun unprotect-assign (syms)
  14.   (eval
  15.     (list 'pragma
  16.    (list 'quote
  17.   (list (cons 'unprotect-assign syms))
  18.    )
  19.     )
  20.   )
  21. )
  22. 解除调用:
  23. (unprotect-assign '(myfun1 myfun2 myfun3))


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

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
自贡黄明儒 + 1 很给力!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2011-12-21 17:04 来自手机 | 显示全部楼层
怎么找到的?

点评

我也想知道  发表于 2011-12-22 10:30
发表于 2011-12-21 19:45 | 显示全部楼层
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。
发表于 2011-12-21 20:06 | 显示全部楼层
本帖最后由 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 为初始状态值

具体有什么现实应用意义,我还不清楚!
发表于 2011-12-21 22:41 | 显示全部楼层
本帖最后由 highflybir 于 2011-12-21 22:44 编辑
Gu_xl 发表于 2011-12-21 20:06
很少用到这个函数,查了一下,意义如下:
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.

评分

参与人数 2明经币 +2 收起 理由
cabinsummer + 1 很给力!
Gu_xl + 1 很给力!

查看全部评分

发表于 2011-12-22 00:33 | 显示全部楼层
见过没用过,thanks 高飞
发表于 2013-8-30 13:48 | 显示全部楼层
顶,上面各位都是高手呀!!
发表于 2013-9-11 19:52 | 显示全部楼层
很有趣的变量啊,对文件状态的了解很有帮助。
留个记号,以后有方向了~~~
发表于 2013-9-11 20:17 | 显示全部楼层
厉害!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-17 14:08 , Processed in 0.392334 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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