OSNAP过滤器所有非零Z El
大家好,一个小背景:我在一个民用土地开发办公室工作,那里的要素线被大量用于我们的设计。我们有一些很棒的C3D样式和标签,用于注释这些要素线,但由于C3D标签的限制,它们在绘图方面还有很多需要改进的地方。因此,我们主要使用多重引线进行设计的实际注释,并有一组非打印C3D标签来帮助我们进行注释。这导致大量数字从标签复制到多重引线。
最后,我拼凑了一个lisp例程,允许用户选择一个点,并将该点的z高程复制到剪贴板,以便将其粘贴到多重引线中。lisp例程工作得很好,完成了任务,但是我发现自己不得不经常使用tab键在线之间循环,直到可以在要素线上获得捕捉点。这就引出了我的问题:
在调用我的例程时,是否有方法过滤掉所有非零z高程捕捉?
例如我有一个显示所有路缘线的外部参照,最上面还有一个包含所有要素线路缘设计高程的外部参照,如果我调用命令,使用最近的捕捉并将其移动到路缘线,我可以看到坐标在零的Z高程和要素线高程之间闪烁,具体取决于我移动鼠标的位置。有没有办法过滤掉那些捕捉到的零z高程?
我不是最懂Lisp程序的人,但我愿意学习!希望有人能给我指出正确的方向。
以下是lisp供参考:
; Copy Z elevaiton of chose point to clipbaord
; Command "CZ"
(defun c:cz ()
(setq zp (rtos (caddr (getpoint "\nPick Z point: "))2 2))
(princ zp)
(_SetClipBoardText zp)
(princ)
)
(defun _SetClipBoardText ( text / htmlfile result )
;;Caller's sole responsibility is to pass a
;;text string. Anything else? Pie in face.
;;Attribution: Reformatted version of
;;post by XShrimp at theswamp.org.
;;See http://tinyurl.com/2ngf4r.
(vl-load-com)
(setq result
(vlax-invoke
(vlax-get
(vlax-get (setq htmlfile (vlax-create-object "htmlfile")) 'ParentWindow)
'ClipBoardData
)
'SetData"Text"text)
)
(vlax-release-object htmlfile)
text
) 也许这会给你一些想法:
(defun c:foo (/ _dxf e el o)
(defun _dxf (code ename) (cdr (assoc code (entget ename))))
(cond ((null (setq e (nentsel))) (print "Bye.."))
((null (setq el (_dxf 38 (car e)))) (print "No elevation found.."))
((= 0.0 el) (print "Zero elevation.."))
(t
(command ".mleader" (cadr e) (getpoint (cadr e)) "")
(if (and (setq o (entlast))
(= "AcDbMLeader" (vla-get-objectname (setq o (vlax-ename->vla-object o))))
)
(vla-put-textstring o (rtos el 2 2))
)
)
)
(princ)
) 嗨,Ronjop,
这是一段有趣的代码。我以前玩过类似的东西,不久前把它拼凑起来:
(defun c:melev (/ el loc z)
(if (and (setq el (getpoint "\n Specify leader arrowhead location :"))
(setq loc (getpoint el "\n Specify leader landing location :"))
)
(command "_.mleader" "_non" (trans el 1 0) "_non" (trans loc 1 0)(rtos (caddr el) 2 2))
(princ)
)
(princ)
)
在过滤非零Z高程捕捉点方面,我找不到太多,但我确实发现,显然设置系统高程变量使autocad更喜欢捕捉到具有Z高程的点,而不是那些没有Z高程的点。在我的代码中,我只需在命令处于活动状态时将高程设置为1e99——看起来有点像黑客,但现在它完成了这项工作。
我猜想,如果我真的想正确地执行此操作,则必须使用某种while循环来监视正在捕捉的内容。我在leemac的网站上看到了一些奇特的代码,用于模拟OSNAP,并在命令激活时在光标旁边连续显示坐标文本。也许有一天我会考虑合并这样的东西,现在这一切似乎有点让我不知所措。
现在,如果有人有一些建议,这里是我昨天代码的修改版本:
; Copy Z elevaiton of chose point to clipbaord
; Command "CZ"
(defun c:cz ()
(setq syselev (getvar 'elevation))
(setq sysosnapz (getvar 'osnapz))
(defun *error* (err) ; Make sure system variables are reset on error or escape
(setvar 'elevation syselev)
(setvar 'osnapz sysosnapz)
)
(setvar 'elevation 1e99); Set Z elevation really high to help filter non-zero snaps
(setvar 'osnapz 0) ; Make sure z elevation snap is on
(setq zp (rtos (caddr (getpoint "\nPick Z point: "))2 2))
(setvar 'elevation syselev); Reset Z elevation, now that we have our point
(setvar 'osnapz sysosnapz) ; Reset OSNAPZ
(if (eq zp "1.00E+99") (setq zp "")); if point is really high just return nothing
(princ zp)
(_SetClipBoardText zp); Hacky copy to clipoard command - lookup doslib if this ever breaks
(setq zp (atof zp)) ; Set zp to real for 'CAL command usage
(princ)
)
(defun _SetClipBoardText ( text / htmlfile result )
;;post by XShrimp at theswamp.org.
(vl-load-com)
(setq result
(vlax-invoke
(vlax-get
(vlax-get (setq htmlfile (vlax-create-object "htmlfile")) 'ParentWindow)
'ClipBoardData
)
'SetData"Text"text)
)
(vlax-release-object htmlfile)
text
) 为什么仍要将高程复制到剪贴板?似乎是不必要的额外步骤? 这两种例行程序都非常宝贵,有助于实现不同的目的。在注释新设计时,使用立面创建新的多重引线效果非常好。当现有设计已更改并且现有注释需要更新时,复制到剪贴板效果很好。
页:
[1]