[求助]如何在一条直线中间插入文字
<p>请教各位大侠:</p><p>如何在一条直线的中间插入文字标记,要用到哪些函数,请给点思路,谢谢。</p><p>我要的效果是这样的:------------------------HYA10*2*0.4---------------------------------</p><p>老弟刚学lisp,费了九牛二虎之力写了下面的代码,请大侠指点一下改进思路,不胜感激</p><p>;画电缆1.lsp<br/>;画电缆</p><p>(defun c:hdl()<br/> (setq l 50 l1 3.5 h1 3.5) ;设定电缆长度l、字偏离直线的距离为l1、字高h1<br/> (graphscr) ;切换到图形窗口<br/> (setq oce (getvar "cmdecho")) ;储存旧的指令响应值<br/> (setvar "cmdecho" 0) ;关闭指令响应<br/> (setq p1 (getpoint "\n电缆的起点:")) ;取得基准点p1<br/> (setq a1 (getangle p1 "电缆的方向:")) ;取得电缆的方向<br/> (setq p2 (polar p1 a1 l)) ;计算p2的坐标<br/> (setq p3 (list (/ (+ (car p1) (car p2)) 2) (/ (+ (cadr p1) (cadr p2)) 2) 0)) ;计算p1p2的中点p3的坐标<br/> (setq p4 (polar p3 (+ a1 (/ pi 2)) l1)) ;计算直线上面的文字位置<br/> (setq p5 (polar p3 (- a1 (/ pi 2)) l1)) ;计算直线下面的文字位置<br/> (setq z1 (getstring "\n请输入电缆的型号[如HYA10*2*0.4]:")) ;取得电缆标注<br/> (setq Z2 (getdist "\n请输入电缆的长度[米]:")) ;取得电缆的长度</p><p><br/> (command ".line" p1 p2 "") ;画直线<br/> (command ".text" "m" p4 h1 a1 z1) ;以中央对齐的方式写直线上面的字<br/> (command ".text" "m" p5 h1 a1 z2) ;以中央对齐的方式写直线下面的字</p><p> (setvar "cmdecho" oce) ;恢复旧的指令响应值<br/> (princ)<br/> ) ;c:bb函数结束</p> 这个问题困扰我好几天了,睡也睡不着觉,请帮帮忙。我想到textbox函数,可是没示例,不理解。 本帖最后由 作者 于 2008-1-22 17:18:54 编辑修改如下:
(defun c:hdl ()
(setq l50
l1 3.5
h1 3.5
) ;设定电缆长度l、字偏离直线的距离为l1、字高h1
(graphscr) ;切换到图形窗口
(setq oce (getvar "cmdecho"));储存旧的指令响应值
(setvar "cmdecho" 0) ;关闭指令响应
(setq p1 (getpoint "\n电缆的起点:")) ;取得基准点p1
(setq p2 (getpoint p1 "电缆的方向:")) ;取得电缆的方向
(setq p3 (list (/ (+ (car p1) (car p2)) 2)
(/ (+ (cadr p1) (cadr p2)) 2)
0
)
) ;计算p1p2的中点p3的坐标
(setq a1(angle p1 p2))
(if (and(> a1 (* pi 0.5))(< a1 (* pi 1.5)))
(setq a1 (angle p2 p1))
)
(setq p4 (polar p3 (+ a1 (/ pi 2)) l1)) ;计算直线上面的文字位置
(setq p5 (polar p3 (- a1 (/ pi 2)) l1)) ;计算直线下面的文字位置
(setq z1 (getstring "\n请输入电缆的型号[如HYA10*2*0.4]:"))
;取得电缆标注
(setq Z2 (getdist "\n请输入电缆的长度[米]:")) ;取得电缆的长度
(command ".line" p1 p2 "");画直线
(command ".text" "j" "mc" p4 h1 (angtos a1) z1) ;以中央对齐的方式写直线上面的字
(command ".text" "j" "mc" p5 h1 (angtos a1) (rtos z2 2 3));以中央对齐的方式写直线下面的字
(setvar "cmdecho" oce);恢复旧的指令响应值
(princ)
) ;c:bb函数结束
<p>呵呵,学习中,很感谢楼上的老师的指导。特别是对于不同角度的文字的处理简直太好了。</p><p></p><p>因为粗心,我把没有经过修改的代码发上来了,现在附上旧作:<br/>;画电缆1.lsp<br/>;定长画电缆,</p><p>(defun c:hdl()<br/> (setq l 50 l1 2.25 h1 2.5) ;设定电缆长度l、字偏离直线的距离为l1、字高h1<br/> (graphscr) ;切换到图形窗口<br/> (setq oce (getvar "cmdecho")) ;储存旧的指令响应值<br/> (setvar "cmdecho" 0) ;关闭指令响应<br/> (setq<br/> p1 (getpoint "\n电缆的起点:") ;取得基准点p1<br/> a1 (getangle p1 "\n电缆的方向:") ;取得电缆的方向<br/> p2 (polar p1 a1 l) ;计算p2的坐标<br/> p3 (list (/ (+ (car p1) (car p2)) 2.0) (/ (+ (cadr p1) (cadr p2)) 2.0) 0) ;计算p1p2的中点p3的坐标<br/> p4 (polar p3 (+ a1 (/ pi 2.0)) l1) ;计算直线上面的文字位置<br/> p5 (polar p3 (- a1 (/ pi 2.0)) l1) ;计算直线下面的文字位置<br/> z1 (getstring "\n请输入电缆的型号[如HYA10*2*0.4]:") ;取得电缆标注<br/> Z2 (getdist "\n请输入电缆的长度[米]:") ;取得电缆的长度<br/> )</p><p> (command ".line" p1 p2 "") ;画直线<br/> <br/> (setq osm (getvar "osmode"));储存对象捕捉的系统变量<br/> (setvar "osmode" 0);关闭对象捕捉<br/> (command ".text" "m" p4 h1 (/ (* a1 180) pi) z1) ;以中央对齐的方式写直线上面的字<br/> (command ".text" "m" p5 h1 (/ (* a1 180) pi) (rtos z2 2 1)) ;以中央对齐的方式写直线下面的字<br/> (setvar "osmode" osm);恢复对象捕捉<br/> (setvar "cmdecho" oce) ;恢复旧的指令响应值<br/> (princ)<br/> ) ;c:hdl函数结束</p><p></p> <p>;画电缆1.lsp<br/>;定长画电缆,</p><p>(defun c:hdl()<br/> (setq l 50 l1 2.25 h1 2.5) ;设定电缆长度l、字偏离直线的距离为l1、字高h1<br/> (graphscr) ;切换到图形窗口<br/> (setq oce (getvar "cmdecho")) ;储存旧的指令响应值<br/> (setvar "cmdecho" 0) ;关闭指令响应<br/> (setq<br/> p1 (getpoint "\n电缆的起点:") ;取得基准点p1<br/> p2 (getpoint P1 "\n电缆的终点:")<br/> a1 (angle p1 P2 ) ;取得电缆的方向<br/> ;p2 (polar p1 a1 l) ;计算p2的坐标<br/> p3 (list (/ (+ (car p1) (car p2)) 2.0) (/ (+ (cadr p1) (cadr p2)) 2.0) 0) ;计算p1p2的中点p3的坐标<br/> p4 (polar p3 (+ a1 (/ pi 2.0)) l1) ;计算直线上面的文字位置<br/> p5 (polar p3 (- a1 (/ pi 2.0)) l1) ;计算直线下面的文字位置<br/> z1 (getstring "\n请输入电缆的型号[如YJV-3*240+2*120]:") ;取得电缆标注<br/> Z2 (DISTANCE P1 P2);(getdist "\n请输入电缆的长度[米]:") ;取得电缆的长度<br/> )</p><p> (command ".line" p1 p2 "") ;画直线<br/> <br/> (setq osm (getvar "osmode"));储存对象捕捉的系统变量<br/> (setvar "osmode" 0);关闭对象捕捉<br/> (command ".text" "m" p4 h1 (/ (* a1 180) pi) (strcat z1 " " (rtos z2 2 1))) ;以中央对齐的方式写直线上面的字<br/> ;(command ".text" "m" p5 h1 (/ (* a1 180) pi) (rtos z2 2 1)) ;以中央对齐的方式写直线下面的字<br/> (setvar "osmode" osm);恢复对象捕捉<br/> (setvar "cmdecho" oce) ;恢复旧的指令响应值<br/> (princ)<br/> ) ;c:hdl函数结束</p><p>更改了一下,这样可以更方便,应用文本输出可以方便统计各种电缆的长度。</p> <p>统计很令人激动人心,学生学力不及,目前还不需要这个功能,待以后再来回顾楼上老师的指导。</p><p>如何在下面的代码中添加一个循环呢?有请各位老师不吝赐教了。</p><p>;按比例画电缆<br/>(defun c:hdl()<br/> (setq l1 2.25 ;设定字偏离直线的距离为l1<br/> h1 2.5) ;设定字高h1<br/> (graphscr) ;切换到图形窗口<br/> (setq oce (getvar "cmdecho")) ;储存旧的指令响应值<br/> (setvar "cmdecho" 0) ;关闭指令响应<br/> (setq<br/> bl (getint "\n请输入比例尺内的X值[推荐2000]:")<br/> p1 (getpoint "\n电缆的起点:") ;取得基准点p1<br/> )<br/>;;;;;;;;怎么开始循环呢???<br/>(setq<br/> a1 (getangle p1 "\n电缆的方向:") ;取得电缆的方向<br/> len (getdist "\n请输入电缆的长度[米]:") ;取得电缆的长度<br/> p2 (polar p1 a1 (/ (* len 1000) bl)) ;计算p2的坐标<br/> p3 (list (/ (+ (car p1) (car p2)) 2.0) (/ (+ (cadr p1) (cadr p2)) 2.0)) ;计算p1p2的中点p3的坐标<br/>)</p><p>(if (and (> a1 (* pi 0.5))(< a1 (* pi 1.5)))<br/> (setq a1 (angle p2 p1))<br/>)</p><p>(setq<br/> p4 (polar p3 (+ a1 (/ pi 2)) l1) ;计算直线上面的文字位置<br/> p5 (polar p3 (- a1 (/ pi 2)) l1) ;计算直线下面的文字位置<br/> z1 (getstring "\n请输入电缆的型号[如HYA10*2*0.4]:") ;取得电缆标注 <br/>)</p><p> (command ".line" p1 p2 "") ;画直线<br/> ;(command ".point" p2) ;画点标记</p><p> (setq osm (getvar "osmode"));储存对象捕捉的系统变量<br/> (setvar "osmode" 0);关闭对象捕捉</p><p> (command ".text" "m" p4 h1 (/ (* a1 180) pi) z1) ;以中央对齐的方式写直线上面的字<br/> (command ".text" "m" p5 h1 (/ (* a1 180) pi) (rtos len 2 1)) ;以中央对齐的方式写直线下面的字<br/> (setvar "osmode" osm) ;恢复对象捕捉<br/> (setvar "cmdecho" oce) ;恢复旧的指令响应值<br/> (command ".-pan" p2 p1) ;平移窗口 <br/> ;(setq p1 p2) ;开始重复,怎么循环呢???<br/> (princ)<br/> ) ;c:hdl函数结束</p><p></p> <p>好乱啊。。。看得花。。。</p><p>(while (setq p1 (getpoint "\n电缆的起点<退出>:"))</p><p>。。。。)</p><p>你要的循环。。。</p> <p>受楼上老师的启发,写了下面的练习以作感谢。</p><p>;模仿.line命令<br/>(defun c:xm_line()<br/> (setq p1 (getpoint "\n电缆的起点:"))<br/> (while (setq a1 (getangle p1 "\n电缆的方向<右键退出/Esc退出>:"))<br/> (setq p2 (polar p1 a1 50))<br/> (command ".line" p1 p2 "")<br/> (setq p1 p2)<br/> )<br/>)</p><p></p> <p>一山放出一山难,老弟又碰到难题了,还望各位前辈指导:</p><p>如何在lsp文件中,把对话框中的下拉列表框或编辑框的值赋予变量z1、z2、z3、z4?</p><p>附上dcl:</p><p>//hdl3.dcl画电缆<br/>dcl_hdl : dialog {<br/>label = "电缆参数";<br/>: popup_list {<br/> key = "popup1";<br/> label = "电缆型号:";<br/> list = "HYA";<br/> edit_width = 12;<br/>}<br/>: popup_list {<br/> key = "popup2";<br/> label = "电缆对数:";<br/> list = "10\n20\n30\n50\n100\n200\n300\n500\n600\n1200";<br/> edit_width = 12;<br/>}<br/>: popup_list {<br/> key = "popup3";<br/> label = "电缆线径:";<br/> list = "0.4\n0.5";<br/> edit_width = 12;<br/>}<br/>: edit_box {<br/> key = "editbox1";<br/> label = "电缆长度(米):";<br/>}<br/>: button {<br/> key = "button1";<br/> label = "确定";<br/> is_default = true;<br/>}<br/>}</p><p></p><p></p> <p>在未退出对话框时对变量赋值。</p><p>(defun c:tt ()<br/> (if (> (setq index_value (load_dialog "dcl_hdl")) 0) (progn<br/> (if (new_dialog "dcl_hdl" index_value) (progn<br/> (action_tile "button1" "(getdata) (done_dialog 1)")<br/> (action_tile "cancel" "(done_dialog 0)")<br/> (setq re (start_dialog))<br/> )<br/> (alert "Unable to display dialog box! 无法显示对话框!")<br/> )<br/> (unload_dialog index_value)<br/> )<br/> (alert "Unable to load dialog box! 无法加载对话框!")<br/> )<br/> (if (= re 1) (progn<br/> ......<br/> ))<br/> (princ)<br/>)<br/>(defun getdata ()<br/> (setq z1 (nth (atoi (get_tile "popup1")) (list "HYA"))<br/> z2 (nth (atoi (get_tile "popup2")) (list 10 20 30 50 100 200 300 500 600 1200))<br/> z3 (nth (atoi (get_tile "popup3")) (list 0.4 0.5))<br/> z4 (read (get_tile "editbox1"))<br/> )<br/>)</p>
页:
[1]
2