明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 806|回复: 9

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

[复制链接]
发表于 2022-3-9 21:55 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2022-3-13 00:17 编辑

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



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



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

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




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-3-12 12:12 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1明经币 +1 收起 理由
panliang9 + 1 院长厉害!

查看全部评分

回复 支持 2 反对 0

使用道具 举报

发表于 2022-3-10 08:45 | 显示全部楼层
本帖最后由 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 | 显示全部楼层
本帖最后由 尘缘一生 于 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))
  •   )
  •   (setq  vxs (reverse vxs));(length vxs)
  •   ;;取顶点列表.
  •   (setq  i -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-11 15:08 | 显示全部楼层
你以上的那些玩意儿是否可以参考沿某方向等距复制。或者指定间距,等分复制
 楼主| 发表于 2022-3-11 18:13 | 显示全部楼层
本帖最后由 尘缘一生 于 2022-3-13 00:09 编辑
yanchao316 发表于 2022-3-11 15:08
你以上的那些玩意儿是否可以参考沿某方向等距复制。或者指定间距,等分复制

实际,看图,我是想得到,辅助线的等分点后,如何连线的问题,这是红色按线长均匀取点,然后连线,这是问题一方面,我要解决的是,不是这样连线的,是另一方面,另一方面用什么连线?SPLINE模拟?若如此,鉴于SPLINE的特殊性,谁图纸会保留这个玩意,恶心不恶心?模拟可以,我必定转多段线,然后合并点。
那么,问题就归于一个,那就是,2点之间SPLINE的画法问题,怎么凸法!
等分点取得不是个事。

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2022-3-12 10:29 | 显示全部楼层
双圆弧内插

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2022-3-12 12:10 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2022-3-13 00:12 | 显示全部楼层
本帖最后由 尘缘一生 于 2022-3-13 00:28 编辑

院长确实好厉害啊,就是这个问题的答案了,这代码如何写的?这个问题就是终极智能等分了。如果不能提供源码,说下思路吧。
两侧母线取点,按XYZ排序?
发表于 2022-3-13 09:29 | 显示全部楼层
本帖最后由 xyp1964 于 2022-3-13 09:42 编辑
尘缘一生 发表于 2022-3-13 00:12
院长确实好厉害啊,就是这个问题的答案了,这代码如何写的?这个问题就是终极智能等分了。如果不能提供源 ...



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

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


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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-6-16 00:58 , Processed in 0.522845 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表