乐筑天下

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

[编程交流] 最近的点形式 mtext 到 pline,但水平

[复制链接]

9

主题

17

帖子

21

银币

初来乍到

Rank: 1

铜币
33
发表于 2022-9-23 16:57:13 | 显示全部楼层 |阅读模式
我已经尝试过各种路线复杂的路由程序,但现在即使在你的帮助下我也很难弄清楚。
以为我会从更简单的事情开始。假设我们有很多垂直或倾斜的折线,包括多行文字。我希望 lisp 找到与最近的左右折线的交点,但只能在水平线上,并将这些点命名为左折线的“mtext + l1”和右折线的“mtext + r1”。
很高兴看到任何帮助,尤其是在水平搜索最近的点时。
下面是图片中问题的描述。

起始情况:
         175717ua7zx0lm7mi5mbgo.png
         
         
运行 lisp 后以红色创建点:

         175718k2p7bbm8bummgtgm.png
回复

使用道具 举报

8

主题

95

帖子

117

银币

初来乍到

Rank: 1

铜币
26
发表于 2022-9-24 09:28:09 | 显示全部楼层
绘制一条水平 XLine,查看它与多段线相交的位置,现在寻找那些与多段线相交点的最接近的 X 值。
删除临时 XLINE。
  1. (vl-load-com)
  2. ;;
  3. ;; draw a XLINE
  4. (defun drawxLine (pt vec)
  5. (entmakex (list (cons 0 "XLINE")
  6.                  (cons 100 "AcDbEntity")
  7.                  (cons 100 "AcDbXline")
  8.                  (cons 10 pt)
  9.                  (cons 11 vec))))
  10. ;; draw MText                                 
  11. (defun drawM-Text (pt str)
  12. (entmakex (list (cons 0 "MTEXT")         
  13.                  (cons 100 "AcDbEntity")
  14.                  (cons 100 "AcDbMText")
  15.                  (cons 10 pt)
  16.                  (cons 1 str))))
  17.                                  
  18. (defun drawLine (p1 p2)
  19. (entmakex (list (cons 0 "LINE")
  20.                  (cons 10 p1)
  21.                  (cons 11 p2))))
  22.                                  
  23. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  24. ;; Intersections  -  Lee Mac
  25. ;;
  26. ;; Returns a list of all points of intersection between two objects
  27. ;; for the given intersection mode.
  28. ;; ob1,ob2 - [vla] VLA-Objects
  29. ;;     mod - [int] acextendoption enum of intersectwith method
  30.         ;; acextendnone               Do not extend either object
  31.         ;; acextendthisentity         Extend obj1 to meet obj2
  32.         ;; acextendotherentity         Extend obj2 to meet obj1
  33.         ;; acextendboth               Extend both objects
  34. (defun LM:intersections ( ob1 ob2 mod / lst rtn )
  35.     (if (and (vlax-method-applicable-p ob1 'intersectwith)
  36.              (vlax-method-applicable-p ob2 'intersectwith)
  37.              (setq lst (vlax-invoke ob1 'intersectwith ob2 mod))
  38.         )
  39.         (repeat (/ (length lst) 3)
  40.             (setq rtn (cons (list (car lst) (cadr lst) (caddr lst)) rtn)
  41.                   lst (cdddr lst)
  42.             )
  43.         )
  44.     )
  45.     (reverse rtn)
  46. )
  47. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  48. (defun c:npp ( / txt plines xline pt obj2 ins insx insx_sorted xl xr str)
  49.         (princ "\nSelect ploylines")
  50.         (setq plines (ssget (list (cons 0 "LINE,LWPOLYLINE,POLYLINE"))))
  51.         (setq txt (entsel "\nSelect Text object: "))
  52.         (setq str (cdr (assoc 1 (entget (car txt)))))
  53.         (setq pt  (cdr (assoc 10 (entget (car txt)))))
  54.        
  55.         ;; draw a horizontal XLINE
  56.         (setq xline (drawxLine pt (list 1.0 0.0)))  ;; (list 1.0 0.0) draws to the right, (list 0.0 1.0) draws up thus vertical, ...
  57.        
  58.         ;; now look for intersect points of the XLINE with the polylines
  59.         (setq insx (list))                ;; list of intersect points.  Only the X value.
  60.         (setq i 0)
  61.         (repeat (sslength plines)
  62.                 (setq obj2 (ssname plines i))
  63.                 (setq ins (LM:intersections (vlax-ename->vla-object xline) (vlax-ename->vla-object obj2) acextendnone))
  64.                 ;; if there are intersect points, add the x-value to the list
  65.                 (foreach a ins
  66.                         (setq insx (append insx (list (nth 0 a) )))
  67.                 )
  68.                 (setq i (+ i 1))
  69.         )
  70.        
  71.         ;; we no longer need the XLINE, we delete it
  72.         (entdel xline)
  73.        
  74.         ;; sort the insx values from left to right
  75.         (setq insx_sorted (vl-sort insx '<))
  76.        
  77.         ;;(princ insx_sorted)
  78.         ;; now we go looking for xl (left of the text) and xr (right of the text)
  79.         (setq xl nil)
  80.         (setq xr nil)
  81.        
  82.         (foreach a insx_sorted
  83.                 (if (< a (nth 0 pt))        ;; as long as the insert point is to the left, we'll replace xl
  84.                         (setq xl a)
  85.                 )
  86.                 (if (and (not xr) (> a (nth 0 pt)))        ;; the first insert point the right is the closest one
  87.                         (setq xr a)
  88.                 )
  89.         )
  90.        
  91.         ;;(princ "\nLeft: ")
  92.         ;;(princ xl)
  93.         ;;(princ " - Right: ")
  94.         ;;(princ xr)
  95.         ;;(princ )
  96.        
  97.         ;; draw line
  98.         ;; we add the Y value of the Text object to get a point
  99.         (drawLine (list xl (nth 1 pt)) (list xr (nth 1 pt)))
  100.         ;; draw Mtexts
  101.         (drawM-Text (list xl (nth 1 pt)) (strcat str " l1"))       
  102.         (drawM-Text (list xr (nth 1 pt)) (strcat str " r1"))
  103.        
  104. )


回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2024-11-22 01:36 , Processed in 0.204237 second(s), 59 queries .

© 2020-2024 乐筑天下

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