求助:只差一步就功的程序,请高手帮忙调试
<p>这段程序运行到画缓和曲线时老是提示参数错误,请高手帮忙调试一下,不胜感激:</p><p><font face="Verdana">;子程序——从编辑框取值<br/>(defun getile() ;从编辑框取值均为字符串,除"数据文件名"外需化为实数<br/> (setq PNJd (atof (get_tile "PNjd"))) ;get_tile从关键字为代表对话框取值<br/> (setq Xb (atof (get_tile "Xb")) Yb (atof (get_tile "Yb")))<br/> (setq Xj (atof (get_tile "Xj")) Yj (atof (get_tile "Yj")))<br/> (setq Xf (atof (get_tile "Xf")) Yf (atof (get_tile "Yf")))<br/> (setq R (atof (get_tile "R")) Ls (atof (get_tile "Ls")))<br/> (setq LN (atof (get_tile "LN")) CN (atof (get_tile "CN")))<br/> (setq D (atof (get_tile "D")) S2 (atof (get_tile "S2")))<br/> (setq DataFile (get_tile "DataFile"))<br/>)</font></p><font face="Verdana">
<p><br/>;主程序——缓和曲线的计算、绘图与数据输出<br/>(defun c:ecurve1 (/ PNJd Xb Yb Xj Yj Xf Yf R Ls LN LC D S2 DataFile id)<br/> ;从对话框读入计算所需起始数据:<br/> (setq id (load_dialog "Ecurve.dcl")) ;加载DCL程序于内存,并获标识码id<br/> (if (< id 0) (exit)) ;如果加载不成功,则退出<br/> (if (not (new_dialog "Ecurve" id)) (exit))<br/> (setq PNjd 0 Xb 0 Yb 0 Xj 0 Yj 0 Xf 0 Yf 0 R 0 Ls 0 LN 0 LC 0 D 0 S2 0 DataFile".txt")<br/> ;程序中的变量赋初值<br/> (action_tile "accept" "(getile) (done_dialog 1)")<br/> ;当"确定"(accept)按钮按下,控件的指定动作为getile及done_dialog<br/> (start_dialog) ;显示对话框,经数据输入,按"确定"按钮,送入主程序<br/> (unload_dialog id) ;对话框任务完成,将DCL文件从内存中下载</p>
<p><br/> ;初步计算:<br/> (setq S3 (/ S2 3)) ;注记点位名离点位的坐标差<br/> (setq N (fix (+ 1 (/ Ls LN)))) ;N 为缓和曲线分段数<br/> (setq F (open "DataFile" "w")) ;打开数据文件写入<br/> (setq BD (list Xb Yb) JD (list Xj Yj) FD (list Xf Yf)) ;形成二维点位表<br/> (setq BD1 (list (+ Xb S3)(+ Yb S3)) FD1 (list (+ Xf S3)(+ Yf S3)))<br/> (setq JD1 (list (+ Xj S3)(+ Yj S3)))<br/> (setq JD2 (list (- Xj S2)(+ Yj S3)))<br/> ;画道路中线交点及前后转点:<br/> (command "style" "standard" "宋体" "" "" "" "n" "n") ;字体<br/> (command "pdmode" 32 "pdsize" 0.6) ;指定画点的模式和大小<br/> (command "point" JD)(command "text" JD1 S2 0 "JD") ;画路线交点<br/> (command "point" BD)(command "text" BD1 S2 0 "ZD(b)") ;前视转点<br/> (command "point" FD)(command "text" FD1 S2 0 "ZD(f)") ;画后视转点<br/> ;求交点至前后视转点及曲中点方位角(用求值函数-angle)和计算路线偏角:<br/> (setq Ab (angle JD BD) bA (angle BD JD))<br/> (setq Af (angle JD FD) fA (angle FD JD))<br/> (setq Am (/ (+ Ab Af) 2)) ;计算分角线的方位角<br/> (if (or (and (< (- Ab Af) PI)(> (- Ab Af) 0))(< (- Ab Af)(* PI -1)))<br/> (setq LR 1)(setq LR 2)) ;判断路线方向的左、右偏,LR=1左偏,LR=2右偏<br/> (if (and (= LR 1)(> Af Ab))(setq Am (+ Am PI)))<br/> (if (and (= LR 2)(< Af Ab))(setq Am (+ Am PI)))<br/> (if (and (= LR 1)(> (- Af bA) 0))(setq A (- Af bA))) ;计算左偏角<br/> (if (and (= LR 1)(> (- bA Af) PI))(setq A (+ (- Af bA)(* PI 2))))<br/> (if (and (= LR 2)(> (- bA Af) 0))(setq A (- bA Af))) ;计算右偏角<br/> (if (and (= LR 2)(> (- Af bA) PI))(setq A (+ (- bA Af)(* PI 2))))<br/> ;计算缓和曲线辅助参数:<br/> (setq M (- (/ Ls 2)(/ (* Ls Ls Ls)(* 240 R R)))) ;计算m,p,β0<br/> (setq P (/ (* Ls Ls)(* 24 R)) B0 (/ Ls (* 2 R)))<br/> ;计算缓和曲线和圆曲线元素:<br/> (setq Lc (* R (- A (* 2 B0))) L (+ Lc (* 2 Ls)) L2 (/ L 2)) ;计算Lc<br/> (setq A2 (/ A 2) TA2 (/ (sin A2)(cos A2))) ;计算tanα/2,因LISP无tan<br/> (setq TT (+ M (* (+ R P) TA2))) ;计算切线长T及外矢距E<br/> (setq EE (- (/ (+ R P)(cos A2)) R))<br/> ;计算曲线主点坐标:<br/> (setq ZH (polar JD Ab TT)) ;用极坐标求值函数-polar,计算直缓点大地坐标<br/> (setq QZ (polar JD Am EE)) ;计算曲中点大地坐标<br/> (setq HZ (polar JD AF TT)) ;计算缓直点大地坐标<br/> ;计算缓圆点和圆缓点法线方位角及大地坐标:<br/> (setq Ye (- (/ (* Ls Ls)(* 6 R))(/ (expt Ls 4)(* 336 R R R))) Xe (- Ls (/ (expt Ls 3)(* 40 R R)))) ;Ye有错、已改<br/> (if (= LR 1)(setq A01 (- Ab (/ PI 2)) A02 (+ Af (/ PI 2)))<br/> (setq A01 (+ Ab (/ PI 2)) A02 (- Af (/ PI 2)))) ;ZH,HZ点法线方位角<br/> (setq HY0 (polar ZH bA Xe))(setq HY (polar HY0 A01 Ye)) ;HY大地坐标<br/> (setq YH0 (polar HZ fA Xe))(setq YH (polar YH0 A02 Ye)) ;YH大地坐标<br/> (setq ZH1 (polar ZH (/ PI 6) S3) ZH2 (polar ZH PI S2)) ;算注记起点坐标<br/> (setq QZ1 (polar QZ (/ PI 6) S3) QZ2 (polar QZ PI S2))<br/> (setq HZ1 (polar HZ (/ PI 6) S3) HZ2 (polar HZ PI S2))<br/> (setq HY1 (polar HY (/ PI 6) S3) HY2 (polar HY PI S2))<br/> (setq YH1 (polar YH (/ PI 6) S3) YH2 (polar YH PI S2))<br/> ;画曲线主点:<br/> (command "layer" "m" "曲线主点" "c" "red" "" "") ;建道路曲线主点图层<br/> (command "point" ZH)(command "text" ZH1 S2 0 "ZH") ;画曲线起点<br/> (command "point" QZ)(command "text" QZ1 S2 0 "QZ") ;画中点<br/> (command "point" HZ)(command "text" HZ1 S2 0 "HZ") ;画终点<br/> (command "point" HY)(command "text" HY1 S2 0 "HY") ;画缓圆点<br/> (command "point" YH)(command "text" YH1 S2 0 "YH") ;画圆缓点<br/> ;计算曲线主点桩号:<br/> (setq PNzh (- PNjd TT) PNqz (+ PNzh L2) PNhz (+ PNzh L))<br/> (setq PNhy (+ PNzh Ls) PNyh (- PNhz Ls))<br/> ;以下用实数转字符函数-rtos注记桩号,取2位小数<br/> (setq Pzh (rtos PNzh 2 2) Pqz (rtos PNqz 2 2) Phz (rtos PNhz 2 2))<br/> (setq Pjd (rtos PNjd 2 2) Phy (rtos PNhy 2 2) Pyh (rtos PNyh 2 2))<br/> (setq rtoa (/ 180 PI)) ;用弧角转换函数-rtoa,将方位角弧度化为角度(度)<br/> (setq Az (* rtoa (+ Ab (/ PI 2))))<br/> (setq Ah (* rtoa (- Af (/ PI 2))))<br/> (setq Aq (* rtoa Am))<br/> ;注记曲线主点桩号:<br/> (command "layer" "m" "桩号" "c" "yellow" "" "") ;建立桩号注记图层<br/> (command "text" ZH2 S2 Az Pzh) ;注记交点起点中点终点缓圆点桩号<br/> (command "text" HZ2 S2 Ah Phz)(command "text" QZ2 S2 Aq Pqz)<br/> (command "text" JD2 S2 (+ Aq 180) Pjd)<br/> (command "text" HY2 S2 Az Phy)(command "text" YH2 S2 Ah Pyh)<br/> (command "zoom" "e")</p>
<p><br/> ;曲线元素及主点桩号计算的文件输出:<br/> (princ " 缓和曲线文件名: " F)(princ DataFile F)(princ "\n" F)<br/> (princ "\n" F)(princ " 道路转点坐标(y,x): " F)(princ "\n" F)<br/> (princ " ZD(b)" F)(princ BD F)(princ " JD" F)(princ JD F)<br/> (princ " ZD(F)" F)(princ FD F)(princ "\n" F)<br/> (princ "\n" F)(princ " 曲线设计数据: " F)(princ " R = " F)<br/> (princ R F)(princ " Ls = " F)(princ Ls F)<br/> (princ "\n" F)(princ "\n" F)<br/> (princ " 曲线计算数据: " F)(princ " a = " F)<br/> (princ (angtos A 1 4) F)<br/> (princ " m = " F)(princ M F)(princ " p = " F)(princ P F)<br/> (princ " T = " F)(princ TT F)(princ "\n" F)<br/> (princ " E = " F)(princ EE F)(princ " Lc = " F)<br/> (princ Lc F)(princ " L = " F)(princ L F)<br/> (princ " β0 = " F)(princ (angtos B0 1 4) F)(princ "\n" F)<br/> (princ "\n" F)<br/> (princ " 曲线主点桩号及坐标(y,x): " F)(princ "\n" F)<br/> (princ " ZH: " F)(princ Pzh F)(princ " " F)(princ ZH F)<br/> (princ "\n" F)<br/> (princ " HY: " F)(princ Phy F)(princ " " F)(princ HY F)<br/> (princ "\n" F)<br/> (princ " QZ: " F)(princ Pqz F)(princ " " F)(princ QZ F)<br/> (princ "\n" F)<br/> (princ " YH: " F)(princ Pyh F)(princ " " F)(princ YH F)<br/> (princ "\n" F)<br/> (princ " HZ: " F)(princ Phz F)(princ " " F)(princ HZ F)<br/> (princ "\n" F)(princ "\n" F)</p>
<p><br/> ;画道路中线的切线和圆曲线:<br/> (command "layer" "m" "路线切线" "c" "4" "" "")<br/> (command "line" BD JD FD "")<br/> (command "layer" "m" " 圆曲线" "c" "1" "" "")<br/> (command "arc" HY QZ YH "")</p>
<p><br/> ;缓和曲线(一)细部点及边线点计算坐标,输送至文件和画点位:<br/> (princ " 缓和曲线(一)细部点桩号及中桩和左、右边桩坐标(y,x): " F)<br/> (princ "\n" F)<br/> (setq LEi 0 BF 1 Origin ZH A0 bA) ;开始以直缓点为原点,切线为起始方向<br/> (setq PNi PNzh) ;桩号(PN)从直缓点开始,逐点增加,"i"代表缓和曲线上的点<br/> (repeat N<br/> (setq Xi (- LEi (/ (expt LEi 5)(* 40 (* R R)(* Ls Ls)))))<br/> (setq Yi (/ (expt LEi 3)(* 6 R Ls))) ;计算独立坐标<br/> (if (or (and (= BF 1)(= LR 2))(and (= BF 2)(= LR 1)))<br/> (setq Yi (* Yi-1)))<br/> (setq Bi (/ (* LEi LEi)(* 2 R Ls)))(if (= LR 2)(setq Bi (* Bi -1)))<br/> <br/> (setq Ari (+ A0 Bi (/ PI 2))) ;计算缓和曲线点i曲率半径方位角<br/> ;将独立坐标转换为大地坐标<br/> (setq XXi (+ (nth 0 Origin)(- (* Xi (cos A0))(* Yi (sin A0)))))<br/> (setq YYi (+ (nth 1 Origin)(+ (* Yi (cos A0))(* Xi (sin A0)))))<br/> (setq I (list XXi YYi))<br/> (setq Li (polar I Ari D) Ri (polar I (+ Ari PI) D)) ;计算左、右边桩点位<br/> (setq Eback (cons I Eback)) ;将缓和曲线(一)的细部点放入点表-Eback<br/> ;画缓和曲线的中线点及边桩点:<br/> (command "layer" "m" "曲线细部点" "c" "green" "" "")<br/> (command "point" I "")(command "point" Li "")(command "point" Ri "")<br/> ;缓和曲线细部点坐标计算的文件输出:<br/> (princ " " F)(princ PNi F)(princ " " F)(princ I F)<br/> (princ " " F)(princ Li F)(princ " " F)(princ Ri F)<br/> (princ "\n" F)<br/> (setq LEi (+ LEi LN) PNi (+ PNi LN)) ;点号增大,曲线点的计算长度也增大<br/>) ; End repeat<br/>(setq Eback (reverse Eback)) ;用样条曲线画缓和曲线,点表中元素倒序排列<br/>(command "layer" "m" "缓和曲线" "c" "magenta" "" "")<br/>(command "spline" ZH)(setq i 1) ;从直缓点开始画<br/>(repeat (- N 1) ;从缓和曲线点表中依次取出各点画缓和曲线<br/>(setq Pt (nth i Eback))(command Pt)(setq i (+ i 1))<br/>);End repeat<br/>(command "" "" "" "") ;结束画缓和曲线(一)</p>
<p><br/>;圆曲线细部点及边线点计算坐标,输送至文件和画点位:<br/>(princ "\n" F)<br/>(princ " 圆曲线细部点桩号及中桩和左、右边桩坐标(y,x): " F)(princ "\n" F)<br/>(setq PNj 0) ;开始计算圆曲线上细部点(整桩)桩号,"j"代表圆曲线上的点<br/>(setq PN0 (rem PNhy CN) PN1 (- CN PN0) PNj (+ PNhy PN1)) ;用求余函数rem<br/> ;求缓圆点前整桩距PN0,后整桩距PN1,在计算圆曲线上第一个整桩号PNj<br/>(setq LCj (- PNj PNzh)) ;计算整桩至直缓点距离(起点距)<br/>(while (< PNj PNyh)<br/> (setq Bj (+ B0 (/ (- LCj Ls) R))) ;计算圆曲线点的独立坐标<br/> (setq Xj (+ (* R (sin Bj)) M))<br/> (setq Yj (+ (* R (- 1 (cos Bj))) P))<br/> (if (or (and (= BF 1)(= LR 2))(and (= BF 2)(= LR 1)))<br/> (setq Yj (* Yj -1)))<br/> (setq Aj (+ B0 (/ (- LCj Ls) R)))(if (= LR 2)(setq Aj (* Aj -1)))<br/> (setq ARi (+ A0 Aj (/ PI 2))) ;计算圆曲线点j的曲率半径方位角<br/> ;将独立坐标变换为大地坐标<br/> (setq XXj (+ (nth 0 Origin)(- (* Xj (cos A0))(* Yj (sin A0)))))<br/> (setq YYj (+ (nth 1 Origin)(+ (* Yj (cos A0))(* Xj (sin A0)))))<br/> (setq J (list XXj YYj))<br/> (setq Lj (polar J ARi D) Rj (polar J (+ ARi PI) D)) ;计算左、右边桩点位<br/> ;画圆曲线的中线点及边桩点:<br/> (command "layer" "m" "曲线细部点" "")<br/> (command "point" J "")(command "point" Lj "")(command "point" Rj "")<br/> ;圆曲线细部点坐标计算的文件输出:<br/> (princ " " F)(princ PNj F)(princ " " F)(princ J F)<br/> (princ " " F)(princ Lj F)(princ " " F)(princ Rj F)<br/> (princ "\n" F)<br/> (setq LCj (+ LCj CN) PNj (+ PNj CN)) ;起点距及桩号均增加一个桩距<br/>); End while</p>
<p><br/> ;缓和曲线(二)细部点及边线点计算坐标,输送至文件和画点位:<br/> (princ "\n" F)<br/> (princ " 缓和曲线(二)细部点桩号及中桩和左、右边桩坐标(y,x): " F)<br/> (princ "\n" F)<br/> (setq LEi Ls BF 2 Origin Hz A0 fA) ;开始以缓直点为原点,切线为起始方向<br/> (setq PNi PNyh) ;桩号从圆缓点开始,逐点增加<br/> (repeat N<br/> (setq Xi (- LEi (/ (expt LEi 5)(* 40 (* R R)(* Ls Ls)))))<br/> (setq Yi (/ (expt LEi 3)(* 6 R Ls))) ;计算独立坐标<br/> (if (and (= BF 2)(= LR 1))(setq Yi (* Yi-1)))<br/> (setq Bi (/ (* LEi LEi)(* 2 R Ls)))(if (= LR 1)(setq Bi (* Bi -1)))<br/> (setq Ari (+ A0 Bi (/ PI 2))) ;计算缓和曲线点i曲率半径方位角<br/> ;将独立坐标转换为大地坐标<br/> (setq XXi (+ (nth 0 Origin)(- (* Xi (cos A0))(* Yi (sin A0)))))<br/> (setq YYi (+ (nth 1 Origin)(+ (* Yi (cos A0))(* Xi (sin A0)))))<br/> (setq I (list XXi YYi))<br/> (setq Ri (polar I Ari D) Li (polar I (+ Ari PI) D)) ;计算左、右边桩点位<br/> (setq Efore (cons I Efore)) ;将缓和曲线(二)的细部点放入点表-Efore<br/> ;画缓和曲线的中线点及边桩点:<br/> (command "layer" "m" "曲线细部点" "c" "green" "" "")<br/> (command "point" I "")(command "point" Li "")(command "point" Ri "")<br/> ;缓和曲线细部点坐标计算的文件输出:<br/> (princ " " F)(princ PNi F)(princ " " F)(princ I F)<br/> (princ " " F)(princ Li F)(princ " " F)(princ Ri F)<br/> (princ "\n" F)<br/> (setq LEi (- LEi LN) PNi (+ PNi LN)) ;点号增大,曲线点的计算长度减小<br/>) ; End repeat<br/>(setq Efore (reverse Efore)) ;用样条曲线画缓和曲线,点表中元素倒序排列<br/>(command "layer" "m" "缓和曲线" "c" "magenta" "" "")<br/>(command "spline" YH)(setq i 1) ;从圆缓点开始画<br/>(repeat (- N 1) ;从缓和曲线点表中依次取出各点画缓和曲线<br/> (setq Pt (nth i Efore))(command Pt)(setq i (+ i 1))<br/>);End repeat<br/>(command "" "" "" "") ;结束画缓和曲线(二)<br/>(setq Eback nil Efore nil) ;清空点表可继续算另一条道路曲线<br/>(princ)<br/>) ;《ECURVE1》程序结束!</font></p> <p>因不懂算法,又无调试数据,未调试,仅从语法考虑修改了一下。</p>
<p> </p> 谢谢,我试试 <p>已解决,多谢ZZ版主的帮忙</p>
页:
[1]