C画缓和曲线lisp程序

合集下载

道路设计缓和曲线参数宏代码

道路设计缓和曲线参数宏代码

道路设计缓和曲线参数宏代码#include <iostream>#include <cmath>using namespace std;//定义道路设计缓和曲线参数类class CurveParameterspublic:double a; // 起始切线方向的角度double L; // 缓和曲线的长度double R; // 设计半径double t; // 缓和曲线的斜率double C; // 离心力系数double e; // 铁路曲线的指数//构造函数CurveParameters(double a, double L, double R, double t, double C, double e)this->a = a;this->L = L;this->R = R;this->t = t;this->C = C;this->e = e;}//获取缓和曲线参数的函数void GetCurveParameterdouble B = atan(t);double C1 = sqrt(pow(R, 2) - pow(C, 2));double C2 = sqrt(pow(R, 2) - pow(C + e * R, 2)); double gamma = atan(C1 / C);double beta = 2 * asin(C2 / R) - 2 * gamma;double alpha = B - gamma;double delta = beta - alpha;double Lc = sqrt(pow(R, 2) - pow(C1, 2)) + C * gamma; double Od = Lc + L;double w = 2 * R * sin(delta / 2);double s = Od - w;double p = pow(w, 2) / (24 * R);double Pc = (w + L) / (2 * C);cout << "起始切线方向的角度 a: " << a << endl; cout << "缓和曲线的长度 L: " << L << endl;cout << "设计半径 R: " << R << endl;cout << "缓和曲线的斜率 t: " << t << endl;cout << "离心力系数 C: " << C << endl;cout << "铁路曲线的指数 e: " << e << endl;cout << "缓和曲线的参数为:" << endl;cout << "曲线运用长度 Lc: " << Lc << endl;cout << "曲线全长 Od: " << Od << endl;cout << "缓和曲线的半宽 w: " << w << endl;cout << "缓和曲线的中线长度 s: " << s << endl; cout << "缓和曲线的参数 p: " << p << endl;cout << "缓和曲线的参数 Pc: " << Pc << endl;}};int maidouble a, L, R, t, C, e;cout << "请输入起始切线方向的角度 a(弧度):"; cin >> a;cout << "请输入缓和曲线的长度 L(米):"; cin >> L;cout << "请输入设计半径 R(米):";cin >> R;cout << "请输入缓和曲线的斜率 t:";cin >> t;cout << "请输入离心力系数 C:";cin >> C;cout << "请输入铁路曲线的指数 e:";cin >> e;CurveParameters curve(a, L, R, t, C, e); curve.GetCurveParameters(;return 0;。

LISP 语言在CAD 道路设计中的各种应用

LISP 语言在CAD 道路设计中的各种应用

第三章LISP语言在CAD道路设计中的各种应用3.1绘制平面任意函数曲线的AutoLISP程序设计在各个工程设计领域中,经常要绘制一些曲线,特别是平面曲线,如水工结构的溢流曲线、机械设计的齿轮渐开曲线等。

在AutoCAD绘图软件中,可以将曲线上的点先计算好,再用线、多义线、样条曲线等方法绘制,这种方法需要进行大量计算,工作量较大,如果用EXCEL软件来辅助计算,可以减轻工作量;另外,可以针对具体的曲线类型,用AutoCAD 内嵌的AutoLISP语言,实现边计算边绘制的功能。

用这种方法绘制虽然快捷,但对于不同的曲线,则需编写同的AutoLISP程序,检查无误后才能运行,仍显繁琐。

能否用统一的程序,来实现各种平面函数曲线的绘制,我们尝试利用AutoCAD中强大的表达式计算功能来实现这一目的。

3.1.1平面函数曲线的类型和绘制方法平面函数曲线即是有简单函数表达式的曲线类型,可考虑经常遇到的4类:(1)直角坐标下形如y=f(x)的曲线;(2)直角坐标下的参数方程曲线;(3)极坐标下形如r=f(θ)的曲线;(4)极坐标下的参数方程曲线。

其中,只需增加一个平凡方程x=x,参数方程(2)就可以包括相应的直接表达形式(1),同样(4)可以包括(3)。

同时,极坐标形式可以通过:x=rcosθy=rsinθ转换为直角坐标表达。

因此从本质上说,4种类型都可以互相转换,把它们分类的目的是尽量采用函数的通常表达形式,以便于使用。

绘制时,参照曲线的手工绘制方法,需要给出曲线上的多个点,然后将它们连接起来。

若给出的点间隔很小,直接用折线段相连就可很好模拟该曲线,如果间隔较大,可以用样条曲线连接,使之比较光滑。

假设我们计算出足够多的点,简单用折线连接即可,为使该曲线成为一个整体,可用多义线的方式连接。

关键的问题是,如何计算出曲线上点的坐标。

由于曲线的函数表达式各种各样,不可能用统一的式子来表示。

可以考虑从外部输入表达式,然后针对该表达式进行计算,给出相应结果,就能够解决点坐标的计算问题。

CAD画缓和曲线lisp程序

CAD画缓和曲线lisp程序

CAD画缓和曲线lisp程序CAD中画缓和曲线,首先复制本文☆后面的源程序保存至cad安装目录的SUPPORT文件夹,保存类型为.lsp可以随便复制一个SUPPORT文件夹内的lsp 文件,然后替换本文的程序。

打开CAD后,输入appload回车,找到你保存的缓和曲线lsp程序,点击加载,然后就可以画缓和曲线了。

首先,要画出缓和曲线的两条直线,然后输入HH回车,按提示完成缓和曲线。

注:本程序,缓和曲线段拟合长度为0.4m,如需更改拟合长度,将程序的第8行(repeat(FIX(/Ls0.4))及9行(setql(+l(/Ls(FIX(/Ls0.4))))中的0.4修改即可。

☆;;多义线摹拟缓和曲线。

;;输入起止直线、半径、缓和曲线长或设计车速。

;;命令:HH(defun_p()(setql0)(mand\(mand\(repeat(FIX(/Ls0.4))(setql(+l(/Ls(FIX(/Ls0.4))))x(+(-l(/(*lllll)40CC))(/(*lllllllll)3456CCCC))y(*id__(+(-(/(*lll)6C)(/(*lllllll)336CCC))(/(*lllllllllll)42240CCCCC))));setq(mand(listxy0)));repaet);mand(setqpt5(trans(listxy0)10)));_p(defunll_v()(setqV(getreal\Ls1(*V0.85)Ls2(/(*0.0357VVV)R)Ls(maxLs1Ls2(/R9))Ls(*(fix(/Ls10))10.0));setq(if(>LsR)(setqLsR))(ll_d));ll_v(defunll_d()(setqos(getvar\(setvar\(setqC(*LsR)q(-(+(-(/Ls2)(/(*LsLsLs)240RR))(/(*LsLsLsLsLs)34560RRRR))(/(*LsLsLsLsLsLsLs)8386560RRRRRR))pt1(cdr(assoc10(entget(carp1))))pt2(cdr(assoc11(entget(carp1))))pt10(polarpt1(anglept1pt2)(/(distancept1pt2)2))pt3(cdr(assoc10(entget(carp2))))p t4(cdr(assoc11(entget(carp2))))pt20(polarpt3(anglept3pt4)(/(distancept3pt4)2))p(+(-(/(*LsLs)24R)(/(*LsLsLsLs)2688RRR))(/(*LsLsLsLsLsLs)506880RRRRR) )jd(interspt1pt2pt3pt4nil)alf1(anglept10jd)alf2(anglept20jd)alf(-(anglejdpt20)alf1));setq(if(or(>alfpi)(and(alf(-0pi))))(progn(setqid__-1)(if(>alfpi)(setqalf(-(+pipi)alf))(setqalf(absalf))));progn(progn(setqid__1)(if((abs(distancejdpt1))(abs(distancejdpt2)))(setqptt1pt1)(setqptt1pt2));if(setqptt2(polarjdalf1(-0x1)))(thhp1ptt110)(thhp1ptt211)(if(>(abs(distancejdpt3))(abs(distancejdpt4)))(setqptt3pt3)(setqptt3pt4));if(setqptt4(polarjdalf2(-0x1)))(thhp2ptt310)(thhp2ptt411)(if(=id__1)(mand\(setqalfd(angfalf))(setvar\(mand\(mand\偏角=\(mand\(mand\(strcat\半径=\(mand\(strcat\切线长=\(mand\(strcat\曲线长=\(mand\(strcat\外距=\(mand\(strcat\缓曲长=\);ll_d(defunangf(alf)(setqalff(angtosalf14)n1kk(strlenalff))(repeatkk(setqalfn(substralffn1))(if(=alfn\(setqnnn));if(setqn(+n1)));repeat(strcat(substralff1(-nn1))\);angf(defunc:hh(/p1p2pt1pt2pt3pt4pt5pt6pt10pt20id__RVLsEp3r1xylx0x1Cjdalfalf1al f2qpClLs1Ls2)(mand\(setqp1nilp2nil)(while(=p1nil)(setqp1(entsel\拾取第一条直线:\(redraw(carp1)3)(while(=p2nil)(setqp2(entsel\拾取第二条直线:\(redraw(carp2)3)(initget1)(setqR(getdist\请输入圆曲线半径R:\(initget1\(setqp3(getdist\输入缓和曲线长度(Ls)或[设计速度(V)]:\(if(=p3\(princ));eline (defunthh(lenpth)(setqen_data(entget(carlen))old_data(assochen_data)new_data(conshpt)en(substnew_dataold_dataen_data));setq(entmoden));thh。

CAD里面如何绘制缓和曲线

CAD里面如何绘制缓和曲线

CAD里面如何绘制缓和曲线
缓和曲线是曲线的一种,我们在CAD中无法直接绘制,没有工具和命令,所以需要下载一个工具。

那么大家知道CAD里面如何绘制缓和曲线吗?下面是小编整理的CAD里面如何绘制缓和曲线的方法,希望能帮到大家!
CAD里面绘制缓和曲线的方法下载一个缓和曲线.LSP工具。

解压下载好的压缩文件,复制解压好的缓和曲线.LSP。

把它拷贝到你的CAD安装包中的support文件中。

加载程序
打开cad,输入加载命令ap。

进入程序加载框,找到CAD安装的位置和support文件夹。

找到缓和曲线.LSP工具,选中它,点击加载。

然后再点击关闭。

绘制曲线
程序加载完成后,就可以绘制缓和曲线了。

根据提供的信息,作出曲线的两条切线。

输入绘制缓和曲线的命令hh,回车。

选择第一条直线,点击第一条切线上任意即可。

选中第二条直线,点击第二条切线任意一点即可。

根据提供的曲线要素,输入曲线的半径,例如本次输入为半径500,回车。

根据提供的曲线要素,输入缓和曲线的长度,例如本次输入的长
度为20,回车。

完成以上步骤后,系统进入自动绘图,稍等片刻,完成绘图。

曲线要素标注
指定曲线要素标注文字的位置。

调整字体的大小,细化它的位置,完成绘制。

测设缓和曲线和圆曲线的程序

测设缓和曲线和圆曲线的程序

测设缓和曲线和圆曲线的程序(ƒx-4800p)说明:W---W=0时在圆曲线上设站测设圆曲线;W=1时在缓和曲线上设站测设缓和曲线;W=2时在缓和曲线上设站测设圆曲线;Z---ZH(或HZ)的桩号;C---测站的桩号;H---HY(或YH)的桩号;R---半径;A---缓和曲线参数;N---N=0时前视,N=1时后视;L---缓和曲线长度。

程序:W:Z:C:H:R:A:N:L↙Lbi1↙〔I〕↙W=0=>J=Abs(C-I)÷2÷R×180÷π◢S=2×R×SinJ◢ GOTO 1⊿↙W=1=>J=180×Abs(I-C)×(3×Abs(Z-C)+(-1)^N ×Abs(I-C))÷6 ÷π÷R÷L◢P=(Abs(Z-C)÷Abs(I-Z))^(1-2×N):S= Abs(I-C)-(Abs(I-Z))^5×(0.8-P-P^2+P^3+P^4-0.8 ×P^5)÷72÷R^2÷L^2◢ GOTO 1⊿↙W=2=>E=(Abs(C-H)÷6÷A^2×(3×Abs(Z-H)+Abs(C-H)))×180÷π:F=(Abs(C-H)÷6÷A^2×(3×Abs(Z-C)+Abs(C-H)))×180÷π:P=Abs(C-Z)÷Abs(H-Z):Q= Abs(C-H)-(Abs(H-Z))^5÷72÷A^4×(0.8-P-P^2+P^3+P^4-0.8×P^5):M= Abs(I-H)÷2÷R×180÷π: G=180-(E+M):S=√(Q^2+(2×R×SinM)^2-2×Q×2×R×SinM×COSG ◢J=Sin-1(2×R×SinM×SinG÷S)+F◢ GOTO 1⊿↙结束直线、缓和曲线、圆曲线坐标计算方法(ƒx-4800p)说明:W---W=0时计算直线段坐标;W=1时计算缓和曲线段坐标;W=2时计算圆曲线段;E---已知点的X0坐标;F---已知点的Y0坐标;Q---已知点的桩号;R---半径;A---缓和曲线参数;N---N=0时右偏,N=1时左偏;M---M=0时ZH(ZY或HY)为起点,M=1时HZ(YZ或YH) 为起点;J---已知的坐标方位角;I---计算点的桩号。

CADLISP程序

CADLISP程序

1. 计算所有线段总长度(加载后只需框选所有线段便可得出这些线段的总长度) (defun c:LL ()(setvar "cmdecho" 1)(setq en ( ssget (list '(0 . "spline,arc,line,ellipse,LWPOLYLINE"))))(setq i 0)(setq ll 0)(repeat (sslength en)(setq ss (ssname en i))(setq endata (entget ss))(command "lengthen" ss "")(setq dd (getvar "perimeter"))(setq ll (+ dd ll))(setq i (1+ i)))(princ " 所选线条总长为:")(princ ll)(princ))2. 标注所有线段(加载后只需框选所有线段便可得标注这些线段)(defun c:LLL ()(COMMAND "UCS""")(setvar "cmdecho" 1)(SETVAR "OSMODE" 0)(setq AcadObject (vlax-get-acad-object)AcadDocument (vla-get-ActiveDocument Acadobject)mSpace (vla-get-ModelSpace Acaddocument));;选取需要测量的样条曲线、圆弧、直线、椭圆(setq en ( ssget (list '(0 . "spline,arc,line,ellipse,LWPOLYLINE"))))(setq i 0);;获取系统参数textsize(setq shh (getvar "textsize"))(setq str_hh (strcat "\n 文字高度<"(rtos shh 2)">:")) (setq hh (getdist str_hh))(while hh(setvar "textsize" hh)(setq hh nil));;输入标注文字高度;;循环开始(repeat (sslength en)(setq ss (ssname en i))(setq endata (entget ss))(command "lengthen" ss "")(setq dd (getvar "perimeter"))(princ (strcat "\n 长度="(rtos dd 2)));;寻找代表图层的字符申(setq aa (assoc 0 endata));;获取图层名称(setq aa1 (cdr aa));;判断线条种类(cond((=aa1 "SPLINE");; 如果是spline(progn(setq arcObj (VLAX-ENAME->VLA-OBJECT ss))(setq startPnt1 (vla-get-ControlPoints arcObj))(setq p1(vlax-safearray->list (vlax-variant-value startPnt1)) (setq x1 (car p1))(setq y1 (cadr p1))(setq z1 (caddr p1))(repeat (- (/ (length p1) 3) 1);;循环,寻找最后一个控制点(setq p1 (cdddr p1))(setq x2 (car p1))(setq y2 (cadr p1))(setq z2 (caddr p1)))(setq pp2 (list x2 y2 z2))))((=aa1 "LWPOLYLINE");;如果是LWPOLYLINE(progn(setq arcObj (VLAX-ENAME->VLA-OBJECT ss)) (setq startPnt1 (vla-get-Coordinates arcObj))(setq p1(vlax-safearray->list (vlax-variant-value startPnt1)) )(setq x1 (car p1))(setq y1 (cadr p1))(setq z1 (caddr p1))(setq pp1 (list x1 y1 z1))(repeat (- (/ (length p1) 3) 1);;循环,寻找最后一个控制点(setq p1 (cdddr p1))(setq x2 (car p1))(setq y2 (cadr p1))(setq z2 (caddr p1)))))(t;;如果是其他种类线条(progn(setq arcObj (VLAX-ENAME->VLA-OBJECT ss))(setq startPnt1 (vla-get-StartPoint arcObj));;获取起点(setq endPnt1 (vla-get-EndPoint arcObj));;获取终点(setq pp1(vlax-safearray->list (vlax-variant-value startPnt1)) )(setqpp2 (vlax-safearray->list (vlax-variant-value endPnt1)) ))))(setq x1 (car pp1))(setq y1 (cadr pp1))(setq z1 (caddr pp1))(setq x2 (car pp2))(setq y2 (cadr pp2))(setq z2 (caddr pp2))(setq x (/ (+ x1 x2) 2))(setq y (/ (+ y1 y2) 2))(setq z (/ (+ z1 z2) 2))(setq pt (list x y z));;取得线段两端的中点(setq ang (angle ppi pp2));;获取角度(if (> (* (/ ang pi) 180) 180)(setq ang (+ ang pi)))(command "text""bc"pt""(* (/ ang pi) 180)(strcat "" (rtos dd 2))"")(setq i (1+ i)))(prin1))(prompt "\n <> 在图中直接写出长度")(prin1)3. 连续打断程序(defun c:br1 ()(command "break" pause "f" pause "@"))4. 将CAD文字导入Excel表格(defun c:Q2()(setq ffn (getfiled " 写出文件......... xls" 1))(princ "\n 选取文字...”)(setq ss ( ssget))(setq ff (open ffn "w"))(setq i 0)(repeat (sslength ss)(setq ssn (ssname ss i))(setq ssdata (entget ssn))(setq sstyp (cdr (assoc 0 ssdata)))(if (or (= sstyp "TEXT") (= sstyp "MTEXT"))(progn(setq txt (cdr (assoc 1 ssdata)))(princ txt ff)(princ "\n" ff)))(setq i (1+ i)))(close ff)(princ (strcat "\n 写出文件:"ffn))(prin1))5删除带颜色图元以下程序在别人的贴子里贴过.为了说明问题,今天再贴一次. 改颜色的LISP程序(defun c:c1()(ssget)(command "chprop" "p ...... c" "1" "") (princ)) (defun c:c2()(ssget)(command "chprop" "p ...... c" "2" "") (princ)) (defun c:c3()(ssget)(command "chprop" "p ...... c" "3" "") (princ)) (defun c:c4()(ssget)(command "chprop" "p ...... c" "4" "") (princ))(defun c:c5()(ssget)(command "chprop" "p ...... c" "5" "") (princ))(defun c:c6()(ssget)(command "chprop" "p ...... c" "6" "") (princ))(defun c:c7()(ssget)(command "chprop" "p ...... c" "7" "") (princ))(defun c:c8()(ssget)(command "chprop" "p ...... c" "8" "") (princ))你用C1命令就可以将图元改为红色了.其余类似.删除红色图元(defun C:D1 (/ m A M)(setq m:err *error* *error* *merr*)(setvar "cmdecho" 0)(command "UNDO" "G")(prompt " 选择图形")(setq A (ssget '((62.1))))(if (/= A nil)(progn(setq M (sslength A))(command "erase" A "")(princ "\n 共删除红色图元<")(princ M)(princ "> 个")))(command "UNDO" "E") (princ)这样,键入D1命令,就可以删除红色的图元了枯藤老树昏鸦,小桥流水人家,古道西风瘦马。

cad画缓和曲线方法

cad画缓和曲线方法

在AutoCAD中缓和曲线的几种画法2011-06-25 20:32在AutoCAD中画缓和曲线比较困难,目前常用的画法有AutoLISP程序法(需要已知曲线要素)、坐标脚本法(需事先计算好各特征点及其他点为的坐标)、曲线命令法(需事先准备各特征点坐标),现分别介绍如下:画法一:缓和曲线AutoLISP 应用程序一、制作缓和曲线AutoLISP 应用程序复制AutoLISP程序源代码,打开“记事本”,粘贴进去后,另存为文件名“缓和曲线.LSP”,保存类型为“所有文件”(AutoLISP程序源代码见附件)二、加载缓和曲线AutoLISP应用程序在命令行输入“appload”打开自动加载对话框。

在对话框的“查找范围”里找到“缓和曲线.LSP”的那个程序,选中后,点击【加载】,显示“已成功加载缓和曲线.LSP”后,关闭对话框,ok你那个程序自动启动加载了。

三、在CAD中画出切线长四、运行程序在命令行中输入hh回车五、选择两条切线,然后输入曲线半径如:2204.5回车六、输入缓和曲线长,如270,绘图完成!画法二:坐标脚本法1.现做一个CAD脚本,会的人跳过(用Windows 文本另存为“.scr”文件)2.脚本编辑输入“SPLINE+空格键+Y坐标+,+X坐标+空格键+Y坐标+,+X坐标……” 以此类推!点输的越密,线条越平滑。

也可以用EXCEL算出各个点的坐标后粘贴进去,然后按照“SPLINE+空格键+Y坐标+,+X坐标+空格键+Y坐标+,+X坐标……”格式编辑。

3.进入CAD,运行脚本,就行了!注意:你可能输入了100个点,而出现的确只有几个点,这个很正常,你把图像删除了,多运行几次就行,一般不超过4次。

画法三:使用真样条曲线命令举例如下:输入导线:pline命令绘制1、2、3各点,其对应坐标如下x1=213.7748 y1=92.1117x2=313.7748 y2=92.1117x3=399.6787 y3=143.3026绘制通过ZH、HZ、QZ、HY和YH各点的与路线导线相切的含缓和曲线的平曲线。

缓、圆曲线程序

缓、圆曲线程序

缓和曲线、圆曲线计算程序A“JDX”:B“JDY”:C“R”:D“L0”:J“HR”:F“T”:G“QD”:H“ZD”:I“Z,Y,-,+”:T“E”:I>0=>Z=1:≠=>Z= -1:△LB1 1:{K,L,M}:K“ZHUANG”:L“L1”:M“L2”:K<G+D=>N“Li”=K-G:Y=1:E=J:GOTO 2:判断是缓曲线还是圆曲线段≠=> K≤H-D=> GOTO 3:≠=>N=H-K:E=J+I-180:Y=-1: GOTO 2:△△Lb1 2:O“X0”=A-COS E×F:起点(终点)X坐标P“Y0”=B-SIN E×F:起点(终点)Y坐标Q=N-N^5÷(40×C2×D2):R=N^3÷(6×C×D):S=TAN-1(R÷Q)×YZ:U=Y Z N2×90÷(ДCD)+E:待求点的切线方位角K ≤G+D=>U=U-90:≠=>U=U+90:△L1的前进方位角V=U+90:L2的前进方位角W“X1”=O+COS (E+S)×√(Q2+R2)+COS U×L+COS V×M▲X“Y1”=P+SIN (E+S)×√(Q2+R2)+SIN U×L+SIN V×M▲GOTO 1:Lb1 3:O=J+Z(0.5×Abs I+90):P“X0”=Cos O×(C+T)+A:Q“Y0”=Sin O×(C+T)+B:R=O-180-Z((H-G)-2D)×90÷Д÷C:S=(K-(G+D))×180÷Д÷C:U=R+ZS:W“X1”=P+COS U×(C+ZL)+COS(U+Z×90)×M▲X“Y1”=Q+SIN U×(C+ZL)+ SIN(U+Z×90)×M▲GOTO 1说明:JDX:交点X坐标JDY:交点Y坐标R:半径L0:缓和曲线长HR:前进方位角T:切线长QD:起点桩号ZD:终点桩号Z,Y,-,+:偏角,左为负,右为正E:外矢距ZHUANG:待求点桩号L1:待求点法线方向距离,左侧为正,右侧为负,求中桩坐标时为0L2:待求点切线方向距离,左侧为正,右侧为负,求中桩坐标时为0本程序用于计算缓和曲线缓和曲线缓和曲线为对称型缓和曲线,若无缓和曲线,计算单圆曲线时L0输入02左偏为负,右偏为正。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C画缓和曲线l i s p程序公司标准化编码 [QQX96QT-XQQB89Q8-NQQJ6Q8-MQM9N]CAD中画缓和曲线,首先复制本文☆后面的源程序保存至cad安装目录的SUPPORT文件夹,保存类型为.lsp 可以随便复制一个SUPPORT文件夹内的lsp 文件,然后替换本文的程序。

打开CAD后,输入appload回车,找到你保存的缓和曲线lsp程序,点击加载,然后就可以画缓和曲线了。

首先,要画出缓和曲线的两条直线,然后输入HH回车,按提示完成缓和曲线。

注:本程序,缓和曲线段拟合长度为,如需更改拟合长度,将程序的第8行(repeat (FIX(/ Ls )及9行(setq l (+ l (/ Ls (FIX(/ Ls )))中的修改即可。

☆;;多义线摹拟缓和曲线。

;;输入起止直线、半径、缓和曲线长或设计车速。

;;命令:HH(defun com_p()(setq l 0)(command "ucs" "o" (list (- 0 x1) 0 0))(command "pline" (list 0 0 0) "w" "0" ""(repeat (FIX(/ Ls )(setq l (+ l (/ Ls (FIX(/ Ls )))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(command (list x y 0)));repaet);command(setq pt5 (trans (list x y 0) 1 0)));com_p(defun ll_v()(setq V (getreal "\nGive Velocity:")Ls1 (* VLs2 (/ (* V V V) R)Ls (max Ls1 Ls2 (/ R 9))Ls (* (fix (/ Ls 10)));setq(if (> Ls R) (setq Ls R))(ll_d));ll_v(defun ll_d()(setq os (getvar "osmode"))(setvar "osmode" 0)(setq C (* Ls R)q (- (+ (- (/ 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))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))p (+ (- (/ (* Ls Ls) 24 R) (/ (* Ls Ls Ls Ls) 2688 R R R)) (/ (* Ls Ls Ls Ls Ls Ls) 506880 R R R R R))jd (inters pt1 pt2 pt3 pt4 nil)alf1(angle pt10 jd)alf2(angle pt20 jd)alf (- (angle jd pt20) alf1));setq(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(setq x0 (/ (* (+ p R) (sin(/ alf )) (cos(/ alf ))x1 (+ x0 q)Cl (+ (* alf R) Ls)E (- (/ (+ R p) (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" "")(command "ucs" "o" jd)(command "ucs" "z" (/ (* 180 alf2) pi))(setq id__ (- 0 id__)) (com_p)(setq ppt2 (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)(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)(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")(command "text" pause pause "" (strcat "偏角=" alfd))(command "cmdecho" "0")(command "text" "" (strcat "半径=" (rtos R 2 2)))(command "text" "" (strcat "切线长=" (rtos x1 2 2)))(command "text" "" (strcat "曲线长=" (rtos Cl 2 2)))(command "text" "" (strcat "外距=" (rtos E 2 2)))(command "text" "" (strcat "缓曲长=" (rtos Ls 2 2))));ll_d(defun angf (alf)(setq alff (angtos alf 1 4)n 1kk (strlen alff))(repeat kk(setq alfn (substr alff n 1))(if (= alfn "d")(setq nn n));if(setq n (+ n 1)));repeat(strcat (substr alff 1 (- nn 1)) "%%" (substr alff nn)));angf(defun c:hh(/ p1 p2 pt1 pt2 pt3 pt4 pt5 pt6 pt10 pt20 id__ R V Ls E p3r1 x y l x0 x1 C jd alf alf1 alf2 q p Cl Ls1 Ls2)(command "ucs" "")(setq p1 nil p2 nil)(while (= p1 nil) (setq p1 (entsel "\n拾取第一条直线:")))(redraw (car p1) 3)(while (= p2 nil) (setq p2 (entsel "\n拾取第二条直线:")))(redraw (car p2) 3)(initget 1)(setq R (getdist "\n请输入圆曲线半径R: "))(initget 1 "Ls V")(setq p3 (getdist "\n输入缓和曲线长度(Ls)或[设计速度(V)]: ")) (if (= p3 "V") (ll_v) (progn (setq ls p3) (ll_d)))(princ));eline(defun thh(len pt h)(setq en_data (entget (car len))old_data (assoc h en_data)new_data (cons h pt)en (subst new_data old_data en_data));setq(entmod en));thh。

相关文档
最新文档