闲来无事,发个图,求代码,未尝不可?
本帖最后由 尘缘一生 于 2022-3-13 00:17 编辑如图,白色不相交的平行线,或曲线(弧、圆、SPLINE)
他们间距等分N断,N是参数)有好代码吗?模拟的、偏移的,感觉不好,有好思路么?第一,第二张图,是我用模拟代码做到的,却做不到第4张图不平行情况(我偏移随便做的)的N等分,不成功,也就是说:不管平行和不平行,中间距离N等分,这个代码集成----》
这下面一张图,是圆弧偏移后,中间N等分,代码可成。
可下面这个,并不平行的,任意距离,也N等分,代码:无。
这个不平行线的N等分,应该是智能中心线集成的一部分,
应该是取两母线,把它等分n段取点,点点连线后的n等分,
,取点后作为-->(SPLINE),再转POWLINE
再消除重复点而成?
当然,如果不平行的N等分代码可行,那么平行的N等分,也就不需要了,即可解决全部了吗。
也就是说:不管平行不平行,两线距离N等分画线。
本帖最后由 panliang9 于 2022-3-10 09:16 编辑
陈工,这个贴子里的不行吗.
http://bbs.mjtd.com/forum.php?mo ... 9%CC%F5%C7%FA%CF%DF 本帖最后由 尘缘一生 于 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))
[*])
你以上的那些玩意儿是否可以参考沿某方向等距复制。或者指定间距,等分复制 本帖最后由 尘缘一生 于 2022-3-13 00:09 编辑
yanchao316 发表于 2022-3-11 15:08
你以上的那些玩意儿是否可以参考沿某方向等距复制。或者指定间距,等分复制
实际,看图,我是想得到,辅助线的等分点后,如何连线的问题,这是红色按线长均匀取点,然后连线,这是问题一方面,我要解决的是,不是这样连线的,是另一方面,另一方面用什么连线?SPLINE模拟?若如此,鉴于SPLINE的特殊性,谁图纸会保留这个玩意,恶心不恶心?模拟可以,我必定转多段线,然后合并点。
那么,问题就归于一个,那就是,2点之间SPLINE的画法问题,怎么凸法!
等分点取得不是个事。
最终,要得到粉红色线这个问题,如果直线画哪倒不是个事了,如果不呢?怎么粉色线画?
两侧母线处凸度的平衡?如何这个代码?假如如此,哪也不行吗,因为两侧母线是截然不同的吗。
双圆弧内插
本帖最后由 尘缘一生 于 2022-3-13 00:28 编辑
xyp1964 发表于 2022-3-12 12:10
院长确实好厉害啊,就是这个问题的答案了,这代码如何写的?这个问题就是终极智能等分了。如果不能提供源码,说下思路吧。
两侧母线取点,按XYZ排序?
本帖最后由 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]