能不能使某个层上不能画东西?
各位高手,我建立一个专门的层,这个层上我不希望别人能在上面画东西,有没有办法? [建议]图层名:别在这层画东西 锁定&冻结那个层就OK 要这一层来干什么? 我希望这个层,只有有权限的人才能画东西,如可以先设置密码等。 Cadlock Cadlock是什么,怎么用啊? 本帖最后由 作者 于 2005-1-28 18:44:14 编辑 <br /><br /> 1 设置系统变量反映器,当 clayer 为某以层时自动转到 0 层<br>2 监视新生成实体如果在 特定层,删除。<br><br>
;|<br>
禁止在 ddd 图层绘制或将其他层实体修改至 ddd 层,<br>
禁止将当前层设置为 ddd 层<br>
禁止解锁 ddd 层<br>
数据库对象监视只有在 commandended lispended commandcanced lispcanceled<br>
后才触发.<br>
|;<br>
;;首先锁定 ddd 图层<br>
(vla-put-lock<br>
(vla-item (vlax-get-property<br>
(vlax-get-property (vlax-get-acad-object) 'activedocument)<br>
'layers<br>
)<br>
"ddd"<br>
)<br>
:vlax-true<br>
)<br>
;;数据库反应器,保存新加及修改的对象(包括 VBA 方法)<br>
(vlr-acdb-reactor<br>
"Ea-acdb-reactor"<br>
'((:vlr-objectModified . SaveChangedLyr) ;修改<br>
(:vlr-objectAppended . SaveChangedLyr) ;添加<br>
)<br>
) ;_ 结束vlr-acdb-reactor<br>
;;编辑器反应器<br>
(vlr-editor-reactor<br>
nil<br>
'((:vlr-commandended . DelAllNew) ;_检查绘制的新实体<br>
(:vlr-commandcancelled . DelAllNew) ;_命令中断时检查是否有新实体<br>
(:vlr-lispEnded . DelAllNew) ;_检查Lisp生成的新实体<br>
(:vlr-lispCancelled . DelAllNew) ;_中断后是否有新实体<br>
(:vlr-sysvarchanged . myResetSysvar) ;_防止修改 clayer<br>
)<br>
) ;_ 结束vlr-editor-reactor<br>
;;设置当前图层,禁止设置为 ddd<br>
(defun myResetSysvar (var1 var2)<br>
(if (= (vlax-variant-value<br>
(vla-GetVariable<br>
(vla-get-activedocument (vlax-get-acad-object))<br>
"clayer"<br>
) ;_ 结束vla-GetVariable<br>
) ;_ 结束vlax-variant-value<br>
"ddd"<br>
) ;_ 结束/=<br>
(progn<br>
(vla-setvariable<br>
(vlax-get-property (vlax-get-acad-object) 'activedocument)<br>
"clayer"<br>
"0"<br>
) ;_ 结束vla-setvariable<br>
(vla-put-lock<br>
(vla-item (vla-get-layers<br>
(vlax-get-property (vlax-get-acad-object) 'activedocument)<br>
)<br>
"ddd"<br>
)<br>
:vlax-true<br>
)<br>
)<br>
) ;_ 结束if<br>
) ;_ 结束defun<br>
;;删除所有新生成的 DDD层 空间实体<br>
(defun DelAllNew (var1 var2 / lyrs item)<br>
(setq lyrs (vla-get-layers<br>
(vlax-get-property (vlax-get-acad-object) 'activedocument)<br>
) ;_ 结束vla-get-layers<br>
) ;_ 结束setq<br>
(if HasChangedObject<br>
(progn<br>
(mapcar<br>
'(lambda (item / name lyr lyrobj)<br>
(setq objname (vla-get-objectname item))<br>
(cond<br>
((and (= name "AcDbLayerTableRecord")<br>
(= (vla-get-name item) "ddd")<br>
)<br>
(vla-put-lock item :vlax-true)<br>
);_检查图层,在工具条修改的没有反应,事后会后触发<br>
(t<br>
(IF (and (not (vlax-erased-p item))<br>
(= (vl-catch-all-apply<br>
'vlax-get-property<br>
(list item 'layer)<br>
)<br>
"ddd"<br>
)<br>
)<br>
(progn<br>
(vla-put-lock (vla-item lyrs "ddd") :vlax-false);_只有解锁才可删除<br>
(vl-catch-all-apply 'vla-delete (list item))<br>
) ;_ 结束progn<br>
) ;_ 结束if<br>
)<br>
)<br>
) ;_ 结束lambda<br>
(vl-remove nil<br>
(mapcar 'vlax-ename->vla-object<br>
HasChangedObject<br>
) ;_ 结束mapcar<br>
) ;_ 结束vl-remove<br>
) ;_ 结束mapcar<br>
(setq HasChangedObject nil)<br>
) ;_ 结束progn<br>
) ;_ 结束if<br>
(if (tblsearch "layer" "ddd")<br>
(vla-put-lock (vla-item lyrs "ddd") :vlax-true)<br>
);_ 重新锁定<br>
(setq HasChangedObject nil)<br>
) ;_ 结束defun<br>
;;acdb 回调函数, 保存修改或者新加的实体<br>
;;不能直接删除,否则成为循环了,用其他条件触发<br>
(defun SaveChangedlyr (var1 var2 /)<br>
(if (not HasChangedObject)<br>
(setq HasChangedObject (list (cadr var2)))<br>
(setq HasChangedObject<br>
(append (list (cadr var2)) HasChangedObject)<br>
) ;_ 结束setq<br>
) ;_ 结束if<br>
)<br>
<br>
本帖最后由 作者 于 2005-1-31 10:58:25 编辑
真是谢谢EA大侠,大侠果然是反应器方面的专家。但是还有一个问题,就是可以通过图层的TOOLBAR下拉菜单解锁,不知有没有办法处理。还有能不能对特定的图层进行锁定而不是ddd层呢,不管如何谢谢EA贵宾。
如果这个DWG文件被拷贝,而没有加载相应的处理程序,该怎么办?