如何在p上迭代点
我有一个关于如何迭代普林线的整个距离的快速问题。我的意思是,我想将pt1设置为行的开头。然后我想迭代,并想再次将pt1设置为pt1+一个小的增量距离,如0.01,并这样做直到pline结束。例如(setq pt1 (+ pt1 0.01))。我还想在另一条平行于第一条线的pline上这样做。如何:
1) 将pt1设置为pline1的终点
2) 将pt2设置为pline2的终点,但它必须与pt1位于同一“侧”(即pt1和pt2均应从左侧开始,并在右侧工作)。 最简单的方法是使用vlax curve-*函数,特别是vlax curve getpointatdist。 谢谢李!因此,如果我理解正确,我会这样做:
(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曲线函数? 看看这些,不需要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)
不客气-以下是对您的代码的一些反馈:
记住声明局部变量-如果不确定,请参阅我的教程。
我建议在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))
)
出于我在教程中给出的原因,我建议不要这样做:如果局部变量没有声明为局部变量,这将导致对程序行为的错误陈述,因此会阻碍调试过程,因为任何引用它们定义的变量的setq或set表达式都会复合先前对表达式求值时分配给变量的现有数据。此外,考虑使用未定义的“返回”变量的函数,除非满足条件(因此在某些情况下返回零)-如果此类变量的范围超出函数范围,则此类函数的整个行为将发生改变。
为了检查变量持有的值,我建议在代码中包含简单的princ/prin1表达式,以测试变量值作为不同的点。或者,您可以使用VLIDE中的Watch窗口,设置适当的断点,以测试符号在断点处保持的值。
谢谢 谢谢比格尔的建议,但我还是有点困惑。我认为intersectwith只在两个物体实际相交时有效,而不是在它们平行时有效?这是如何给出垂直点的? 这是有道理的,我没有想过循环是基于nil表达式的。我将来写代码时一定会采用这种风格。再次感谢! 第一个像李(普林斯“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))
) 您好,可以发布一个示例dwg 2多段线,显示哪个部分是最大距离(2D还是3D?)
让我们尝试任何方法:命令或代码等。。从调试中学习
页:
[1]
2