明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3838|回复: 14

[提问] 多段线偏移,弧曲率不变,弧长为offset下的长度

[复制链接]
发表于 2013-10-26 14:21 | 显示全部楼层 |阅读模式
99明经币
本帖最后由 自贡黄明儒 于 2013-10-26 16:22 编辑

多段线偏移,弧曲率不变,弧长为offset下的长度
请各位高手帮帮忙
附件: 您需要 登录 才可以下载或查看,没有账号?注册

最佳答案

查看完整内容

熬了两个晚上,终于像样了。 写在前面的话,对于保证半径不改变,如果用计算方式出的结果总是不满意,所以还是改成了command函数,最近在研究entmake偏移线,正好要算圆弧,所以才加班加点的改写代码,想早日弄出来。 注意,这样的偏移线是建立在偏移后新圆弧的两点不大于原来直径的情况下,才能得到结果,否则无效。

点评

给个多直线和多弧段的实例  发表于 2013-10-26 16:05
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2013-10-26 14:21 | 显示全部楼层
熬了两个晚上,终于像样了。
写在前面的话,对于保证半径不改变,如果用计算方式出的结果总是不满意,所以还是改成了command函数,最近在研究entmake偏移线,正好要算圆弧,所以才加班加点的改写代码,想早日弄出来。
注意,这样的偏移线是建立在偏移后新圆弧的两点不大于原来直径的情况下,才能得到结果,否则无效。




  1. (defun c:tt(/ ent lst arclst en arclst i sk_pt ds newent bulgelst arcc )
  2.   (if
  3.   (and (setq en(if (setq ss(ssget "_+.:E:S" '((0 . "LWPOLYLINE"))))(ssname ss 0)))
  4.        (if en (progn (redraw en 3) t))
  5.        (setq ds(getdist "\n指定偏移数值:"))
  6.        (setq sk_pt(getpoint"\n指定偏移方向")))
  7.   (progn
  8.   
  9.   (setq ent(entget en))  
  10.   (setq lst '())
  11.   (while (car ent)
  12.     (if  (member (car(car ent)) '(10 40 41 42))
  13.       (setq lst (cons (car ent)lst))
  14.       )
  15.     (setq ent(cdr ent))
  16.     )
  17.   (setq lst (reverse lst))  
  18.   (setq i 0 arclst '())
  19.   (while (car lst)
  20.     (if (and (= (car (car lst)) 42)(/=(zerop (cdr (car lst))) t))
  21.       (setq arclst(cons (list i (cdr (car lst))) arclst))
  22.     )
  23.     (if (= (car (car lst)) 10)(setq i(1+ i)))
  24.     (setq lst(cdr lst))
  25.     )
  26.   (setq arclst (reverse arclst))  
  27.   (setvar "cmdecho" 0)
  28.   (command "offset" ds en sk_pt "")
  29.   (while (and (car arclst)(sk_indexpt1 (entget en) (1+ (car(car arclst)))))
  30.   (setq newent(entget(entlast)))
  31.    
  32.   (setq bulgelst (sk_bulge2arc  (sk_indexpt1 (entget en) (car(car arclst)))(sk_indexpt1 (entget en) (1+ (car(car arclst)))) (cadr(car arclst))))
  33.     (setq newds(distance  (sk_indexpt1 (entget en) (car(car arclst))) (sk_indexpt1 (entget en) (1+ (car(car arclst))))))
  34.     (if (<  newds (* (last bulgelst) 2))
  35.       (progn
  36.     (command "_.arc" "non"(sk_indexpt1 newent (car(car arclst)))"e""non"(sk_indexpt1 newent (1+ (car(car arclst)))) "r" (last bulgelst))   
  37.   (setq arcc(entget(entlast)))
  38.   (entdel(entlast))
  39.   (setq bulges(sk_arc2bulge (cdr (assoc 10 arcc))
  40.                             (cdr (assoc 50 arcc))
  41.                             (cdr (assoc 51 arcc))
  42.                             (cdr (assoc 40 arcc))))
  43.   (if (< (cadr(car arclst)) 0)   
  44.   (entmod (sk_newent newent (car(car arclst)) (* -1 (cadr bulges))))
  45.     (entmod (sk_newent newent (car(car arclst)) (cadr bulges)))
  46.   )))
  47.     (setq arclst(cdr arclst ))
  48.   )
  49.   (setvar "cmdecho" 1)
  50.   )
  51.   (princ "\n没有选择对象.")
  52.   )
  53.   (princ)
  54.   )

  55.   ; 按点表顺序更新多段线顶点,无须更换的顶点用nil代替。by:langjs
  56.   ; 例:(entmod (reent (entget (car (entsel "\n选多段线:"))) '(nil (0.0 0.0) (100.0 100.0))))更新多段线第二第三点。
  57.   (defun sk_newent (ent index new43  / i nent x)
  58.     (setq i 0  nent '())
  59.     (foreach x ent
  60.       (setq nent (if (and (= (car x) 42) (= (setq i (1+ i)) index ))
  61.        (append  nent (list (cons 42 new43)))
  62.        (append  nent (list x))
  63.                  )
  64.       )
  65.     )
  66.    
  67.   )
  68. (defun sk_indexpt1(ent ptindex / i pt)
  69.   (setq i 1)
  70.   (while (car ent)
  71.     (if (and (= (car(car ent)) 10) )
  72.       (progn
  73.   (if (= i ptindex)
  74.       (setq pt (cdr(car ent))))
  75.       (setq i (1+ i))
  76.       ))
  77.     (setq ent (cdr ent))
  78.     )
  79.   pt
  80.   )


  81. (defun sk_arc2bulge ( c a1 a2 r )
  82.     (list
  83.         (polar c a1 r)
  84.         (   (lambda ( a ) (/ (sin a) (cos a)))
  85.             (/ (rem (+ pi pi (- a2 a1)) (+ pi pi)) 4.0)
  86.         )
  87.         (polar c a2 r)
  88.     )
  89. )

  90. (defun sk_bulge2arc ( p1 p2 b / a c r )
  91.     (setq a (* 2 (atan b))
  92.           r (/ (distance p1 p2) 2 (sin a))
  93.           c (polar p1 (+ (- (/ pi 2) a) (angle p1 p2)) r)
  94.     )
  95.     (if (minusp b)
  96.         (list c (angle c p2) (angle c p1) (abs r))
  97.         (list c (angle c p1) (angle c p2) (abs r))
  98.     )
  99. )

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2013-10-26 14:29 | 显示全部楼层
能看下楼主最终的图啥样吗??
回复

使用道具 举报

 楼主| 发表于 2013-10-26 14:31 | 显示全部楼层
q3_2006 发表于 2013-10-26 14:29
能看下楼主最终的图啥样吗??

如图片所见,就是弧的半径不变,但长度是要变化的。弧长是正常offset下的长度
回复

使用道具 举报

发表于 2013-10-26 14:41 | 显示全部楼层
自贡黄明儒 发表于 2013-10-26 14:31
如图片所见,就是弧的半径不变,但长度是要变化的。弧长是正常offset下的长度

你说的曲率不变是不是等于复制?

点评

可以是复制,但复制后弧长要改变,弧后面的直线段(位置变化)、曲线段也要变化  发表于 2013-10-26 14:56
回复

使用道具 举报

发表于 2013-10-26 16:45 | 显示全部楼层
本帖最后由 q3_2006 于 2013-10-26 19:17 编辑


没看DWG图,理解有误
回复

使用道具 举报

发表于 2013-10-26 18:35 | 显示全部楼层
q3_2006 发表于 2013-10-26 16:45
代码很糙,楼主是高手,看我的思路就行,自己完善,我是新手,全当好玩了!

楼主的问题,还有一个条件没交代清楚,即然是多段线,那圆弧有可能是多段线的第一段,也有可能是中间段,当然了,也有可能是最后一段,如此的话,问题就出来了,按逆时针方向,不知道楼主要求的,是以圆弧的起点为标准还是以圆弧的终点为标准?

点评

明经因你的参与而精彩!!  发表于 2013-10-26 19:18
回复

使用道具 举报

 楼主| 发表于 2013-10-26 19:16 | 显示全部楼层
nzl1116 发表于 2013-10-26 18:35
楼主的问题,还有一个条件没交代清楚,即然是多段线,那圆弧有可能是多段线的第一段,也有可能是中间段, ...

不管哪里为起点,均可。最好与offset的起点一样
回复

使用道具 举报

发表于 2013-10-26 23:15 | 显示全部楼层
有趣的方案,和我最近思路有些相关,等有弄出来了在来。。
回复

使用道具 举报

发表于 2013-10-27 00:26 | 显示全部楼层
本帖最后由 nzl1116 于 2013-10-27 02:44 编辑
  1. (defun c:tt (/ Pline Pldata mData Pnt0 Pnt1 Ang Ang0 Ang1 Dist D nData Bulge Bulge1 r0 r1 L cen)
  2.   (vl-load-com)
  3.   (if (setq Pline (car (entsel "\n选择多段线:")))
  4.     (progn
  5.       (setq Pldata (entget Pline))
  6.       (if (member (cdr (assoc 0 Pldata)) '("LWPOLYLINE" "POLYLINE"))
  7.         (progn
  8.           (setq mData (vl-remove-if-not (function (lambda (x) (member (car x) '(10 42)))) Pldata))
  9.           (if (setq Pnt0 (getpoint "\n指定偏移方向"))
  10.             (progn
  11.               (setq Pnt1 (vlax-curve-getClosestPointTo Pline Pnt0)
  12.                     Ang  (angle '(0.0 0.0 0.0) (vlax-curve-getFirstDeriv Pline (vlax-curve-getParamAtPoint Pline Pnt1)))
  13.                     Ang  (- (angle Pnt1 Pnt0) Ang)
  14.               )
  15.               (if (setq Dist (getreal "\n指定偏移距离"))
  16.                 (progn
  17.                   (setq Pnt0  (cdar mData)
  18.                         Ang0  (angle '(0.0 0.0 0.0) (vlax-curve-getFirstDeriv Pline (vlax-curve-getParamAtPoint Pline Pnt0)))
  19.                         Pnt1  (polar Pnt0 (+ Ang0 Ang) Dist)
  20.                         nData (list (cons 10 Pnt1))
  21.                   )
  22.                   (while mData
  23.                     (setq Pnt2 (cdar mData)
  24.                           Pnt3 (cdaddr mData)
  25.                           D    (distance Pnt2 Pnt3)
  26.                     )
  27.                     (if (= (setq Bulge (cdadr mData)) 0)
  28.                       (progn
  29.                         (setq nData (cons '(42 . 0) nData)
  30.                               Pnt1  (polar Pnt1 Ang0 D)
  31.                               nData (cons (cons 10 Pnt1) nData)
  32.                         )
  33.                       )
  34.                       (progn
  35.                         (setq Ang1 (* (atan Bulge) 4)
  36.                               r0   (abs (/ D 2 (sin (/ Ang1 2))))
  37.                         )
  38.                         (if (> (* Ang1 Ang) 0)
  39.                           (setq r1 (- r0 Dist))
  40.                           (setq r1 (+ r0 Dist))
  41.                         )
  42.                         (if (> Bulge 0)
  43.                           (setq Ang1 (+ Ang0 (* pi 0.5)))
  44.                           (setq Ang1 (- Ang0 (* pi 0.5)))
  45.                         )
  46.                         (setq cen (polar Pnt1 Ang1 r0))
  47.                         (setq L     (* (abs Ang1) r1)
  48.                               Ang1  (/ L r0)
  49.                         )
  50.                         (if (> Bulge 0)
  51.                           (setq Pnt1 (polar cen (+ (angle cen Pnt1) Ang1) r0)
  52.                                 Ang0 (- (angle cen Pnt1) (* pi 0.5))
  53.                           )
  54.                           (setq Pnt1 (polar cen (- (angle cen Pnt1) Ang1) r0)
  55.                                 Ang0 (+ (angle cen Pnt1) (* pi 0.5))
  56.                           )
  57.                         )
  58.                         (setq Ang1   (/ Ang1 4)
  59.                               Bulge1 (/ (sin Ang1) (cos Ang1))
  60.                         )
  61.                         (if (< Bulge 0)
  62.                           (setq Bulge1 (* Bulge1 -1))
  63.                         )
  64.                         (setq nData (cons (cons 42 Bulge1) nData)
  65.                               nData (cons (cons 10 Pnt1) nData)
  66.                         )
  67.                       )
  68.                     )
  69.                     (setq mData (cddr mData))
  70.                   )
  71.                   (setq nData (reverse nData))
  72.                   (entmakex
  73.                     (append
  74.                       (vl-remove-if
  75.                         (function (lambda (x)
  76.                                     (member (car x) '(10 40 41 42 90))
  77.                                   )
  78.                         )
  79.                         Pldata
  80.                       )
  81.                       nData
  82.                       (list (cons 90 (/ (1+ (length nData)) 2)))
  83.                     )
  84.                   )
  85.                 )
  86.               )
  87.             )
  88.           )
  89.         )
  90.         (princ "\n选择的图元不是多段线")
  91.       )
  92.     )
  93.     (princ "\n没有选择图元")
  94.   )
  95.   (princ)
  96. )
夜深了,没时间调试了,先发码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 04:26 , Processed in 0.202762 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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