乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 4|回复: 4

[编程交流] OSNAP过滤器所有非零Z El

[复制链接]

2

主题

5

帖子

3

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 15:49:09 | 显示全部楼层 |阅读模式
大家好,
 
一个小背景:我在一个民用土地开发办公室工作,那里的要素线被大量用于我们的设计。我们有一些很棒的C3D样式和标签,用于注释这些要素线,但由于C3D标签的限制,它们在绘图方面还有很多需要改进的地方。因此,我们主要使用多重引线进行设计的实际注释,并有一组非打印C3D标签来帮助我们进行注释。这导致大量数字从标签复制到多重引线。
 
最后,我拼凑了一个lisp例程,允许用户选择一个点,并将该点的z高程复制到剪贴板,以便将其粘贴到多重引线中。lisp例程工作得很好,完成了任务,但是我发现自己不得不经常使用tab键在线之间循环,直到可以在要素线上获得捕捉点。这就引出了我的问题:
 
在调用我的例程时,是否有方法过滤掉所有非零z高程捕捉?
 
例如我有一个显示所有路缘线的外部参照,最上面还有一个包含所有要素线路缘设计高程的外部参照,如果我调用命令,使用最近的捕捉并将其移动到路缘线,我可以看到坐标在零的Z高程和要素线高程之间闪烁,具体取决于我移动鼠标的位置。有没有办法过滤掉那些捕捉到的零z高程?
 
我不是最懂Lisp程序的人,但我愿意学习!希望有人能给我指出正确的方向。
 
以下是lisp供参考:
 
  1. ; Copy Z elevaiton of chose point to clipbaord
  2. ; Command "CZ"
  3. (defun c:cz ()
  4. (setq zp (rtos (caddr (getpoint "\nPick Z point: "))2 2))
  5. (princ zp)
  6. (_SetClipBoardText zp)
  7. (princ)
  8. )
  9. (defun _SetClipBoardText ( text / htmlfile result )
  10.    ;;  Caller's sole responsibility is to pass a
  11.    ;;  text string. Anything else? Pie in face.
  12.    ;;  Attribution: Reformatted version of
  13.    ;;  post by XShrimp at theswamp.org.
  14.    ;;  See http://tinyurl.com/2ngf4r.
  15. (vl-load-com)
  16.    (setq result
  17.        (vlax-invoke
  18.            (vlax-get
  19.                (vlax-get (setq htmlfile (vlax-create-object "htmlfile")) 'ParentWindow)
  20.               'ClipBoardData
  21.            )
  22.           'SetData  "Text"  text)
  23.    )
  24.    (vlax-release-object htmlfile)
  25.    text
  26. )
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 16:11:02 | 显示全部楼层
也许这会给你一些想法:
  1. (defun c:foo (/ _dxf e el o)
  2. (defun _dxf (code ename) (cdr (assoc code (entget ename))))
  3. (cond        ((null (setq e (nentsel))) (print "Bye.."))
  4. ((null (setq el (_dxf 38 (car e)))) (print "No elevation found.."))
  5. ((= 0.0 el) (print "Zero elevation.."))
  6. (t
  7. (command ".mleader" (cadr e) (getpoint (cadr e)) "")
  8. (if (and (setq o (entlast))
  9.           (= "AcDbMLeader" (vla-get-objectname (setq o (vlax-ename->vla-object o))))
  10.      )
  11.    (vla-put-textstring o (rtos el 2 2))
  12. )
  13. )
  14. )
  15. (princ)
  16. )
回复

使用道具 举报

2

主题

5

帖子

3

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 16:24:33 | 显示全部楼层
嗨,Ronjop,
 
这是一段有趣的代码。我以前玩过类似的东西,不久前把它拼凑起来:
 
  1. (defun c:melev (/ el loc z)
  2. (if (and (setq el (getpoint "\n Specify leader arrowhead location :"))
  3.           (setq loc (getpoint el "\n Specify leader landing location :"))
  4.           )  
  5.      (command "_.mleader" "_non" (trans el 1 0) "_non" (trans loc 1 0)(rtos (caddr el) 2 2))
  6.    (princ)
  7.    )
  8. (princ)
  9. )

 
 
在过滤非零Z高程捕捉点方面,我找不到太多,但我确实发现,显然设置系统高程变量使autocad更喜欢捕捉到具有Z高程的点,而不是那些没有Z高程的点。在我的代码中,我只需在命令处于活动状态时将高程设置为1e99——看起来有点像黑客,但现在它完成了这项工作。
 
我猜想,如果我真的想正确地执行此操作,则必须使用某种while循环来监视正在捕捉的内容。我在leemac的网站上看到了一些奇特的代码,用于模拟OSNAP,并在命令激活时在光标旁边连续显示坐标文本。也许有一天我会考虑合并这样的东西,现在这一切似乎有点让我不知所措。
 
现在,如果有人有一些建议,这里是我昨天代码的修改版本:
 
  1. ; Copy Z elevaiton of chose point to clipbaord
  2. ; Command "CZ"
  3. (defun c:cz ()
  4. (setq syselev (getvar 'elevation))
  5. (setq sysosnapz (getvar 'osnapz))
  6. (defun *error* (err) ; Make sure system variables are reset on error or escape
  7.         (setvar 'elevation syselev)  
  8.         (setvar 'osnapz sysosnapz)
  9. )
  10. (setvar 'elevation 1e99)  ; Set Z elevation really high to help filter non-zero snaps
  11. (setvar 'osnapz 0) ; Make sure z elevation snap is on
  12. (setq zp (rtos (caddr (getpoint "\nPick Z point: "))2 2))
  13. (setvar 'elevation syselev)  ; Reset Z elevation, now that we have our point
  14. (setvar 'osnapz sysosnapz) ; Reset OSNAPZ
  15. (if (eq zp "1.00E+99") (setq zp ""))  ; if point is really high just return nothing
  16. (princ zp)
  17. (_SetClipBoardText zp)  ; Hacky copy to clipoard command - lookup doslib if this ever breaks
  18. (setq zp (atof zp)) ; Set zp to real for 'CAL command usage
  19. (princ)
  20. )
  21. (defun _SetClipBoardText ( text / htmlfile result )
  22.    ;;  post by XShrimp at theswamp.org.
  23. (vl-load-com)
  24.    (setq result
  25.        (vlax-invoke
  26.            (vlax-get
  27.                (vlax-get (setq htmlfile (vlax-create-object "htmlfile")) 'ParentWindow)
  28.               'ClipBoardData
  29.            )
  30.           'SetData  "Text"  text)
  31.    )
  32.    (vlax-release-object htmlfile)
  33.    text
  34. )
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 16:39:48 | 显示全部楼层
为什么仍要将高程复制到剪贴板?似乎是不必要的额外步骤?
回复

使用道具 举报

2

主题

5

帖子

3

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 17:03:46 | 显示全部楼层
这两种例行程序都非常宝贵,有助于实现不同的目的。在注释新设计时,使用立面创建新的多重引线效果非常好。当现有设计已更改并且现有注释需要更新时,复制到剪贴板效果很好。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-14 13:06 , Processed in 0.956069 second(s), 62 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表