明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5196|回复: 36

[提问] 求助!!两条非等距离的样条曲线之间如何绘制几条等分的曲线

  [复制链接]
发表于 2018-10-26 14:39 | 显示全部楼层 |阅读模式
求助!!两条非等距离的样条曲线之间,如何绘制几条等分的曲线
            如图:黑线与红线之间插入蓝色等分的曲线,不一定是插入2条,是指定条数
           如何实现?




本帖子中包含更多资源

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

x
发表于 2018-10-28 21:03 | 显示全部楼层
本帖最后由 lisperado 于 2018-10-29 14:10 编辑

谢谢l顶上
但不见原版主回复所以只提供函数 ,其他用法只需自行更改参数吧!

简单思路只提供参考,原因函数返回表值并不代表曲线弯孤度所以并不精准!尤其弯度角度太大请避免!!
  1. ;|
  2. --------------- vlax-curve-DivideBetweenPair ---------------
  3.                                                             
  4.   Returns a approximate point list between two cross-section
  5.   curves by a dividing parameter, concept of LOFT command
  6. ------------------------------------------------------------
  7.   Author: lisperado     
  8. ------------------------------------------------------------

  9.   Arguments:
  10.   e1,e2        - Curve entities/objects SPLINE,LWPOLYLINE etc..
  11.   x         - Direction mode 0 or 1, integer               
  12.   y         - Divide parameter, integer
  13.   
  14. ------------------------------------------------------------
  15.   Returns:  list of Point list (WCS)   
  16. ------------------------------------------------------------|;

  17. ;;Note: NOT accurate for sharp curve

  18. (defun vlax-curve-DivideBetweenPair ( e1 e2 y /  m i d  p o l a r   )

  19.   (setq        i 32.0  ;;;纵向密度用户自行设定  
  20.         a (list e1 e2)
  21.         )

  22.   (foreach e a
  23.     (setq r nil
  24.           d (vlax-curve-getdistatparam e (vlax-curve-getendparam e))
  25.           m (/ d i)
  26.           l 0.0
  27.           )
  28.     (while (and (< l d) (setq p (vlax-curve-getpointatdist e l)))
  29.       (setq l (+ l m)
  30.             r (cons p r)
  31.             )
  32.       )
  33.     (setq o (cons (reverse r) o))
  34.     ) ; foreach

  35.   (setq        r nil
  36.         p '((x) (mapcar '* '(1. 1. 0.) x)) ; 转换2D
  37.         o (mapcar '(lambda (a b) (append a (list (vlax-curve-getendpoint b)))) o (reverse a))
  38.         )

  39.   (foreach x (apply 'mapcar (cons '(lambda (a b) (list (setq b (p b) a (p a) ) (angle a b) (/ (distance a b) y))) o))
  40.     (setq
  41.           l nil
  42.           p (car x)
  43.           )
  44.     (repeat (1- y)
  45.       (setq
  46.             p (apply 'polar (cons p (cdr x)))
  47.             l (cons p l)
  48.             )
  49.       ) ; repeat
  50.     (setq r (cons l r))
  51.     ) ; foreach
  52.   (apply 'mapcar (cons 'list r))
  53.   )



;; 举例 : e1  & e2 各是曲线,平份于 5
( vlax-curve-DivideBetweenPair e1 e2 5 )
;; 返回表:
;(((113.88 294.633 0.0) (98.7727 293.563 0.0) (83.6605 292.562 0.0) (68.539 291.699 0.0) ....

;;编辑: 1. 更正: 移除多余变量 setq i 0 & setq i 1+ i
2. 暂时只支持2D因为polar函数距离参数以平面为基础







点评

佩服!!!感谢无私的帮助  发表于 2018-10-28 23:26

评分

参与人数 1明经币 +1 金钱 +20 收起 理由
gamexia + 1 + 20 感谢无私的帮助

查看全部评分

回复 支持 3 反对 0

使用道具 举报

发表于 2018-10-30 18:17 | 显示全部楼层
(defun c:tt ( / e1 e2 y ) ;自定义lisp命令=tt , e1 e2 y 局部化避免变量冲突

  (if
    (and (setq e1 (car (entsel "\n选取第一条曲线 "))) ; 储存于变量e1
           (setq e2 (car (entsel "\n选取第二条曲线 "))) ; 储存于变量e2
           (setq y (cond  ((getint "\nDivide by # ? ")) (5))) ;平分默认值=5
           ) ; 储存于变量 y

    (foreach x (vlax-curve-DivideBetweenPair e1 e2 y) ; 把各自有效变量使用于函数参数,返回值=坐标表

;画线需要开始&终点
;利用cdr分成两个序列表 A B C D ...
;(A B C D) 陪对 (B C D) ...

;以mapcar迭代表值以用于绘画功能
;A-B,B-C,C-D etc.. 符合线型表达
      ;(mapcar ''((a b) (grdraw a b 1)) x (cdr x)) ;以grdraw函数瞬态绘画A-B,B-C,C-D....
      (Entmake-Spline x)
      )
    (princ "\n退出?") ;如果选取无效退出
    )
  (princ) ; 无痕迹退出
)

(defun Entmake-Spline (ptn / a)
  (entmake (append (list '(0 . "SPLINE")
                         '(100 . "AcDbEntity")
                         '(100 . "AcDbSpline")
                         '(71 . 3)
                   )
                   (mapcar '(lambda (pt) (cons 11 pt)) ptn)
           )
  )
  (entlast)
)

点评

利用曲线模拟,更加逼真,让我获益匪浅!感谢两位的指导!  发表于 2018-10-30 19:14
对,SPLINE曲线这才完美! p/s:开源函数的好处是在与其它人交流过程也可以获益引发更多思路,谢谢前辈 :) 小小建议 entmake + 'x' 直接entmakex 可省略 (entlast)  发表于 2018-10-30 18:50
回复 支持 3 反对 0

使用道具 举报

发表于 2018-10-30 01:58 | 显示全部楼层
本帖最后由 lisperado 于 2018-10-30 02:12 编辑
20060510412 发表于 2018-10-29 19:24
个人感觉貌似还有几点可以改进一下:
1.生成的是直线,改为多段线是否更方便选取。
2.对于边界为直线的 ...

当然可行只是故意让你自己从思路中学习如何优化...

以下思路, 请自行明经社区里搜索应该会好多画多段线函数
1.无需代码:先选取程序所画的线(或过滤其图层)以命令: _PEDIT JOIN 可解决!
2.命令方式 : PLINE
3.entmake方式 : LWPOLYLINE
4.activeX方式:vla-AddLightWeightPolyline
推荐方法之3以参考 , 其它自行搜索&研究
在这里是以 'x' 变量表达
  1. (foreach x (vlax-curve-DivideBetweenPair e1 e2 y)
  2. ;;;      (mapcar ''((a b) (grdraw a b 1) ) x (cdr x))
  3.          (entmakex (vl-list* '(0 . "LWPOLYLINE")
  4.                             '(100 . "AcDbEntity")
  5.                             '(100 . "AcDbPolyline")
  6.                             '(62 . 1)
  7.                             (cons 70 0)
  8.                             (cons 90 (length x))
  9.                             (mapcar '(lambda (x) (cons 10 x) ) x)
  10.                             )
  11.                   )

  12.       )









回复 支持 3 反对 0

使用道具 举报

发表于 2018-10-28 01:53 | 显示全部楼层
试试上传图片
[img]%5Bimg%5D[/img]

点评

好厉害,代码能不能分享一下!  发表于 2018-10-28 22:01
回复 支持 2 反对 0

使用道具 举报

发表于 2018-10-28 06:20 | 显示全部楼层
顶出源码学习
发表于 2018-10-28 14:52 | 显示全部楼层
顶出源码学习!!!!!
 楼主| 发表于 2018-10-28 21:57 | 显示全部楼层
感谢帮助,感谢提供源码

不知道为何,我看不到图片,所以没有及时回复,

我看到的是一直图片如下:



本帖子中包含更多资源

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

x
发表于 2018-10-29 00:13 | 显示全部楼层
gamexia 发表于 2018-10-28 21:57
感谢帮助,感谢提供源码

不知道为何,我看不到图片,所以没有及时回复,

起初我用手机版也看不见,之后试电脑版打开网页才可见。
请看明经页面最下方项选
发表于 2018-10-29 08:11 | 显示全部楼层
谢谢! lisperado 分享程序!!!!!
发表于 2018-10-29 08:46 | 显示全部楼层
lisp菜鸟,只给函数源码,还是不会使用......
 楼主| 发表于 2018-10-29 09:28 | 显示全部楼层
lisperado 发表于 2018-10-28 21:03
谢谢l顶上
但不见原版主回复所以只提供函数 ,其他用法只需自行更改参数吧!

感谢提供函数,完整的lisp也分享一下吧,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 03:37 , Processed in 0.187376 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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