路线缓和曲线绘制,可以实现非对称缓和曲线绘制,可以根据自己需要重新绘图
本帖最后由 huahuaji 于 2018-2-6 12:48 编辑程序是结合明经cad中的画缓和曲线的程序自己加了一些功能,如下:
1、可以自己输入圆半径或者点选途中的圆获取圆半径
2、可以绘制非对称缓和曲线
3、画出缓和曲线之后,如果觉得不适合,可以重新绘制
存在的几点不足:
1、以后希望能够绘制出不同颜色的直、曲、圆
2、希望能实现纬地中的智能布线的功能,交互工作。
3、编写DCL,实现界面化
如有好的解决方法,相互讨论哇
软件很好用如果可以有默认的选项的话就更好了。 修改了一下,可用了,精度未验证
;http://bbs.mjtd.com/forum.php?mod=viewthread&tid=176586&extra=&highlight=%BB%BA%BA%CD%C7%FA%CF%DF&page=1
;多义线摹拟缓和曲线。
;;输入起止直线、半径、缓和曲线长或设计车速。
;;命令:HH
(defun com_p (/)
(setq l 0)
(command "ucs" "o" (list (- 0 x1) 0 0));;设置自定义坐标原点
(setvar "cecolor" "3");设置对象颜色
(command "pline" (list 0 0 0) "w" "0" "";;画多段线
(repeat M
(setq l (+ l (/ Ls M))
x (+ (- l (/ (* l l l l l) 40 C C)) (/ (* l l l l l l l l l) 3456 C C C C))
y (* id__ (+ (- (/ (* l l l) 6 C) (/ (* l l l l l l l) 336 C C C)) (/ (* l l l l l l l l l l l) 42240 C C C C C)))
);setq end
(command (list x y 0))
);repaet end
);commandend
(setq pt5 (trans (list x y 0) 1 0));(trans 点 原位置 新位置[位移]) 返回:转换坐标系统值
);com_p end
(defun ll_d()
(setq os (getvar "osmode"))
(setvar "osmode" 0)
(setq Ls ls1
qq1 (- (+ (- (/ Ls 2) (/ (* Ls Ls Ls) 240 R R)) (/ (* Ls Ls Ls Ls Ls) 34560 R R R R)) (/ (* Ls Ls Ls Ls Ls Ls Ls) 8386560 R R R R R R))
pp1 (+ (- (/ (* Ls Ls) 24 R) (/ (* Ls Ls Ls Ls) 2688 R R R)) (/ (* Ls Ls Ls Ls Ls Ls) 506880 R R R R R))
pt1 (cdr (assoc 10 (entget (car p1))))
pt2 (cdr (assoc 11 (entget (car p1))))
pt10 (polar pt1 (angle pt1 pt2) (/ (distance pt1 pt2) 2))
pt3 (cdr (assoc 10 (entget (car p2))))
pt4 (cdr (assoc 11 (entget (car p2))))
pt20(polar pt3 (angle pt3 pt4) (/ (distance pt3 pt4) 2))
jd(inters pt1 pt2 pt3 pt4 nil);求交点
alf1(angle pt10 jd)
alf2(angle pt20 jd)
alf (- (angle jd pt20) alf1)
);setq
(setq Ls ls2
qq2 (- (+ (- (/ Ls 2) (/ (* Ls Ls Ls) 240 R R)) (/ (* Ls Ls Ls Ls Ls) 34560 R R R R)) (/ (* Ls Ls Ls Ls Ls Ls Ls) 8386560 R R R R R R))
pp2 (+ (- (/ (* Ls Ls) 24 R) (/ (* Ls Ls Ls Ls) 2688 R R R)) (/ (* Ls Ls Ls Ls Ls Ls) 506880 R R R R R))
)
(if (or (> alf pi) (and (< alf 0) (> alf (- 0 pi))))
(progn
(setq id__ -1)
(if (> alf pi) (setq alf (- (+ pi pi) alf)) (setq alf (abs alf)))
);progn
(progn
(setq id__ 1)
(if (<= alf (- 0 pi)) (setq alf (+ pi pi alf)))
);progn
);if
(setqC (* ls1 R)
ls ls1
x0(-(/ (* (+ pp1 R) (sin(/ alf 2.0))) (cos(/ alf 2.0)))(/(- pp1 pp2) (sin alf)) )
x1(+ x0 qq1);切线长
C1(+ (*alf R) Ls);曲线长
E (- (/ (+ R pp1) (cos(/ alf 2))) R);外矢距
);setq
(command "ucs" "o" jd)
(command "ucs" "z" (/ (* 180 alf1) pi))
(com_p)
(setq pt6 pt5)
(setq ppt1 (list x1 0 0))
(command "ucs" "")
(if (> (abs(distance jd pt1)) (abs(distance jd pt2)))
(setq ptt1 pt1)
(setq ptt1 pt2)
);if
(setq ptt2 (polar jd alf1 (- 0 x1)))
(thh p1 ptt1 10)
(thh p1 ptt2 11)
(command "ucs" "o" jd)
(command "ucs" "z" (/ (* 180 alf2) pi))
(setq id__ (- 0 id__))
(setq C (* ls2 R)
ls ls2
x0(+(/ (* (+ pp2 R) (sin(/ alf 2.0))) (cos(/ alf 2.0))) (/(- pp1 pp2) (sin alf)))
x1(+ x0 qq2);切线长
Cl(+ (*alf R) Ls);曲线长
E (- (/ (+ R pp2) (cos(/ alf 2))) R);外矢距
);setq
(com_p)
(setq ppt2 (list x1 0 0))
(command "ucs" "")
(if (> (abs(distance jd pt3)) (abs(distance jd pt4)))
(setq ptt3 pt3)
(setq ptt3 pt4)
);if
(setq ptt4 (polar jd alf2 (- 0 x1)))
(thh p2 ptt3 10)
(thh p2 ptt4 11)
(setvar "cecolor" "1");设置对象颜色
(if (= id__ 1) (command "arc" pt5 "e" pt6 "r" R) (command "arc" pt6 "e" pt5 "r" R))
(setq alfd (angf alf))
(setvar "osmode" os)
(command "cmdecho" "1")
(setq strcat_QXYS (strcat (strcat "偏 角=" alfd) "\n半 径=" (rtos R 2 2) "\n切 线 长=" (rtos x1 2 2) "\n曲 线 长=" (rtos Cl 2 2)"\n外 距=" (rtos E 2 2) "\n缓和曲线长=" (rtos Ls 2 2) ) );曲线要素
(setq pt (getpoint "\n指定曲线要素位置: "))
(entmake (list '(0 . "MTEXT")
'(100 . "AcDbEntity")
'(100 . "AcDbMText")
'(62 . 3)
(cons 1 strcat_QXYS ) ;
(cons 10pt )
(cons 40 5 )
'(71 . 1)
'(72 . 5)
(cons 50 0)
(cons 8 "中心")
)
) ;;书写曲线要素
(entmake (list '(0 . "LINE")
(cons 10 Pt1 )
(cons 11 Pt2 )
(cons 8 "中心")
(cons 62 6)
)
)
(entmake (list '(0 . "LINE")
(cons 10 Pt3 )
(cons 11 Pt4 )
(cons 8 "中心")
(cons 62 6)
)
)
(setvar "cecolor" "7");设置颜色
);ll_d
;(defun ll_v()
;(setq V (getreal "\n输入速度(km/h):")
; Ls1 (* V 0.85)
; Ls2 (/ (* 0.0357 V V V) R)
; Ls(max Ls1 Ls2 (/ R 9))
;Ls(* (fix (/ Ls 10)) 10.0)
;);setq
;(if (> Ls R) (setq Ls R))
;(ll_d)
;)ll_v
(defun angf (alf)
(setq alff (angtos alf 1 4);angtos 将一个以弧度为单位的角度值转换成字符串,1表示度分秒,4表示精度
n 1
kk (strlen alff));(strlen 字符串)返回:字符串构成的字符数(即字符串长度)
(repeat kk
(setq alfn (substr alff n 1));(substr字符串 起始 长度)返回:取出于字符串
(if (= alfn "d")
(setq nn n));if
(setq n (+ n 1))
);repeat
(strcat (substr alff 1 (- nn 1)) "%%" (substr alff nn))
);angf,角度弧度值变为度分秒
(defun ND()
(setq newdraw (getstring "\n重画输入 hh,绘制下一段曲线:"))
(if(= newdraw "hh")
(c:hh)
)
)
(defun c:hh(/ p1 p2 pt1 pt2 pt3 pt4 pt5 pt6 pt10 pt20 id__RLs E ls1 ls2
r1 x y l x0 x1 C jd alf alf1 alf2 qq1 qq2 pp1 pp2 ClM newdraw NN)
(command "ucs" "")
(setq p1 nil p2 nil)
(while (= p1 nil) (setq p1 (entsel "\n拾取第一条直线<Line>:")))
(redraw (car p1) 3)
(while (= p2 nil) (setq p2 (entsel "\n拾取第二条直线<Line>:")))
(redraw (car p2) 3)
(initget 1)
(setq NN (getint "\n点取圆(1) or 输入圆半径(2):"))
(if(= NN 1) (setq R (cdr (assoc 40 (entget (car (entsel "\n拾取圆:")))))))
(if(= NN 2) (setq R (getdist "\n请输入弯道半径 R:")))
;(initget 1 "Ls V")
;(setq ls1 (getdist "\n输入缓和曲线长度(Ls1):"))
;(setq ls2 (getdist "\n输入缓和曲线长度(Ls2): "))
;(setq M (getint "\n输入缓和曲线段数<例>:"))
(or ls1_old
(setq ls1_old 80)
)
(princ "\n输入第一段缓和曲线段长度(Ls1)<")
(princ ls1_old)
(if (setq tmp (getreal ">: "))
(setq ls1_old tmp)
)
(setq ls1 ls1_old);第一段
(or ls2_old
(setq ls2_old 120)
)
(princ "\n输入第二缓和曲线段长度(Ls2)<")
(princ ls2_old)
(if (setq tmp (getreal ">: "))
(setq ls2_old tmp)
)
(setq ls2 ls2_old);第二段
(or M_old
(setq M_old 100)
)
(princ "\n输入缓和曲线分段数<")
(princ M_old)
(if (setq tmp (getint ">: "))
(setq M_old tmp)
)
(setq M M_old);
;(if (= p3 "V") (ll_v) (progn))
(ll_d)
(ND)
(princ)
);eline
(defun thh (len pt h /);修改len的参数 len为线,pt为点,h为10 或 11
(setq en_data (entget (car len));entget获得对象的定义数据 (entget ename ) 参数 ename 要查询的图元的名称。ename 可以为图形或非图形图元。 applist 注册应用名的列表
old_data (assoc h en_data);(assoc关键元素 联合列表)根据关键元素找寻联合列表中关系信息
new_data (cons h pt);(cons新元素 列表)返回:将新元素添加到列表
en (subst new_data old_data en_data)
);setq(subst新项旧项列表)返回:替换新旧列表后的列表
(entmod en);(entmod对象列表)根据更新的信息列表更新屏幕上元体
);thh 本帖最后由 skg123 于 2024-6-14 22:09 编辑
p-3-ianlcc 发表于 2024-6-14 09:12
謝謝您的分享!
請問這二個檔案有什麼差別呢?
還滿需要這方面的插件~~
今晚研究了,感觉精度不行。
完整缓和曲线和非完整缓和曲线交点法坐标计算应用
完整缓和曲线和非完整缓和曲线交点法坐标计算应用_不完整缓和曲线-CSDN博客
https://blog.csdn.net/starmings/article/details/126614777
测量助理专业版V3.0.221225
测量助理专业版V3.0.221225_路桥365 (luqiao365.cn)http://www.luqiao365.cn/ruanjianxiazai/106.html
声明一下,本人不认识博主,上面的链接是软件下载地址,非推销,有需要的自己研究
不错,支持 感谢分享! 命令: HH
拾取第一条直线:
拾取第二条直线:
点取圆(1)or输入圆半径(2):10
输入缓和曲线长度(Ls1):
输入缓和曲线长度(Ls2):
输入缓和曲线精度:
参数类型错误: numberp: nil
好像最后才错误,是不是我操作出错了? 不知道缓和曲线精度是什么东东? 下载来试试。 如此计算,缓和曲线精度有限。
分享一个关于缓和曲线精确计算的通用函数:https://mp.weixin.qq.com/s/nggqbDkpnFajkHiQFCSdFg
如此计算,缓和曲线精度有限。
分享一个关于缓和曲线精确计算的通用函数:https://mp.weixin.qq.com/s/nggqbDkpnFajkHiQFCSdFg
这个缓和曲线能像PL线那样就好了。而不是样条曲线。
页:
[1]
2