乐筑天下

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

[编程交流] 如何在p上迭代点

[复制链接]

95

主题

477

帖子

383

银币

后起之秀

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

铜币
475
发表于 2022-7-5 18:05:49 | 显示全部楼层 |阅读模式
我有一个关于如何迭代普林线的整个距离的快速问题。我的意思是,我想将pt1设置为行的开头。然后我想迭代,并想再次将pt1设置为pt1+一个小的增量距离,如0.01,并这样做直到pline结束。例如
  1. (setq pt1 (+ pt1 0.01))
。我还想在另一条平行于第一条线的pline上这样做。如何:
1) 将pt1设置为pline1的终点
2) 将pt2设置为pline2的终点,但它必须与pt1位于同一“侧”(即pt1和pt2均应从左侧开始,并在右侧工作)。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:11:10 | 显示全部楼层
最简单的方法是使用vlax curve-*函数,特别是vlax curve getpointatdist。
回复

使用道具 举报

95

主题

477

帖子

383

银币

后起之秀

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

铜币
475
发表于 2022-7-5 18:17:09 | 显示全部楼层
谢谢李!因此,如果我理解正确,我会这样做:
  1. (defun c:test ()
  2. (setq ss1 (LM:ssget "\nSelect 1st Polyline: " '("_+.:E:S" ((0 . "POLYLINE")))))
  3. (setq ss2 (LM:ssget "\nSelect 2nd Polyline: " '("_+.:E:S" ((0 . "POLYLINE")))))
  4. (if (and ss1 ss2)
  5.    (progn
  6.      (setq ent1 (vlax-ename->vla-object (ssname ss 0))
  7.     ent2 (vlax-ename->vla-object (ssname ss 0))
  8.     delta 0
  9.     maxdist 0
  10.           pt1 (vlax-curve-getPointAtDist ent1 delta)
  11.     pt2 (vlax-curve-getPointAtDist ent2 delta))
  12.      (Repeat (vla-get-Length ss1)
  13. (setq maxdist1 (vlax-curve-getdistatpoint pt1 pt2))
  14. (setq delta (+ delta 0.01))
  15. (setq pt1 (vlax-curve-getPointAtDist ent1 delta)
  16.       pt2 (vlax-curve-getPointAtDist ent2 delta))
  17. (if (< maxdist maxdist1)
  18.   (setq maxdist maxdist1)
  19.   ))
  20.      )
  21.    )
  22. (if (> maxdist 0)
  23.    (strcat "The maximum distance between the entities is:\n\n"
  24. (rtos maxdist 2 2)
  25.     )
  26.    )
  27.    
  28. )
我的问题是,我似乎无法让它正常工作。我是否误解了如何使用vlax曲线函数?
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:22:21 | 显示全部楼层
看看这些,不需要ssget,因为你只有2个PLINE,修复重复
 
使用
  1. (setq obj (vlax-ename->vla-object (car (entsel "\nPick pline"))))
  2. (setq Pt (vlax-curve-getPointAtDist Obj dist))
  3. (Repeat (fix (/ (vla-get-Length obj) 0.01))
  4. this wont work (setq maxdist1 (vlax-curve-getdistatpoint pt1 pt2))

这是检查90度的点,可能比您的方法更精确
  1. (setq Pt (vlax-curve-getPointAtDist Obj Chain))
  2. (setq fd (vlax-curve-getFirstDeriv obj (vlax-curve-getparamAtPoint obj pt)))
  3. (setq angR (- (angle '(0 0 0) fd) (* pi 0.5)))
  4. (setq pt2 (polar pt angr 1.0))
  5. (command "line" pt pt2 "")
  6. (setq obj3 (vlax-ename->vla-object (car (entlast))))
  7. (setq pt3 (vlax-invoke obj3 'intersectWith obj2 acExtendThisEntity))
  8. setq Pt (vlax-curve-getPointAtDist Obj Chain))
  9. (setq fd (vlax-curve-getFirstDeriv obj (vlax-curve-getparamAtPoint obj pt)))
  10. (setq angR (- (angle '(0 0 0) fd) (* pi 0.5)))
  11. (setq pt2 (polar pt angr 1.0))
  12. (command "line" pt pt2 "")
  13. (setq obj3 (vlax-ename->vla-object (car (entlast))))
  14. (setq pt3 (vlax-invoke obj3 'intersectWith obj2 acExtendThisEntity))
  15. (vla-put-endpoint obj3 pt3)
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:26:38 | 显示全部楼层
不客气-以下是对您的代码的一些反馈:
 
记住声明局部变量-如果不确定,请参阅我的教程。
 
 
我建议在and表达式中包含两个setq表达式:当前,即使用户在第一次提示时未能选择对象,也会提示用户两次;然而,由于and是一种特殊形式,参数将与and逻辑同步求值,导致第二个表达式仅在对第一个表达式的有效响应之后求值。
 
还要注意的是,过滤的是三维多段线或二维[重]多段线,而不是由PLINE命令创建的标准轻量多段线(LWPOLYLINE)。
 
 
这在语法上是正确的,但如果其中一条多段线反转,请小心。
 
 
ss1是一个选择集,没有ActiveX长度属性(几何属性);您可能会对返回选择集中项目数的sslength感到困惑。
 
然而,repeat需要一个整数参数来表示封闭表达式的重复次数,因此如果以这种方式进行,则需要固定长度。
 
如果我已经理解了您希望实现的目标,我会推荐以下内容:
  1. (setq len (vlax-curve-getdistatparam ent1 (vlax-curve-getendparam ent1))
  2.      dis 0.0
  3. )
  4. (while (<= dis len)
  5.    ...
  6.    (setq dis (+ dis 0.01))
  7. )
回复

使用道具 举报

95

主题

477

帖子

383

银币

后起之秀

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

铜币
475
发表于 2022-7-5 18:28:19 | 显示全部楼层
 
出于我在教程中给出的原因,我建议不要这样做:如果局部变量没有声明为局部变量,这将导致对程序行为的错误陈述,因此会阻碍调试过程,因为任何引用它们定义的变量的setq或set表达式都会复合先前对表达式求值时分配给变量的现有数据。此外,考虑使用未定义的“返回”变量的函数,除非满足条件(因此在某些情况下返回零)-如果此类变量的范围超出函数范围,则此类函数的整个行为将发生改变。
 
为了检查变量持有的值,我建议在代码中包含简单的princ/prin1表达式,以测试变量值作为不同的点。或者,您可以使用VLIDE中的Watch窗口,设置适当的断点,以测试符号在断点处保持的值。
 
 
谢谢
回复

使用道具 举报

95

主题

477

帖子

383

银币

后起之秀

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

铜币
475
发表于 2022-7-5 18:32:51 | 显示全部楼层
谢谢比格尔的建议,但我还是有点困惑。我认为intersectwith只在两个物体实际相交时有效,而不是在它们平行时有效?这是如何给出垂直点的?
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:37:58 | 显示全部楼层
这是有道理的,我没有想过循环是基于nil表达式的。我将来写代码时一定会采用这种风格。再次感谢!
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:42:25 | 显示全部楼层
第一个像李(普林斯“wow1”)(普林斯“wow 2”)在代码中看到wow 1,没有wow 2好地方开始寻找。Vlide使用调试,最后一个中断源。
 
第二,第一个导数用于获得与对象的90度角,因此在此方向绘制一条假线。
  1. (if (<= (vlax-curve-getdistatparam
  2.   ent1
  3.   (vlax-curve-getendparam ent1)
  4. )
  5. (vlax-curve-getdistatparam
  6.   ent2
  7.   (vlax-curve-getendparam ent2)
  8. )
  9.    )
  10. (setq pt1 (vlax-curve-getPointAtDist ent1 delta))
  11. (setq pt1 (vlax-curve-getPointAtDist ent2 delta))
  12. )
回复

使用道具 举报

95

主题

477

帖子

383

银币

后起之秀

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

铜币
475
发表于 2022-7-5 18:45:18 | 显示全部楼层
您好,可以发布一个示例dwg 2多段线,显示哪个部分是最大距离(2D还是3D?)
让我们尝试任何方法:命令或代码等。。从调试中学习
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 00:03 , Processed in 0.498127 second(s), 72 queries .

© 2020-2025 乐筑天下

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