乐筑天下

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

[编程交流] 遵循路径

[复制链接]

6

主题

48

帖子

44

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-6 12:27:31 | 显示全部楼层 |阅读模式
有人请把我从痛苦中解救出来!我已经为此奋斗了两天。
我正在编写一个程序来执行以下操作:
1.)选择块
2.)选取(2)个位置点
3.)选择路径
4)给出步距
在给出这些信息后,我希望程序以步进距离沿着给定路径步进块。
我把一切都搞定了,只有一个例外。如何计算直线和圆弧之间的过渡?我的大脑只是把公式写在代码里。我知道这是可能的。
我附上了一张图片来帮助澄清。位置3就是问题所在。
 
提前感谢您,
布瑞恩
132735hr9kuqxfkkf0rqia.jpg
回复

使用道具 举报

4

主题

940

帖子

961

银币

初来乍到

Rank: 1

铜币
12
发表于 2022-7-6 12:34:15 | 显示全部楼层
看起来Measure命令可以完成您想要完成的任务。
回复

使用道具 举报

6

主题

48

帖子

44

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-6 12:39:18 | 显示全部楼层
 
我同意,但我想让程序逐步完成动作。我有一个可以这样做的程序,但我丢了,找不到该程序的副本。我在第12版中就这么做了。
 
非常感谢。
布瑞恩
回复

使用道具 举报

9

主题

383

帖子

82

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
355
发表于 2022-7-6 12:45:44 | 显示全部楼层
 
什么是定位点?那些标有红色和蓝色的?如果是这样,“measure”命令将不能完全满足您的需要。
回复

使用道具 举报

18

主题

222

帖子

51

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
260
发表于 2022-7-6 12:54:41 | 显示全部楼层
看看vlax曲线函数,它会给你你需要的
 
顺便说一句,vlax曲线-*不仅仅适用于圆弧
回复

使用道具 举报

ssg

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 12:56:24 | 显示全部楼层
 
在一般情况下,这是非常困难的。但如果你把它限制在一些特定的条件下(曲线的形状和尺寸),我认为我们可以解决它。
你能用完整的元素(曲线和块)发布你的绘图文件吗?
回复

使用道具 举报

6

主题

48

帖子

44

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-6 13:04:14 | 显示全部楼层
红色和蓝色点必须始终与路径保持接触。它们代表输送机上的手推车,相距固定。(200.0mm)
 
我将检查vlax曲线函数。我以前没有用过。
 
我附上了一个例子的副本。我希望这有帮助。今天晚些时候,在我清理了一下程序后,我会发布一份程序的副本。
 
非常感谢。
布瑞恩
路径图纸
回复

使用道具 举报

0

主题

269

帖子

279

银币

限制会员

铜币
-4
发表于 2022-7-6 13:07:28 | 显示全部楼层
我认为,试图通过一个过渡来计算这一点将是一场噩梦。iff线与弧或路径不相切的是样条曲线,或。。。。
 
所以我建议使用一种类似于手动操作的方法。这将是在小车的前部绘制一个圆,R=200,它与轨道相交的地方是小车的后部。该例程将放置一个圆,用函数“vla intersectwith”确定轨道的2个交点。这将为您提供一个或两个交点。如果有2个点,则找到沿曲线最开始处的一个点(vlax曲线函数之一)。
回复

使用道具 举报

9

主题

383

帖子

82

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
355
发表于 2022-7-6 13:11:58 | 显示全部楼层
试试“Path.dwg”
将块插入点作为“位置点1”
它相当慢,有点不准确(取决于模糊变量),没有错误捕捉
  1. (vl-load-com)
  2. (defun test (/
  3.      Dist
  4.      EndDist
  5.      EndPoint
  6.      Fuzz
  7.      LineLength
  8.      BlockObj
  9.      PathObj
  10.      StartPoint
  11.      Step
  12.      Point1
  13.      Point2
  14.      MSpaceObj
  15.     )
  16. (setq MSpaceObj (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))))
  17. (princ "\nSelect BLOCK: ")
  18. (setq        BlockObj   (vlax-ename->vla-object (car (entsel)))
  19. Point1           (vlax-safearray->list
  20.              (vlax-variant-value (vla-get-InsertionPoint BlockObj))
  21.            )
  22. Point2           (getpoint Point1 "\nPick location point 2: ")
  23. LineLength (distance Point1 Point2)
  24. )
  25. (princ "\nSelect PATH: ")
  26. (setq PathObj (vlax-ename->vla-object (car (entsel))))
  27. (setq EndDist (vlax-curve-getDistAtParam PathObj (vlax-curve-getEndParam PathObj)))
  28. (setq        Step (getreal "\nEnter stepping distance: ")
  29. Fuzz 0.01
  30. Dist 0.0
  31. )
  32. (while (< Dist EndDist)
  33.    (setq StartPoint (vlax-curve-getPointAtDist PathObj Dist))
  34.    (while (and        (< (setq Dist (+ Dist Fuzz)) EndDist)
  35.         (< (distance StartPoint
  36.                      (setq EndPoint (vlax-curve-getPointAtDist PathObj Dist))
  37.            )
  38.            LineLength
  39.         )
  40.    )
  41.    )
  42.    (if        (< Dist EndDist)
  43.      (progn (vla-InsertBlock
  44.        MSpaceObj
  45.        (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbDouble '(0 . 2)) StartPoint))
  46.        (vla-Get-Name BlockObj)
  47.        1.0
  48.        1.0
  49.        1.0
  50.        (angle StartPoint EndPoint)
  51.      )
  52.      (setq Dist (+ Dist Step))
  53.      )
  54.    )
  55. )
  56. (vlax-release-object PathObj)
  57. (vlax-release-object BlockObj)
  58. (vlax-release-object MSpaceObj)
  59. (princ)
  60. )
回复

使用道具 举报

ssg

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 13:19:40 | 显示全部楼层
 
我同意卡尔的观点。这不是专家方法,但给出了准确的结果。
这是代码:
  1. ;;;===========================================
  2. ;;;Move objects along curve path
  3. ;;;Written by ssg - October 25th, 2007
  4. ;;;===========================================
  5. ;;;-------------------------------------------------------------------------------
  6. (defun rtd(x) (/ (* x 180) pi) ) ;;;Change radian to degree
  7. ;;;-------------------------------------------------------------------------------
  8. (defun Collect(e / ent2 SS1 SS2) ;;;Selection set from e to entlast
  9. (setq SS1 (ssadd))
  10. (ssadd e SS1)
  11. (while (setq ent2 (entnext e))
  12.    (ssadd ent2 SS1)
  13.    (setq e ent2)
  14. )
  15. (setq SS2 SS1)
  16. )
  17. ;;;-------------------------------------------------------------------------------
  18. (defun Collect1(e / ss)
  19. ;;;Selection set after e to entlast. If e nil, select from fist entity of drawing.
  20. (if (= e nil) (setq ss (collect (entnext)))
  21.    (progn (setq ss (collect e)) (ssdel e ss))
  22. )
  23. )
  24. ;;;-------------------------------------------------------------------------------
  25. (defun ints (e1 e2 / ob1 ob2 V L1 L2)
  26. ;;;Get intersections of e1, e2. Return LIST of points
  27. (setq
  28.    ob1 (vlax-ename->vla-object e1)
  29.    ob2 (vlax-ename->vla-object e2)
  30. )
  31. (setq V (vlax-variant-value (vla-IntersectWith ob1 ob2 acExtendNone)))
  32. (if (/= (vlax-safearray-get-u-bound V 1) -1)
  33.    (progn
  34.          (setq L1 (vlax-safearray->list V) L2 nil)
  35.          (while L1
  36. (setq L2 (append L2 (list (list (car L1) (cadr L1) (caddr L1)))))
  37. (repeat 3 (setq L1 (cdr L1)))
  38.          )
  39.    )
  40.    (setq L2 nil)
  41. )
  42. L2
  43. )
  44. ;;;------------------------------------------------------------------------------
  45. (defun getnearP (p p1 p2) ;;;Get nearer point by p. Return p1 or p2
  46. (if (<= (distance p p1) (distance p p2)) p1 p2)
  47. )
  48. ;;;------------------------------------------------------------------------------
  49. (defun getpL(e st / el ss i et p pL)
  50. ;;;Get list of points by measure command, specified by curve e and step st
  51. (setq el (entlast))
  52. (command "measure" e st )
  53. (setq ss (collect1 el) i 0)
  54. (repeat (sslength ss)
  55.    (setq
  56.        et (ssname ss i)
  57.        p (cdr (assoc 10 (entget et)))
  58.        pL (append pL (list p))
  59.        i (1+ i)
  60.    )
  61. )
  62. (command "erase" ss "")
  63. pL
  64. )
  65. ;;;------------------------------------------------------------------------------
  66. (defun MoveStep()
  67. (repeat (length pL)
  68.    (setq p3 (nth j pL))
  69.    (setq pa3 (vlax-curve-getParamAtPoint cur p3))
  70.    (if (>= (* flag pa3) (* flag pa1))
  71.        (progn
  72.            (command "circle" p3 r)
  73.            (setq ipL (ints cur (entlast)))
  74.            (if (> (length ipL) 1)
  75.                (setq p4 (getnearP p1 (car ipL) (cadr ipL)))
  76.                (setq p4 (car ipL))
  77.            )
  78.            (command "erase" (entlast) "")
  79.            (command "move" ob "" p1 p3)
  80.            (command "rotate" ob "" p3 (rtd (- (angle p3 p4) ag)))
  81.            (setq p1 p3 ag (angle p3 p4))
  82.            (command "delay" 100)
  83.        )
  84.    )
  85.    (setq j (1+ j))
  86. )
  87. )
  88. ;;;===================MAIN====================
  89. (defun C:MST( / ob p1 p2 cur pa1 pa2 st pL r ag j flag oldos p3 pa3 ipL p4)
  90. (vl-load-com)
  91. (prompt "Select objects will be moved...")
  92. (setq
  93.    ob (ssget)
  94.    p1 (getpoint "\nFirst point (front):")
  95.    p2 (getpoint "\nSecond point (back):")
  96.    cur (car (entsel "\nSelect path:"))
  97.    pa1 (vlax-curve-getParamAtPoint cur p1)
  98.    pa2 (vlax-curve-getParamAtPoint cur p2)
  99. )
  100. (if (not (and pa1 pa2)) (progn (alert "1 or 2 points not on the path!") (exit)))
  101. (setq
  102.    st (getreal "\nStep:")
  103.    pL (getpL cur st)
  104.    r (distance p1 p2)
  105.    ag (angle p1 p2)
  106.    j 0
  107. )
  108. (if (> pa2 pa1) (progn (setq pL (reverse pL)) (setq flag -1)) (setq flag 1))
  109. (setq oldos (getvar "osmode"))
  110. (setvar "osmode" 0)
  111. (MoveStep)
  112. (setvar "osmode" oldos)
  113. (princ)
  114. )
  115. ;;;===========================================
  116. ;;;NOTE
  117. ;;;Path is any types: line, pline, polygon, spline, circle, arc
  118. ;;;Objects: allow to select many objects that are any types (not block only) and lying anywhere
  119. ;;;But "First point" and "Second point" must be on the path
  120. ;;;I have tested with many cases, didn't find errors
  121. ;;;Positions of objects on the path are exact diametrically!
  122. ;;;But I think maybe it don't run correctly with some extraordinary curves
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-5 06:16 , Processed in 0.409698 second(s), 75 queries .

© 2020-2025 乐筑天下

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