找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 40|回复: 4

[编程申请] 波浪线绘制

[复制链接]

已领礼包: 33个

财富等级: 招财进宝

发表于 前天 10:16 | 显示全部楼层 |阅读模式
悬赏100D豆未解决
本帖最后由 King、 于 2025-11-24 10:18 编辑


                               
登录/注册后可看大图

ScreenShot_2025-11-24_101737_846.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 33个

财富等级: 招财进宝

 楼主| 发表于 昨天 08:15 | 显示全部楼层
自己写个半成品,在慢慢写
(defun c:tt ( / )
  (setq mspace (vla-get-modelspace(vla-get-activedocument(vlax-get-acad-object))))
        (setq bulge1 0.198912) ;起始点和终点处凸度
        (setq bulge2 0.414214) ;中间点凸度
        (setq len 0.54852814)  ;一个波峰到波谷距离
        (setq h -0.3)          ;深度
  (setq p1 (getpoint "\n请输入起点: "))
  (setq p2 (getpoint p1 "\n请输入终点: "))
  (setq len1 (distance p1 p2));计算起点到终点的长度
  (setq ang (angle p1 p2));计算起点到终点的角度  
  (setq n (fix (/ len1 len)));最大波数
        (setq len2 (* len n));最大波数需要的长度
        (setq len3 (/ (- len1 len2) 2));计算起点偏移长度
        (setq newp1 (polar p1 ang len3));计算起点偏移点坐标
        (setq startpt newp1);起点坐标
        (setq nn n);保存原始n值
  (setq ptlst (list startpt));初始化点列表  
  ;循环生成多段线的中间顶点
        (setq i 1 )
  (while (<= i nn)
                (if (not (zerop (rem i 2))) ;判断是n否为奇数
                        ;奇数
                        (progn
                                (setq p (polar startpt ang (* len i)))
                                (setq p (polar p (+ ang (/ pi 2)) h))
                                (setq ptlst (cons p ptlst))                       
                        )
                        ;偶数
                        (progn
                                (setq p (polar startpt ang (* len i)))
                                (setq ptlst (cons p ptlst))
                        )
                )
                (setq i (1+ i))
        )       
        (setq ptlst (reverse ptlst))
        (Make-LWPOLYLINE ptlst)
)
(defun Make-LWPOLYLINE (lst / PT)
  (entmakeX
                (append
                        (list
                                '(0 . "LWPOLYLINE")
                                '(100 . "AcDbEntity")
                                '(100 . "AcDbPolyline")
                                (cons 90 (length lst))
                        )
                        (mapcar '(lambda (pt) (cons 10 pt)) lst)
                )
  )
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 33个

财富等级: 招财进宝

 楼主| 发表于 昨天 13:24 | 显示全部楼层
思路应该是错了,在研究研究
(defun c:tt ( / )
  (setq mspace (vla-get-modelspace(vla-get-activedocument(vlax-get-acad-object))))
        (setq w 0.54852814);一个波峰到波谷宽度
  (setq h -0.3);波峰到波谷高度
        (setq bulge2 0.414214);中间段凸度
  (setq bulge1 (/ bulge2 2.0));起始段和终点段凸度
  (setq p1 (getpoint "\n请输入起点: "))
  (setq p2 (getpoint p1 "\n请输入终点: "))
  (setq len1 (distance p1 p2));计算起点到终点的长度
  (setq ang (angle p1 p2));计算起点到终点的角度  
  (setq n (fix (/ len1 w)));最大波数
        (setq len2 (* w n));最大波数需要的长度
        (setq len3 (/ (- len1 len2) 2));计算起点偏移长度
        (setq startpt (polar p1 ang len3));计算起点偏移点坐标       
  (setq ptlst (list startpt));初始化点列表  
  ;循环生成多段线的中间顶点
        (setq i 1 )
  (while (<= i n)
                (if (not (zerop (rem i 2))) ;判断是否为奇数
                        ;奇数
                        (progn
                                (setq p (polar startpt ang (* w i)))
                                (setq p (polar p (+ ang (/ pi 2)) h))
                                (setq ptlst (cons p ptlst))
                        )
                        ;偶数
                        (progn
                                (setq p (polar startpt ang (* w i)))
                                (setq ptlst (cons p ptlst))
                        )
                )
                (setq i (1+ i))
        )       
        (setq ptlst (reverse ptlst))
        ;计算每段线中点坐标
        (setq endpt (last ptlst))
        (setq midptlst '())
        (while (cadr ptlst)
                (setq midpt (mapcar '(lambda (x y) (/ (+ x y) 2.)) (car ptlst) (cadr ptlst)))
                (setq midptlst (cons midpt midptlst))
                (setq ptlst (cdr ptlst))
        )
        ;加入终点和起点坐标
        (setq pl_lst (reverse (cons endpt midptlst)))
        (setq pl_lst (cons startpt pl_lst))
        ;创建多段线       
        (setq tmp nil)
        (foreach pt pl_lst
                (setq tmp (append tmp (list (car pt) (cadr pt))))
        )
        (setq pline (vlax-invoke mspace 'AddLightWeightPolyline tmp))
        ;设置凸度
        (setq nn (- (length pl_lst) 1))
        (setq ii 0)
        (while (<= ii nn)
                (cond
                        ;起始段和终点段凸度
                        ((or (= ii 0) (= ii (- nn 1)))
                                (vla-SetBulge pline ii (- bulge1))
                        )
                        ;中间段凸度
                        (t
                                (if (not (zerop (rem ii 2)))
                                        (vla-SetBulge pline ii bulge2);奇数段
                                        (vla-SetBulge pline ii (- bulge2));偶数段
                                )
                        )
                )
                (setq ii (1+ ii))
        )       
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 33个

财富等级: 招财进宝

 楼主| 发表于 昨天 14:46 | 显示全部楼层
还是有问题,在研究研究
(defun c:tt ( / )
  (setq mspace (vla-get-modelspace(vla-get-activedocument(vlax-get-acad-object))))
        (setq w 0.54852814);一个波峰到波谷宽度
  (setq h -0.3);波峰到波谷高度
  (setq bulge 0.198912);1/8圆凸度
  (setq p1 (getpoint "\n请输入起点: "))
  (setq p2 (getpoint p1 "\n请输入终点: "))
  (setq len1 (distance p1 p2));计算起点到终点的长度
  (setq ang (angle p1 p2));计算起点到终点的角度  
  (setq n (fix (/ len1 w)));最大波数
        (setq len2 (* w n));最大波数需要的长度
        (setq len3 (/ (- len1 len2) 2));计算起点偏移长度
        (setq startpt (polar p1 ang len3));计算起点坐标       
  (setq ptlst (list startpt));初始化点列表  
  ;循环生成多段线的中间顶点
        (setq i 1 )
  (while (<= i n)
                (if (not (zerop (rem i 2))) ;判断是否为奇数
                        ;奇数
                        (progn
                                (setq p (polar startpt ang (* w i)))
                                (setq p (polar p (+ ang (/ pi 2)) h))
                                (setq ptlst (cons p ptlst))
                        )
                        ;偶数
                        (progn
                                (setq p (polar startpt ang (* w i)))
                                (setq ptlst (cons p ptlst))
                        )
                )
                (setq i (1+ i))
        )       
        (setq ptlst (reverse ptlst))
        ;计算每段线中点坐标
        (setq endpt (last ptlst))
        (setq midptlst '())
        (setq tmp_ptlst ptlst)
        (while (cadr tmp_ptlst)
                (setq midpt (mapcar '(lambda (x y) (/ (+ x y) 2.)) (car tmp_ptlst) (cadr tmp_ptlst)))
                (setq midptlst (cons midpt midptlst))
                (setq tmp_ptlst (cdr tmp_ptlst))
        )
        (setq midptlst (reverse midptlst))
        ;点列表:起点、中点1、点1、中点2、点2、...、终点
        (setq pl_lst (list startpt))
        (setq j 0)
        (repeat (length midptlst)
                (setq pl_lst
                        (append pl_lst
                                (list
                                        (nth j midptlst)
                                        (nth (1+ j) ptlst)
                                )
                        )                       
                )
                (setq j (1+ j))
        )
        (setq pl_lst (append pl_lst (list endpt)))
        ;创建多段线       
        (setq tmp nil)
        (foreach pt pl_lst
                (setq tmp (append tmp (list (car pt) (cadr pt))))
        )
        (setq pline (vlax-invoke mspace 'AddLightWeightPolyline tmp))
        ;设置凸度
        (setq nn (- (length pl_lst) 1))
        (setq ii 0)
        (while (< ii nn)
                (cond
                        ((or (= (rem ii 4) 0) (= (rem ii 4) 3))
                                (vla-SetBulge pline ii (- bulge))                               
                        )
                        ((or (= (rem ii 4) 1) (= (rem ii 4) 2))
                                (vla-SetBulge pline ii bulge)                               
                        )
                )
                (setq ii (1+ ii))
        )               
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 33个

财富等级: 招财进宝

 楼主| 发表于 昨天 14:54 | 显示全部楼层
知道错误地方,圆弧与圆弧中间还有条线
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-11-26 10:34 , Processed in 0.427620 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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