嗨,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
- )
|