尘缘一生 发表于 2022-3-9 21:55:51

闲来无事,发个图,求代码,未尝不可?

本帖最后由 尘缘一生 于 2022-3-13 00:17 编辑

如图,白色不相交的平行线,或曲线(弧、圆、SPLINE)
他们间距等分N断,N是参数)有好代码吗?模拟的、偏移的,感觉不好,有好思路么?第一,第二张图,是我用模拟代码做到的,却做不到第4张图不平行情况(我偏移随便做的)的N等分,不成功,也就是说:不管平行和不平行,中间距离N等分,这个代码集成----》



这下面一张图,是圆弧偏移后,中间N等分,代码可成。



可下面这个,并不平行的,任意距离,也N等分,代码:无。
这个不平行线的N等分,应该是智能中心线集成的一部分,
应该是取两母线,把它等分n段取点,点点连线后的n等分,
,取点后作为-->(SPLINE),再转POWLINE
再消除重复点而成?
当然,如果不平行的N等分代码可行,那么平行的N等分,也就不需要了,即可解决全部了吗。

也就是说:不管平行不平行,两线距离N等分画线。




xyp1964 发表于 2022-3-12 12:12:40


panliang9 发表于 2022-3-10 08:45:59

本帖最后由 panliang9 于 2022-3-10 09:16 编辑

陈工,这个贴子里的不行吗.
http://bbs.mjtd.com/forum.php?mo ... 9%CC%F5%C7%FA%CF%DF

尘缘一生 发表于 2022-3-10 18:13:49

本帖最后由 尘缘一生 于 2022-3-11 18:48 编辑

panliang9 发表于 2022-3-10 08:45
陈工,这个贴子里的不行吗.
http://bbs.mjtd.com/forum.php?mo ... 9%CC%F5%C7%FA%CF%DF
是的,办不了最后一种情况。你觉得我能漏掉本坛任何帖子吗?

[*];;两线等分(一级)-------------
[*];;en1 :线1   en2 :线2    div :等分数 lay :图层 lt :线型sc3 :线型比例col :颜色
[*](defun div-2lin (en1 en2 div lay lt sc3 col / pa pb pc pd dd1 dd2 vv1 vv2 d1 d2 ang paa pbb i obj tp1 tp2 dis pt1 curveFoot)
[*](setq e_lst (sysvar '("osmode" "cmdecho" "peditaccept")))
[*](setvar "CMDECHO" 0) (setvar "OSMODE" 0) (setvar "peditaccept" 1)
[*](if (/= (sl-Curveinters en1 en2 3) nil);有交点或延伸有交点
[*]    (progn
[*]      (setq pa (vlax-curve-getstartpoint en1)) ; 对象的起点
[*]      (setq pb (vlax-curve-getendpoint en1)) ; 对象的终点
[*]      (setq pc (vlax-curve-getstartpoint en2)) ; 对象的起点
[*]      (setq pd (vlax-curve-getendpoint en2)) ; 对象的终点
[*]      (if (inters pa pc pb pd)
[*]      (setq pt pa pa pb pb pt)
[*]      )
[*]      (setq dd1 (distance pa pc))
[*]      (setq dd2 (distance pb pd))
[*]      (setq vv1 (angle pa pc))
[*]      (setq vv2 (angle pb pd))
[*]      (setq d1 (/ dd1 div))
[*]      (setq d2 (/ dd2 div))
[*]      (setq i 1)
[*]      (repeat (1- div)
[*]      (setq paa (polar pa vv1 (* i d1)))
[*]      (setq pbb (polar pb vv2 (* i d2)))
[*]      (setq ang (angle paa pbb))
[*]      (setq paa (polar paa (+ ang pi) slbl))
[*]      (setq pbb (polar pbb ang slbl))
[*]      (fy_lineformat (makeline paa pbb) lay lt sc3 col)
[*]      (setq i (1+ i))
[*]      )
[*]    )
[*]    (progn ;;平行
[*]      (setq tp1 (dxf1 en1 0)tp2 (dxf1 en2 0))
[*]      (if (and (or (= (dxf1 en1 0) "LINE") (and (or (= tp1 "LWPOLYLINE") (= tp1 "POLYLINE")) (= (dxf1 en1 90) 2)))
[*]            (or (= (dxf1 en2 0) "LINE") (and (or (= tp2 "LWPOLYLINE") (= tp2 "POLYLINE")) (= (dxf1 en2 90) 2)))
[*]          )
[*]      (progn
[*]          (setq pt1 (vlax-curve-getstartpoint en1)) ; 对象的起点
[*]          (setq curveFoot (vlax-curve-getClosestPointTo (en2obj en2) pt1));垂点 ,垂足
[*]          (setq dis (distance pt1 curveFoot))
[*]          (setq d1 (/ dis div) i 1)
[*]          (repeat (1- div)
[*]            (command "offset" (* i d1) (list en1 pt1) curveFoot "")
[*]            (setq obj (en2obj (entlast)))
[*]            (vla-put-layer obj lay)
[*]            (vla-put-color obj col)
[*]            (vla-put-linetype obj lt)
[*]            (vla-put-LinetypeScale obj sc3)
[*]            (vla-update obj)
[*]            (setq i (1+ i))
[*]          )
[*]      )
[*]      (foreach x (vlax-curve-DivideBetweenPair en1 en2 div) ;返回值=坐标表
[*]          (makelwpolyline x 0 nil)
[*]          (x@-delvx (entlast) nil nil)
[*]          (setq obj (en2obj (entlast)))
[*]          (vla-put-layer obj lay)
[*]          (vla-put-linetype obj lt)
[*]          (vla-put-color obj col)
[*]          (vla-put-LinetypeScale obj sc3)
[*]          (vla-update obj)
[*]      )
[*]      )
[*]    )
[*]);;if
[*](mapcar 'eval e_lst)
[*](princ)
[*])
[*]; 删除多段线上的重合点和共线点--(一级)-----------
[*]; eo = 多义线实体,支持ename,vla-object
[*];fuzz = 删除重合点的阈值(端点距离; /=片断长度).为nil时取1e-4(默认).
[*];afuzz = 顶点共线角度阈值 (角度). 为nil 时取1e-4(默认).
[*](defun x@-delvx (eo fuzz afuzz / o e vx i vxs i n pt vxs2 vbgs wids bg pt1 pt2 ang1 ang2 ent w1 w2 w3 w4 d1 d2 closekey)
[*](if (not fuzz) (setq fuzz 1e-4))
[*](if (not afuzz) (setq afuzz 1e-4))
[*](if (= 'ENAME (type eo))
[*]    (setq o (en2obj eo) e eo)
[*]    (setq o eo e (obj2en eo))
[*])
[*](setq i -1)
[*](while (not (vl-catch-all-error-p (setq vx (vl-catch-all-apply 'vla-get-coordinate (list o (setq i (1+ i)))))))
[*]    (setq vxs (cons (vlax-safearray->list (vlax-variant-value vx)) vxs))
[*])
[*](setqvxs (reverse vxs));(length vxs)
[*];;取顶点列表.
[*](setqi -1 n (length vxs))
[*](while (< (setq i (1+ i)) n)
[*]    (setq pt (nth i vxs))
[*]    (cond
[*]      ((or (not vxs2) (= (1+ i) n));1th pt ;end pt
[*]      (setq vxs2 (cons pt vxs2)
[*]          vbgs (cons (vla-getbulge o i) vbgs)
[*]          wids (progn (vla-getwidth o i 'w1 'w2)(cons (list w1 w2) wids))
[*]      )
[*]      )
[*]      (vxs2
[*]      (setq bg (vla-getbulge o i))
[*]      (if (not (equal pt (setq pt1 (car vxs2)) fuzz))
[*]          (if (or (vla-getwidth o i 'w1 'w2)
[*]                (vla-getwidth o (1- i) 'w3 'w4)
[*]                (/= bg (vla-getbulge o (1- i)))
[*]                (and (setq pt2 (nth (1+ i) vxs))
[*]                  (setq ang1 (angle pt1 pt)
[*]                  ang2 (angle pt1 pt2)
[*]                  )
[*]                  (not (equal ang1 ang2 afuzz))
[*]                )
[*]                (/= w4 w1) ;;前后宽度不为线性比例.
[*]                (and (setq d1 (-(vlax-curve-getdistatparam o (1+ i)) (vlax-curve-getdistatparam o i)))
[*]                  (setq d2 (- (vlax-curve-getdistatparam o i) (vlax-curve-getdistatparam o (1- i))))
[*]                  (and (/= d1 0.) (/= d2 0.));;排除除数为0情况.
[*]                  (/= (/ (- w2 w1) d1)(/ (- w4 w3) d2))
[*]                )
[*]            )
[*]            (setq vxs2 (cons pt vxs2)
[*]            vbgs (cons (vla-getbulge o i) vbgs)
[*]            wids (cons (list w1 w2) wids)
[*]            )
[*]          )
[*]          (if(/= bg (vla-getbulge o (1- i)));v 加.校正bulge.
[*]            (setq vbgs (cons bg (cdr vbgs)))
[*]          )
[*]      )
[*]      )
[*]    )
[*])
[*](if (equal (vlax-curve-getstartpoint e) (vlax-curve-getendpoint e) fuzz) ;;闭合或几乎闭合.
[*]    (setq vxs2 (cdr vxs2)
[*]      vbgs (cdr vbgs)
[*]      wids (cdr wids)
[*]      closekey T
[*]    )
[*])
[*](setq ent (entget e))
[*](entmod (vl-remove-if '(lambda (x) (= 10 (car x))) ent));;删除顶点.用此方法可行. ok!!!
[*](vlax-put o 'coordinates (apply 'append (reverse vxs2)))
[*](setq i -1)
[*](mapcar '(lambda (x y) (vla-setbulge o (setq i (1+ i)) x) (vla-setwidth o i (car y)(cadr y)))
[*]    (reverse vbgs)
[*]    (reverse wids)
[*])
[*](if closekey (vla-put-closed o :vlax-true))
[*])
[*];;删除多段线重复点-------(一级)------(备用)---
[*](defun dump2dPoly (ent / tp)
[*](setq tp (dxf1 ent 0))
[*](if (= tp "POLYLINE")
[*]    (progn
[*]      (setq ent (entnext ent))
[*]      (setq elis (entget ent))
[*]      (setq p0 (dxf1 elis 10))
[*]      (while (and (setq ent (entnext ent)) (= "VERTEX" (dxf1 elis 0)))
[*]      (if (equal p0 (setq p1 (dxf1 ent 10)) 1e-6)
[*]          (vla-delete (en2obj ent))
[*]          (setq p0 p1)
[*]      )
[*]      )
[*]    )
[*])
[*]ent
[*])
[*];;曲线间定距离模拟点-------(一级)------------
[*];;返回两个横截面之间的近似点列表
[*];;e1、e2、曲线图元/对象样条曲线、LW多段线等...
[*];;x、 方向模式0或1,整数 ;y、 除法参数,整数
[*](defun vlax-curve-DivideBetweenPair (e1 e2 y / m i d p o l a r)
[*](setq i 600.0 a (list e1 e2)) ;;i纵向密度--用户自行设定
[*](foreach e a
[*]    (setq r nil
[*]      d (vlax-curve-getdistatparam e (vlax-curve-getendparam e))
[*]      m (/ d i)
[*]      l 0.0
[*]    )
[*]    (while (and (< l d) (setq p (vlax-curve-getpointatdist e l)))
[*]      (setq l (+ l m) r (cons p r))
[*]    )
[*]    (setq o (cons (reverse r) o))
[*])
[*](setq r nil p '((x) (mapcar '* '(1. 1. 0.) x)) ; 转换2D
[*]    o (mapcar '(lambda (a b) (append a (list (vlax-curve-getendpoint b)))) o (reverse a))
[*])
[*](foreach x (apply 'mapcar (cons '(lambda (a b) (list (setq b (p b) a (p a)) (angle a b) (/ (distance a b) y))) o))
[*]    (setq l nil p (car x))
[*]    (repeat (1- y)
[*]      (setq p (apply 'polar (cons p (cdr x))) l (cons p l))
[*]    )
[*]    (setq r (cons l r))
[*])
[*](apply 'mapcar (cons 'list r))
[*])


yanchao316 发表于 2022-3-11 15:08:58

你以上的那些玩意儿是否可以参考沿某方向等距复制。或者指定间距,等分复制

尘缘一生 发表于 2022-3-11 18:13:27

本帖最后由 尘缘一生 于 2022-3-13 00:09 编辑

yanchao316 发表于 2022-3-11 15:08
你以上的那些玩意儿是否可以参考沿某方向等距复制。或者指定间距,等分复制
实际,看图,我是想得到,辅助线的等分点后,如何连线的问题,这是红色按线长均匀取点,然后连线,这是问题一方面,我要解决的是,不是这样连线的,是另一方面,另一方面用什么连线?SPLINE模拟?若如此,鉴于SPLINE的特殊性,谁图纸会保留这个玩意,恶心不恶心?模拟可以,我必定转多段线,然后合并点。
那么,问题就归于一个,那就是,2点之间SPLINE的画法问题,怎么凸法!
等分点取得不是个事。

最终,要得到粉红色线这个问题,如果直线画哪倒不是个事了,如果不呢?怎么粉色线画?

两侧母线处凸度的平衡?如何这个代码?假如如此,哪也不行吗,因为两侧母线是截然不同的吗。

xyp1964 发表于 2022-3-12 10:29:56

双圆弧内插

xyp1964 发表于 2022-3-12 12:10:15


尘缘一生 发表于 2022-3-13 00:12:55

本帖最后由 尘缘一生 于 2022-3-13 00:28 编辑

xyp1964 发表于 2022-3-12 12:10

院长确实好厉害啊,就是这个问题的答案了,这代码如何写的?这个问题就是终极智能等分了。如果不能提供源码,说下思路吧。
两侧母线取点,按XYZ排序?

xyp1964 发表于 2022-3-13 09:29:18

本帖最后由 xyp1964 于 2022-3-13 09:42 编辑

尘缘一生 发表于 2022-3-13 00:12
院长确实好厉害啊,就是这个问题的答案了,这代码如何写的?这个问题就是终极智能等分了。如果不能提供源 ...



;;类似 _edgesurf 命令,设置SURFTAB1 和 SURFTAB2,网格线交点就是模拟点位。

;; (2CurveDiv s1曲线1 s2曲线2 nn1内插数量 nn2沿线等分点
(defun 2CurveDiv (s1 s2 nn1 nn2 / ptn1 ptn2 ptn)
(setq        ptn1 (xyp-CurveDivNum s1 nn2) ;沿线等分点
        ptn2 (xyp-CurveDivNum s2 nn2) ;有可能需要倒置
        ptn(mapcar '(lambda (x y) (xyp-DivPt2Pt x y nn1)) ;两点内插
                     ptn1
                     ptn2
             )
        ptn(xyp-List-Reverse ptn) ;点集矩阵转换
)
(mapcar '(lambda (x)
               (setq x (xyp-PtnOptimization x));x点集优化抽稀
               (xyp-Spline x nil);曲线类型根据需要设定pline、spline、3dpoly……
             )
              ptn
      )
)


页: [1]
查看完整版本: 闲来无事,发个图,求代码,未尝不可?