乐筑天下

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

[编程交流] 与方法问题相交

[复制链接]

11

主题

29

帖子

18

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
55
发表于 2022-7-5 17:58:36 | 显示全部楼层 |阅读模式
你好
 
我在使用以下代码查找两条LWpolyline之间的交点时遇到问题:
 
  1. (vl-load-com)
  2. (defun c:intersect (/ curve1-ename curve2-ename curve1-obj curve2-obj c d)
  3. (setq curve1-ename (car (entsel "\nSelect first curve")))
  4. (setq curve2-ename (car (entsel "\nSelect second curve")))
  5. (setq curve1-obj (vlax-ename->vla-object curve1-ename))
  6. (setq curve2-obj (vlax-ename->vla-object curve2-ename))
  7. (setq c
  8.         (vlax-variant-value
  9.           (vlax-invoke-method
  10.         curve1-obj
  11.         "IntersectWith"
  12.         curve2-obj
  13.         acExtendnone
  14.        )
  15.         )
  16.      )
  17. (setq d
  18.    (vl-catch-all-apply
  19.           'vlax-safearray->list
  20.           (list c)
  21.         )
  22. )
  23. (entmakex (list (cons 0 "POINT")
  24.          (cons 8 "00-CONSTR7")
  25.                  (cons 10 (list (car d) (cadr d)))
  26.         )
  27. )
  28. (princ)
  29. )

 
我所有的LWpolyline的高程都为0,所以这不是问题所在。在所附文件中,您将看到蓝色修订云中的小多段线,该多段线显然与图层“AXE-REF-PK”上的白色多段线不相交(但它们显然相交;错误类型为:“ActiveX服务器返回了一个错误:生成了无效索引”)。这条多段线有1900多个顶点,因此可能存在尺寸限制。我在上面画了完全相同的情况,但有一半顶点的多边形。这一次,程序每次都会找到一个交点。使用intersectwith方法确实有很多东西我没有得到
 
有没有人遇到过类似的问题?
 
当做
 
雅克
 
与方法问题相交。图纸
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:27:25 | 显示全部楼层
如果对象远离原点,则intersectwith方法可能是易变的-请尝试以下代码:
  1. (defun c:inters ( / lst ob1 ob2 vec )
  2.    (if (and (setq ob1 (car (entsel "\nSelect 1st curve: ")))
  3.             (setq ob2 (car (entsel "\nSelect 2nd curve: ")))
  4.             (setq ob1 (vlax-ename->vla-object ob1))
  5.             (setq ob2 (vlax-ename->vla-object ob2))
  6.        )
  7.        (if (or (setq lst (group3 (vlax-invoke ob1 'intersectwith ob2 acextendnone)))
  8.                (   (lambda ( vec / ob3 ob4 )
  9.                        (vla-move (setq ob3 (vla-copy ob1)) (vlax-3D-point vec) (vlax-3D-point 0 0))
  10.                        (vla-move (setq ob4 (vla-copy ob2)) (vlax-3D-point vec) (vlax-3D-point 0 0))
  11.                        (setq lst (group3 (vlax-invoke ob3 'intersectwith ob4 acextendnone))
  12.                              lst (mapcar '(lambda ( x ) (mapcar '+ x vec)) lst)
  13.                        )
  14.                        (vla-delete ob3)
  15.                        (vla-delete ob4)
  16.                        lst
  17.                    )
  18.                    (vlax-curve-getstartpoint ob1)
  19.                )
  20.            )
  21.            (foreach pnt lst (entmake (list '(0 . "POINT") '(8 . "00-CONSTR7") (cons 10 pnt))))
  22.            (princ "\nNo intersection detected.")
  23.        )
  24.    )
  25.    (princ)
  26. )
  27. (defun group3 ( lst / rtn )
  28.    (repeat (/ (length lst) 3)
  29.        (setq rtn (cons (list (car lst) (cadr lst) (caddr lst)) rtn)
  30.              lst (cdddr lst)
  31.        )
  32.    )
  33.    (reverse rtn)
  34. )
  35. (vl-load-com) (princ)

此外,我建议不要将intersect定义为自定义命令,因为这已经是一个内置的AutoCAD命令。
回复

使用道具 举报

11

主题

29

帖子

18

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
55
发表于 2022-7-5 18:35:26 | 显示全部楼层
非常感谢李·麦克!工作起来很有魅力。我将记住,AutoCAD可能在典型地理坐标值方面存在问题。
 
至于intersect内置命令,我并没有试图模仿它。实际上,我需要能够在一个更大的lisp程序中找到两条多段线之间的交点,您的方法可以完美地完成这项工作。我设法看到了像弗拉·莫夫这样的新闻命令!
 
再次感谢并致以最良好的问候,
 
雅克
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:55:45 | 显示全部楼层
不客气我很高兴该功能现在运行良好。
 
我知道您没有尝试模拟内置的AutoCAD命令,但应避免将内置命令的名称用作AutoLISP自定义命令。
回复

使用道具 举报

11

主题

29

帖子

18

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
55
发表于 2022-7-5 19:07:18 | 显示全部楼层
啊,好的。我现在明白你评论的真正含义了。我以后不会做了!再次感谢。
 
雅克
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 01:09 , Processed in 0.586165 second(s), 62 queries .

© 2020-2025 乐筑天下

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