broncos15 发表于 2022-7-5 18:05:49

如何在p上迭代点

我有一个关于如何迭代普林线的整个距离的快速问题。我的意思是,我想将pt1设置为行的开头。然后我想迭代,并想再次将pt1设置为pt1+一个小的增量距离,如0.01,并这样做直到pline结束。例如
(setq pt1 (+ pt1 0.01))。我还想在另一条平行于第一条线的pline上这样做。如何:
1) 将pt1设置为pline1的终点
2) 将pt2设置为pline2的终点,但它必须与pt1位于同一“侧”(即pt1和pt2均应从左侧开始,并在右侧工作)。

Lee Mac 发表于 2022-7-5 18:11:10

最简单的方法是使用vlax curve-*函数,特别是vlax curve getpointatdist。

broncos15 发表于 2022-7-5 18:17:09

谢谢李!因此,如果我理解正确,我会这样做:
(defun c:test ()
(setq ss1 (LM:ssget "\nSelect 1st Polyline: " '("_+.:E:S" ((0 . "POLYLINE")))))
(setq ss2 (LM:ssget "\nSelect 2nd Polyline: " '("_+.:E:S" ((0 . "POLYLINE")))))
(if (and ss1 ss2)
   (progn
   (setq ent1 (vlax-ename->vla-object (ssname ss 0))
    ent2 (vlax-ename->vla-object (ssname ss 0))
    delta 0
    maxdist 0
          pt1 (vlax-curve-getPointAtDist ent1 delta)
    pt2 (vlax-curve-getPointAtDist ent2 delta))
   (Repeat (vla-get-Length ss1)
(setq maxdist1 (vlax-curve-getdistatpoint pt1 pt2))
(setq delta (+ delta 0.01))
(setq pt1 (vlax-curve-getPointAtDist ent1 delta)
      pt2 (vlax-curve-getPointAtDist ent2 delta))
(if (< maxdist maxdist1)
(setq maxdist maxdist1)
))
   )
   )
(if (> maxdist 0)
   (strcat "The maximum distance between the entities is:\n\n"
(rtos maxdist 2 2)
    )
   )
   
)我的问题是,我似乎无法让它正常工作。我是否误解了如何使用vlax曲线函数?

BIGAL 发表于 2022-7-5 18:22:21

看看这些,不需要ssget,因为你只有2个PLINE,修复重复
 
使用

(setq obj (vlax-ename->vla-object (car (entsel "\nPick pline"))))
(setq Pt (vlax-curve-getPointAtDist Obj dist))

(Repeat (fix (/ (vla-get-Length obj) 0.01))

this wont work (setq maxdist1 (vlax-curve-getdistatpoint pt1 pt2))

这是检查90度的点,可能比您的方法更精确

(setq Pt (vlax-curve-getPointAtDist Obj Chain))
(setq fd (vlax-curve-getFirstDeriv obj (vlax-curve-getparamAtPoint obj pt)))
(setq angR (- (angle '(0 0 0) fd) (* pi 0.5)))
(setq pt2 (polar pt angr 1.0))
(command "line" pt pt2 "")
(setq obj3 (vlax-ename->vla-object (car (entlast))))
(setq pt3 (vlax-invoke obj3 'intersectWith obj2 acExtendThisEntity))
setq Pt (vlax-curve-getPointAtDist Obj Chain))
(setq fd (vlax-curve-getFirstDeriv obj (vlax-curve-getparamAtPoint obj pt)))
(setq angR (- (angle '(0 0 0) fd) (* pi 0.5)))
(setq pt2 (polar pt angr 1.0))
(command "line" pt pt2 "")
(setq obj3 (vlax-ename->vla-object (car (entlast))))
(setq pt3 (vlax-invoke obj3 'intersectWith obj2 acExtendThisEntity))
(vla-put-endpoint obj3 pt3)

Lee Mac 发表于 2022-7-5 18:26:38

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

broncos15 发表于 2022-7-5 18:28:19

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

broncos15 发表于 2022-7-5 18:32:51

谢谢比格尔的建议,但我还是有点困惑。我认为intersectwith只在两个物体实际相交时有效,而不是在它们平行时有效?这是如何给出垂直点的?

BIGAL 发表于 2022-7-5 18:37:58

这是有道理的,我没有想过循环是基于nil表达式的。我将来写代码时一定会采用这种风格。再次感谢!

Lee Mac 发表于 2022-7-5 18:42:25

第一个像李(普林斯“wow1”)(普林斯“wow 2”)在代码中看到wow 1,没有wow 2好地方开始寻找。Vlide使用调试,最后一个中断源。
 
第二,第一个导数用于获得与对象的90度角,因此在此方向绘制一条假线。
(if (<= (vlax-curve-getdistatparam
ent1
(vlax-curve-getendparam ent1)
)
(vlax-curve-getdistatparam
ent2
(vlax-curve-getendparam ent2)
)
   )
(setq pt1 (vlax-curve-getPointAtDist ent1 delta))
(setq pt1 (vlax-curve-getPointAtDist ent2 delta))
)

broncos15 发表于 2022-7-5 18:45:18

您好,可以发布一个示例dwg 2多段线,显示哪个部分是最大距离(2D还是3D?)
让我们尝试任何方法:命令或代码等。。从调试中学习
页: [1] 2
查看完整版本: 如何在p上迭代点