乐筑天下

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

[编程交流] 距离最近Po的区块距离

[复制链接]

21

主题

146

帖子

127

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
106
发表于 2022-7-6 15:20:02 | 显示全部楼层 |阅读模式
正如标题所示,我正在寻找某种自动化程序,在那里我可以获得一个列表,详细说明从块到直线上最近点的距离。
 
更详细地说,基于我需要它的目的,请阅读以下内容。
 
通常,我们有一条铁路轨道或一段公路(既有或拟建,这实际上不是该计划的考虑因素),在轨道两侧任意距离分布着钻孔和试坑。
 
现在,工程师们要求我提出一种生成报告的方法,该报告可以显示每个钻孔或试坑等(这些将是图纸中的块)距轨道上最近点(CAD中的二维或三维多段线)的距离。
 
如果有人能提供这种功能,我可能会有其他更复杂的要求,我的公司可能愿意在以后的某个时间进行补偿。不过,无法保证未来的工作。我现在能做的就是表示我的感激。
回复

使用道具 举报

21

主题

146

帖子

127

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
106
发表于 2022-7-6 15:23:45 | 显示全部楼层
我设法为任何想四处嗅探的人找到了一个好榜样。
 
附图中有地形测量,顶部包含两条绿线,即铁路轨道。
 
红色符号(带两个三角形图案填充的圆形)是钻孔-从其中心到我们要测量的铁路轨道最近距离的块。这些块都在层上:建议-红色(以及它们的所有实体)。
 
理想情况下,我们需要一个程序,要求我们选择要从哪条线测量块,然后让每个块从其中心测量到该线上最近的点。
CADTutor。拉链
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 15:27:40 | 显示全部楼层
调整尺寸样式并分解块,包括测量平面:
 
  1. (defun c:pdis(/ cCurve cBlock dPt1 dPt2)
  2. (vl-load-com)
  3. (if
  4.    (and
  5.      (setq cCurve(entsel "\nSelect curve to measure > "))
  6.      (member(cdr(assoc 0(entget(car cCurve))))
  7.      '("LINE" "POLYLINE" "LWPOLYLINE" "SPLINE" "ARC" "CIRCLE" "ELLIPSE"))
  8.      ); end and
  9.      (while
  10.        (and
  11.   (setq cBlock(entsel "\nSelect block or Esc to Quit > "))
  12.   (=(cdr(assoc 0(entget(car cBlock)))) "INSERT")
  13.   ); end and
  14. (progn
  15.     (setq dPt1(cdr(assoc 10(entget(car cBlock))))
  16.           dPt2(vlax-curve-getClosestPointTo (car cCurve) dPt1))
  17.     (vl-cmdf "_.dimaligned" (trans dPt1 0 1) (trans dPt2 0 1) pause)
  18.   ); end progn
  19. (princ "\n<!> Empty selection or this isn't block <!> ")
  20. ); end while
  21.    (princ "\n<!> Empty selection or this isn't curve (line, polyline, etc.) <!> ")
  22.    ); end if
  23. (princ)
  24. ); end of c:pdis
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:31:08 | 显示全部楼层
嗨,阿斯米,
 
我看着这个问题,心里想。。。我该怎么做。
 
然后用一个漂亮的代码提供答案。
 
但我看了一下代码,看到您使用了这个函数:
 
vlax曲线getClosestPointTo
 
这似乎是一个非常方便的功能
 
但是,由于我不知道如何很好地使用Visual LISP,我不知道您是否首先需要使用:
 
vlax ename->vla对象
 
第一
 
为什么会这样?你什么时候要用上面的?
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 15:33:07 | 显示全部楼层
vlax曲线-函数与VLA对象的工作方式相同,与ENAME but demands(vl load com)的工作方式相同。
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 15:38:14 | 显示全部楼层
在普通AutoLISP中,需要更多的代码。
  1. ;=======================================================================
  2. ;    ClosePT.Lsp                                    Jan 08, 2009
  3. ;    Find Thge Closest Point From An INSERT to a PATH - 2D
  4. ;================== Start Program ======================================
  5. (princ "\nCopyright (C) 1990-2009, Fabricated Designs, Inc.")
  6. (princ "\nLoading ClosePT v1.0")
  7. (setq cpt_ nil lsp_file "ClosePT")
  8. ;++++++++++++ Set Modes & Error ++++++++++++++++++++++++++++++++++
  9. (defun cpt_smd ()
  10. (SetUndo)
  11. (setq olderr *error*
  12.      *error* (lambda (e)
  13.                (while (> (getvar "CMDACTIVE") 0)
  14.                       (command))
  15.                (and (/= e "quit / exit abort")
  16.                     (princ (strcat "\nError: *** " e " *** ")))
  17.                (and (= (logand (getvar "UNDOCTL")  8)
  18.                     (command "_.UNDO" "_END" "_.U"))
  19.                (cpt_rmd))
  20.       cpt_var '(("CMDECHO"   . 0) ("MENUECHO"   . 0)
  21.                ("MENUCTL"   . 0) ("MACROTRACE" . 0)
  22.                ("OSMODE"    . 0) ("SORTENTS"   . 119)
  23.                ("LUPREC"    . 2)
  24.                ("BLIPMODE"  . 0) ("EXPERT"     . 0)
  25.                ("SNAPMODE"  . 1) ("PLINEWID"   . 0)
  26.                ("ORTHOMODE" . 1) ("GRIDMODE"   . 0)
  27.                ("ELEVATION" . 0) ("THICKNESS"  . 0)
  28.                ("COORDS"    . 2) ("UCSICON"    . 1)
  29.                ("HIGHLIGHT" . 1) ("REGENMODE"  . 1)
  30.                ("CECOLOR"   . "BYLAYER")
  31.                ("CELTYPE"   . "BYLAYER")))
  32. (foreach v cpt_var
  33.   (and (getvar (car v))
  34.        (setq cpt_rst (cons (cons (car v) (getvar (car v))) cpt_rst))
  35.        (setvar (car v) (cdr v))))
  36. (princ (strcat (getvar "PLATFORM") " Release " (ver)))
  37. (princ))
  38. ;++++++++++++ Return Modes & Error +++++++++++++++++++++++++++++++
  39. (defun cpt_rmd ()
  40. (setq *error* olderr)
  41. (foreach v cpt_rst (setvar (car v) (cdr v)))
  42. (command "_.UNDO" "_END")
  43. (prin1))
  44. ;++++++++++++ Set And Start An Undo Group ++++++++++++++++++++++++
  45. (defun SetUndo ()
  46. (and (zerop (getvar "UNDOCTL"))
  47.      (command "_.UNDO" "_ALL"))
  48. (and (= (logand (getvar "UNDOCTL") 2) 2)
  49.      (command "_.UNDO" "_CONTROL" "_ALL"))
  50. (and (= (logand (getvar "UNDOCTL")  8)
  51.      (command "_.UNDO" "_END"))
  52. (command "_.UNDO" "_GROUP"))
  53. ;;;++++++++++ 2D Is Point On ARC ++++++++++++++++++++++++++++++++++++++
  54. ;;;ARG -> ARC_Ename  TestPoint  Fuzz
  55. ;;;RET -> T nil
  56. (defun is_pt_on_arc (en tp fz / ed ce ra sa ea ta)
  57.   (setq ed (entget en)
  58.         ce (p2d (cdr (assoc 10 ed)))
  59.         ra (cdr (assoc 40 ed))
  60.         sa (cdr (assoc 50 ed))
  61.         ea (cdr (assoc 51 ed))
  62.         ta (angle ce tp)
  63.         tp (p2d tp))
  64.   (and (equal (distance ce tp) ra fz)
  65.        (if (> sa ea)
  66.            (or (>= ta sa)
  67.                (<= ta ea))
  68.            (and (<= ta ea)
  69.                 (>= ta sa)))))
  70. ;;;++++++++++ 2D Intersections Of Line & Arc ( Circle ) ++++++++++++++++
  71. ;;;ARG -> LINE_ename ARC_ename ( CIRCLE or ARC )
  72. ;;;RET -> nil or List_Of_Points
  73. ;;;ERROR = None
  74. (defun inter_line_arc (l10 l11 arc / a10 rad ip1 ip2)
  75. (setq l10 (p2d l10)
  76.      l11 (p2d l11)
  77.      a10 (p2d (cdr (assoc 10 (entget arc))))
  78.      rad (cdr (assoc 40 (entget arc)))
  79.      ip1 (polar a10 (angle l10 l11) rad)
  80.      ip2 (polar a10 (angle l11 l10) rad))
  81. (cond ((is_pt_on_arc arc ip1 1e-
  82.       ip1)
  83.      ((is_pt_on_arc arc ip2 1e-
  84.       ip2)))
  85. ;;;FIND CLOSEST POINT TO LINE FORM GIVEN POINT
  86. ;;;ARG -> POINT LINE_ENAME
  87. ;;;RET -> POINT
  88. (defun find_near_line (p l / ld l10 l11 tp)
  89. (setq ld (entget l)
  90.        l10 (p2d (cdr (assoc 10 ld)))
  91.        l11 (p2d (cdr (assoc 11 ld)))
  92.          p (p2d p))
  93. (cond ((setq tp (inters l10 l11
  94.                          p (polar p (+ (angle l10 l11) (* pi 0.5)) 1))))
  95.        ((if (< (distance p l10)
  96.                (distance p l11))
  97.             (setq tp l10)
  98.             (setq tp l11))))
  99. tp)
  100. ;************ Main Program ***************************************
  101. (defun cpt_ (/ olderr cpt_var cpt_rst ss bn bp ls pn pd pf fe fd pc ts
  102.              cp np p2d)
  103. (cpt_smd)
  104. (setq p2d (lambda (p) (list (car p) (cadr p))))
  105. (while (or (not ss)
  106.             (> (sslength ss) 1))
  107.         (princ "\nSelect Block To Test:   ")
  108.         (setq ss (ssget (list (cons 0 "INSERT")
  109.                               (if (getvar "CTAB")
  110.                                   (cons 410 (getvar "CTAB"))
  111.                                   (cons 67 (- 1 (getvar "TILEMODE"))))))))
  112. (setq bn (ssname ss 0)
  113.        bp (p2d (trans (cdr (assoc 10 (entget bn))) bn 0)))
  114. (while (or (not ls)
  115.             (> (sslength ls) 1))
  116.         (princ "\nSelect Path To Test:   ")
  117.         (setq ls (ssget (list (cons 0 "LINE,*POLYLINE")
  118.                               (if (getvar "CTAB")
  119.                                   (cons 410 (getvar "CTAB"))
  120.                                   (cons 67 (- 1 (getvar "TILEMODE")))))))
  121.         (and ls
  122.           (setq pn (ssname ls 0)
  123.                 pd (entget pn)
  124.                 pf (cdr (assoc 70 pd)))
  125.           (= "POLYLINE" (cdr (assoc 0 pd)))
  126.           (> pf 15)
  127.           (princ "\nPOLYLINE MESHES CANNOT BE USED")
  128.           (setq ls nil)))
  129. (command "_.COPY" pn "" '(0 0 0) '(0 0 0))
  130. (setq pc (entlast) fe pc)
  131. (command "_.EXPLODE" pc)
  132. (setq fe (entnext fe)
  133.        ts (ssadd))
  134. (while fe
  135.       (ssadd fe ts)
  136.       (setq fd (entget fe))
  137.       (cond ((= "LINE" (cdr (assoc 0 fd)))
  138.              (setq np (find_near_line bp fe)))
  139.             ((= "ARC" (cdr (assoc 0 fd)))
  140.              (setq np (inter_line_arc bp (cdr (assoc 10 fd)) fe))))
  141.       (cond ((not np))
  142.             ((not cp)
  143.              (setq cp np))
  144.             (T
  145.              (setq cp (if (> (distance cp bp)
  146.                              (distance np bp))
  147.                        np cp))))
  148.       (setq fe (entnext fe)))
  149. (command "_.ERASE" pc ts "")
  150. (redraw)
  151. (princ "\nClosest Point in 2D From Block To Path Is ")
  152. (prin1 cp)
  153. (cpt_rmd))
  154. ;************ Load Program ***************************************
  155. (defun C:ClosePT () (cpt_))
  156. (if cpt_ (princ "\nClosePT Loaded\n"))
  157. (prin1)
  158. ;|================== End Program =======================================
原样-David
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:41:23 | 显示全部楼层
天哪,大卫,我明白他们为什么引入VL!。。。
 
很好的代码-你已经有了,还是刚刚键入了?。。。
 
 
阿斯米,谢谢你的建议——我知道我使用的每个vlax曲线函数都只需要一个ename(在vl load com之后),并且我不必经历尝试转换它的过程,我安全吗。。
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 15:45:24 | 显示全部楼层
>大卫·本特尔
 
为什么这个萨满要和u一起跳舞。爆炸,_。如果存在vlax curve GetClosestPointTo和vlax curve GetClosestPointToProjection(用于3D)函数,则撤消?
 
我尊重你作为程序员,也尊重LISP作为语言,但有点不理解你对ActiveX编程的厌恶
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:46:13 | 显示全部楼层
 
哈哈,如果可能的话,我尽量避免活动X。。。。我很害怕
回复

使用道具 举报

21

主题

146

帖子

127

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
106
发表于 2022-7-6 15:51:37 | 显示全部楼层
阿斯米,你能详细解释一下你的最后一篇文章吗,关于我需要如何使用LISP例程以及它到底做什么?
 
所示的示例图具有用于官方用途的各种调查比例和化身的昏暗样式和相关用具。
 
为每一位对此帖子做出贡献的人干杯。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-4 19:34 , Processed in 0.538618 second(s), 72 queries .

© 2020-2025 乐筑天下

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