乐筑天下

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

[编程交流] 查找特定点

[复制链接]

2

主题

5

帖子

3

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 21:43:24 | 显示全部楼层 |阅读模式
我需要使用VBA找到多段线内圆弧特定点的坐标。我不确定这个点叫什么,但基本上是两条线的顶点,如果使用fillet命令,将创建多段线中显示的圆弧。我附上了一张照片,显示我在寻找什么。
224330jcduzumglgvnhzvl.jpg
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 22:01:02 | 显示全部楼层
IP交点,无代码而非lisp vba方法。net all有一种方法可以计算出你选择的pline的哪一段,所以简单来说,你可以画两条新的线,并计算出交点,然后删除两条线,你也可以使用光线线,因此实际上不存在。旧的lisp INTERS命令支持四点相交(INTERS p1 p2 p3 p4)解决方案v的vl instersectwith,该解决方案需要两个对象。
 
因此,如果有人不尽快回答,请搜索VBA pline段等。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 22:10:28 | 显示全部楼层
有时发现这是在lisp中,但很容易转换为VBA
 
在代码中,不检查是否拾取了半径或直线。line命令是为了让您可以看到结果。
 
它并不完美,需要更多的时间,有问题的半径是最后一段,但关闭。
 
  1. ; Intersection point of plines where radius exists
  2. ; By Alan H June 2019
  3. (defun PSN (plsel / )
  4.   (1+
  5.           (fix
  6.             (vlax-curve-getParamAtPoint (car plsel)
  7.               (osnap (cadr plsel) "_nea")
  8.             )
  9.           )
  10.         )
  11. (defun ah:IPP (  /  pt1 pt2 pt3 pt4 pt5 seg1 seg2 plent)
  12. (setq plent (entsel "Select Polyline Radius"))
  13. (setq seg1 (- (psn plent) 1))
  14. (setq seg2 (+ seg1 2))
  15. (if plent (setq co-ord (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (car plent))))))
  16. (if (> seg2 (length co-ord))(setq seg2 1))
  17. (setq pt1 (nth (1- seg1) co-ord))
  18. (setq pt2 (nth  seg1 co-ord))
  19. (setq pt3 (nth (1- seg2) co-ord))
  20. (setq pt4 (nth  seg2 co-ord))
  21. (if (= pt4 nil)(setq pt4 (nth 0 co-ord)))
  22. (setq pt5 (inters pt1 pt2 pt3 pt4 nil))
  23. (command "line" pt5 (list 0 0) "")
  24. (princ)
  25. )
  26. (ah:IPP)
回复

使用道具 举报

2

主题

5

帖子

3

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 22:21:59 | 显示全部楼层
谢谢你,比格尔。这似乎对B点有效,但对其他两点无效。我想换个方向,但不确定怎么做。有没有办法拉动多段线内所有直线的交点?所以,基本上忽略了所有的弧。但我仍然需要保持多段线不变。
回复

使用道具 举报

lrm

1

主题

257

帖子

282

银币

限制会员

铜币
-13
发表于 2022-7-6 22:31:57 | 显示全部楼层
这里有一个简单的过程,您可以手动拾取弧段的起点、终点和中心,以找到交点。将osnap设置为end和cen时使用它。您可以调整该过程以处理多段线的所有弧段。
 
  1. (defun c:AV (/ p1 p2 p3 p4 p ang osm)
  2.   (setq        p1   (getpoint "\nSelect arc beginning.")
  3.         p2   (getpoint p1 "\nSelect arc end.")
  4.         pctr (getpoint p2 "\nSelect arc center.")
  5.         ang  (angle pctr p1)
  6.         p3   (polar p1 (+ ang (/ pi 2.)) 10)
  7.         ang  (angle pctr p2)
  8.         p4   (polar p2 (+ ang (/ pi 2.)) 10)
  9.         p    (inters p1 p3 p2 p4 nil)
  10.   )
  11.   (setq osm (getvar "osmode"))
  12.   (command "_line" pctr p "")
  13.   (setvar "osmode" osm)
  14.   (princ)
  15. )
回复

使用道具 举报

2

主题

5

帖子

3

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 22:41:11 | 显示全部楼层
谢谢Irm。它工作得很好!不过,我在适应VBA时遇到了一些问题。主要是方程的“角度”和“极性”部分。你知道如何将其适应VBA吗?
回复

使用道具 举报

lrm

1

主题

257

帖子

282

银币

限制会员

铜币
-13
发表于 2022-7-6 22:51:20 | 显示全部楼层
我没有访问AutoCAD/VBA的权限,但使用Excel/VBA编写了以下内容,您可以将其应用于AutoCAD/VBA。
 
我使用了一些向量代数(即叉积)而不是tri来确定圆弧与径向线的垂直线,因为它避免了垂直线(斜率=0)的潜在问题。请注意,对向180°的弧将导致错误,因为到弧端点的切线是平行的,因此不相交。
  1. Sub ArcVertex()
  2. Range("B2:b2").Select
  3. p1x = ActiveCell.Value
  4. ActiveCell.Offset(0, 1).Select
  5. p1y = ActiveCell.Value
  6. ActiveCell.Offset(1, -1).Select
  7. p2x = ActiveCell.Value
  8. ActiveCell.Offset(0, 1).Select
  9. p2y = ActiveCell.Value
  10. ActiveCell.Offset(1, -1).Select
  11. pcenx = ActiveCell.Value
  12. ActiveCell.Offset(0, 1).Select
  13. pceny = ActiveCell.Value
  14. Call cross(pcenx - p1x, pceny - p1y, 0, 0, 0, 1, p3x, p3y, p3z)
  15. p3x = p3x + p1x
  16. p3y = p3y + p1y
  17. Call cross(pcenx - p2x, pceny - p2y, 0, 0, 0, 1, p4x, p4y, p4z)
  18. p4x = p4x + p2x
  19. p4y = p4y + p2y
  20. Range("B6:B6").Select
  21. ActiveCell.Value = p3x
  22. ActiveCell.Offset(0, 1).Select
  23. ActiveCell.Value = p3y
  24. ActiveCell.Offset(1, -1).Select
  25. ActiveCell.Value = p4x
  26. ActiveCell.Offset(0, 1).Select
  27. ActiveCell.Value = p4y
  28. pintx = ((p3x * p1y - p1x * p3y) * (p4x - p2x) - (p4x * p2y - p2x * p4y) * (p3x - p1x)) / _
  29.          ((p3x - p1x) * (p4y - p2y) - (p4x - p2x) * (p3y - p1y))
  30. pinty = ((p3x * p1y - p1x * p3y) * (p4y - p2y) - (p4x * p2y - p2x * p4y) * (p3y - p1y)) / _
  31.          ((p3x - p1x) * (p4y - p2y) - (p4x - p2x) * (p3y - p1y))
  32. ActiveCell.Offset(1, -1).Select
  33. ActiveCell.Value = pintx
  34. ActiveCell.Offset(0, 1).Select
  35. ActiveCell.Value = pinty
  36. End Sub
  37. Sub cross(ax, ay, az, bx, by, bz, cx, cy, cz)
  38. cx = ay * bz - az * by
  39. cy = az * bx - ax * bz
  40. cz = ax * by - ay * bx
  41. End Sub

224332lgv3r7zbb77bk7i3.png
 
 
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-4 16:12 , Processed in 0.323323 second(s), 69 queries .

© 2020-2025 乐筑天下

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