dunwudun 发表于 2008-1-22 14:00:00

[求助]如何在一条直线中间插入文字

<p>请教各位大侠:</p><p>如何在一条直线的中间插入文字标记,要用到哪些函数,请给点思路,谢谢。</p><p>我要的效果是这样的:------------------------HYA10*2*0.4---------------------------------</p><p>老弟刚学lisp,费了九牛二虎之力写了下面的代码,请大侠指点一下改进思路,不胜感激</p><p>;画电缆1.lsp<br/>;画电缆</p><p>(defun c:hdl()<br/>&nbsp; (setq l 50 l1 3.5 h1 3.5)&nbsp;;设定电缆长度l、字偏离直线的距离为l1、字高h1<br/>&nbsp; (graphscr)&nbsp;;切换到图形窗口<br/>&nbsp; (setq oce (getvar "cmdecho"))&nbsp;;储存旧的指令响应值<br/>&nbsp; (setvar "cmdecho" 0)&nbsp;;关闭指令响应<br/>&nbsp; (setq p1 (getpoint "\n电缆的起点:"))&nbsp;;取得基准点p1<br/>&nbsp; (setq a1 (getangle p1 "电缆的方向:"))&nbsp;;取得电缆的方向<br/>&nbsp;&nbsp; (setq p2 (polar p1 a1 l))&nbsp;;计算p2的坐标<br/>&nbsp;&nbsp; (setq p3 (list (/ (+ (car p1) (car p2)) 2) (/ (+ (cadr p1) (cadr p2)) 2) 0))&nbsp;;计算p1p2的中点p3的坐标<br/>&nbsp;&nbsp; (setq p4 (polar p3 (+ a1 (/ pi 2)) l1))&nbsp;;计算直线上面的文字位置<br/>&nbsp;&nbsp; (setq p5 (polar p3 (- a1 (/ pi 2)) l1))&nbsp;;计算直线下面的文字位置<br/>&nbsp;&nbsp; (setq z1 (getstring "\n请输入电缆的型号[如HYA10*2*0.4]:"))&nbsp;;取得电缆标注<br/>&nbsp;&nbsp; (setq Z2 (getdist "\n请输入电缆的长度[米]:"))&nbsp;;取得电缆的长度</p><p><br/>&nbsp; (command ".line" p1 p2 "")&nbsp;;画直线<br/>&nbsp;&nbsp;&nbsp; (command ".text" "m" p4 h1 a1 z1)&nbsp;;以中央对齐的方式写直线上面的字<br/>&nbsp; (command ".text" "m" p5 h1 a1 z2)&nbsp;;以中央对齐的方式写直线下面的字</p><p>&nbsp; (setvar "cmdecho" oce)&nbsp;;恢复旧的指令响应值<br/>&nbsp; (princ)<br/>&nbsp;)&nbsp;;c:bb函数结束</p>

dunwudun 发表于 2008-1-22 14:29:00

这个问题困扰我好几天了,睡也睡不着觉,请帮帮忙。我想到textbox函数,可是没示例,不理解。

ljpnb 发表于 2008-1-22 17:05:00

本帖最后由 作者 于 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函数结束

dunwudun 发表于 2008-1-22 22:50:00

<p>呵呵,学习中,很感谢楼上的老师的指导。特别是对于不同角度的文字的处理简直太好了。</p><p></p><p>因为粗心,我把没有经过修改的代码发上来了,现在附上旧作:<br/>;画电缆1.lsp<br/>;定长画电缆,</p><p>(defun c:hdl()<br/>&nbsp; (setq l 50 l1 2.25 h1 2.5)&nbsp;;设定电缆长度l、字偏离直线的距离为l1、字高h1<br/>&nbsp; (graphscr)&nbsp;;切换到图形窗口<br/>&nbsp; (setq oce (getvar "cmdecho"))&nbsp;;储存旧的指令响应值<br/>&nbsp; (setvar "cmdecho" 0)&nbsp;;关闭指令响应<br/>&nbsp; (setq<br/>&nbsp;&nbsp;&nbsp; p1 (getpoint "\n电缆的起点:")&nbsp;;取得基准点p1<br/>&nbsp;&nbsp;&nbsp; a1 (getangle p1 "\n电缆的方向:")&nbsp;;取得电缆的方向<br/>&nbsp;&nbsp;&nbsp; p2 (polar p1 a1 l)&nbsp;;计算p2的坐标<br/>&nbsp;&nbsp;&nbsp; p3 (list (/ (+ (car p1) (car p2)) 2.0) (/ (+ (cadr p1) (cadr p2)) 2.0) 0)&nbsp;;计算p1p2的中点p3的坐标<br/>&nbsp;&nbsp;&nbsp; p4 (polar p3 (+ a1 (/ pi 2.0)) l1)&nbsp;;计算直线上面的文字位置<br/>&nbsp;&nbsp;&nbsp; p5 (polar p3 (- a1 (/ pi 2.0)) l1)&nbsp;;计算直线下面的文字位置<br/>&nbsp;&nbsp;&nbsp; z1 (getstring "\n请输入电缆的型号[如HYA10*2*0.4]:")&nbsp;;取得电缆标注<br/>&nbsp;&nbsp;&nbsp; Z2 (getdist "\n请输入电缆的长度[米]:")&nbsp;;取得电缆的长度<br/>&nbsp; )</p><p>&nbsp; (command ".line" p1 p2 "")&nbsp;;画直线<br/>&nbsp; <br/>&nbsp; (setq osm (getvar "osmode"));储存对象捕捉的系统变量<br/>&nbsp; (setvar "osmode" 0);关闭对象捕捉<br/>&nbsp;&nbsp; (command ".text" "m" p4 h1 (/ (* a1 180) pi) z1)&nbsp;;以中央对齐的方式写直线上面的字<br/>&nbsp;&nbsp; (command ".text" "m" p5 h1 (/ (* a1 180) pi) (rtos z2 2 1))&nbsp;;以中央对齐的方式写直线下面的字<br/>&nbsp; (setvar "osmode" osm);恢复对象捕捉<br/>&nbsp; (setvar "cmdecho" oce)&nbsp;;恢复旧的指令响应值<br/>&nbsp; (princ)<br/>&nbsp;)&nbsp;;c:hdl函数结束</p><p></p>

linshucai 发表于 2008-1-23 08:51:00

<p>;画电缆1.lsp<br/>;定长画电缆,</p><p>(defun c:hdl()<br/>&nbsp; (setq l 50 l1 2.25 h1 2.5) ;设定电缆长度l、字偏离直线的距离为l1、字高h1<br/>&nbsp; (graphscr) ;切换到图形窗口<br/>&nbsp; (setq oce (getvar "cmdecho")) ;储存旧的指令响应值<br/>&nbsp; (setvar "cmdecho" 0) ;关闭指令响应<br/>&nbsp; (setq<br/>&nbsp;&nbsp;&nbsp; p1 (getpoint "\n电缆的起点:") ;取得基准点p1<br/>&nbsp;&nbsp;&nbsp; p2 (getpoint P1 "\n电缆的终点:")<br/>&nbsp;&nbsp;&nbsp; a1 (angle p1 P2 ) ;取得电缆的方向<br/>&nbsp;&nbsp;&nbsp; ;p2 (polar p1 a1 l) ;计算p2的坐标<br/>&nbsp;&nbsp;&nbsp; p3 (list (/ (+ (car p1) (car p2)) 2.0) (/ (+ (cadr p1) (cadr p2)) 2.0) 0) ;计算p1p2的中点p3的坐标<br/>&nbsp;&nbsp;&nbsp; p4 (polar p3 (+ a1 (/ pi 2.0)) l1) ;计算直线上面的文字位置<br/>&nbsp;&nbsp;&nbsp; p5 (polar p3 (- a1 (/ pi 2.0)) l1) ;计算直线下面的文字位置<br/>&nbsp;&nbsp;&nbsp; z1 (getstring "\n请输入电缆的型号[如YJV-3*240+2*120]:") ;取得电缆标注<br/>&nbsp;&nbsp;&nbsp; Z2 (DISTANCE P1 P2);(getdist "\n请输入电缆的长度[米]:") ;取得电缆的长度<br/>&nbsp; )</p><p>&nbsp; (command ".line" p1 p2 "") ;画直线<br/>&nbsp; <br/>&nbsp; (setq osm (getvar "osmode"));储存对象捕捉的系统变量<br/>&nbsp; (setvar "osmode" 0);关闭对象捕捉<br/>&nbsp;&nbsp; (command ".text" "m" p4 h1 (/ (* a1 180) pi) (strcat z1 " " (rtos z2 2 1))) ;以中央对齐的方式写直线上面的字<br/>&nbsp;&nbsp; ;(command ".text" "m" p5 h1 (/ (* a1 180) pi) (rtos z2 2 1)) ;以中央对齐的方式写直线下面的字<br/>&nbsp; (setvar "osmode" osm);恢复对象捕捉<br/>&nbsp; (setvar "cmdecho" oce) ;恢复旧的指令响应值<br/>&nbsp; (princ)<br/>&nbsp;) ;c:hdl函数结束</p><p>更改了一下,这样可以更方便,应用文本输出可以方便统计各种电缆的长度。</p>

dunwudun 发表于 2008-1-23 16:36:00

<p>统计很令人激动人心,学生学力不及,目前还不需要这个功能,待以后再来回顾楼上老师的指导。</p><p>如何在下面的代码中添加一个循环呢?有请各位老师不吝赐教了。</p><p>;按比例画电缆<br/>(defun c:hdl()<br/>&nbsp; (setq l1 2.25 ;设定字偏离直线的距离为l1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h1 2.5)&nbsp;;设定字高h1<br/>&nbsp; (graphscr)&nbsp;;切换到图形窗口<br/>&nbsp; (setq oce (getvar "cmdecho"))&nbsp;;储存旧的指令响应值<br/>&nbsp; (setvar "cmdecho" 0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;关闭指令响应<br/>&nbsp; (setq<br/>&nbsp;&nbsp;&nbsp; bl (getint "\n请输入比例尺内的X值[推荐2000]:")<br/>&nbsp;&nbsp;&nbsp; p1 (getpoint "\n电缆的起点:")&nbsp;;取得基准点p1<br/>&nbsp; )<br/>;;;;;;;;怎么开始循环呢???<br/>(setq<br/>&nbsp;&nbsp;&nbsp; a1 (getangle p1 "\n电缆的方向:")&nbsp;;取得电缆的方向<br/>&nbsp;&nbsp;&nbsp; len (getdist "\n请输入电缆的长度[米]:")&nbsp;;取得电缆的长度<br/>&nbsp;&nbsp;&nbsp; p2 (polar p1 a1 (/ (* len 1000) bl))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;计算p2的坐标<br/>&nbsp;&nbsp;&nbsp; p3 (list (/ (+ (car p1) (car p2)) 2.0) (/ (+ (cadr p1) (cadr p2)) 2.0))&nbsp;;计算p1p2的中点p3的坐标<br/>)</p><p>(if (and&nbsp; (&gt; a1 (* pi 0.5))(&lt; a1 (* pi 1.5)))<br/>&nbsp;&nbsp;&nbsp; (setq a1 (angle p2 p1))<br/>)</p><p>(setq<br/>&nbsp;&nbsp;&nbsp; p4 (polar p3 (+ a1 (/ pi 2)) l1)&nbsp;;计算直线上面的文字位置<br/>&nbsp;&nbsp;&nbsp; p5 (polar p3 (- a1 (/ pi 2)) l1)&nbsp;;计算直线下面的文字位置<br/>&nbsp;&nbsp;&nbsp; z1 (getstring "\n请输入电缆的型号[如HYA10*2*0.4]:")&nbsp;;取得电缆标注&nbsp; <br/>)</p><p>&nbsp; (command ".line" p1 p2 "")&nbsp;;画直线<br/>&nbsp; ;(command ".point" p2)&nbsp;;画点标记</p><p>&nbsp; (setq osm (getvar "osmode"));储存对象捕捉的系统变量<br/>&nbsp; (setvar "osmode" 0);关闭对象捕捉</p><p>&nbsp;&nbsp; (command ".text" "m" p4 h1 (/ (* a1 180) pi) z1)&nbsp;;以中央对齐的方式写直线上面的字<br/>&nbsp;&nbsp; (command ".text" "m" p5 h1 (/ (* a1 180) pi) (rtos len 2 1))&nbsp;;以中央对齐的方式写直线下面的字<br/>&nbsp; (setvar "osmode" osm)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;恢复对象捕捉<br/>&nbsp; (setvar "cmdecho" oce)&nbsp;;恢复旧的指令响应值<br/>&nbsp; (command ".-pan" p2 p1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;平移窗口 <br/>&nbsp; ;(setq p1 p2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;开始重复,怎么循环呢???<br/>&nbsp; (princ)<br/>&nbsp;)&nbsp;;c:hdl函数结束</p><p></p>

carrot1983 发表于 2008-1-23 17:39:00

<p>好乱啊。。。看得花。。。</p><p>(while (setq p1 (getpoint "\n电缆的起点&lt;退出&gt;:"))</p><p>。。。。)</p><p>你要的循环。。。</p>

dunwudun 发表于 2008-1-23 21:26:00

<p>受楼上老师的启发,写了下面的练习以作感谢。</p><p>;模仿.line命令<br/>(defun c:xm_line()<br/>&nbsp;&nbsp; (setq p1 (getpoint "\n电缆的起点:"))<br/>&nbsp;&nbsp; (while (setq a1 (getangle p1 "\n电缆的方向&lt;右键退出/Esc退出&gt;:"))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq p2 (polar p1 a1 50))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command ".line" p1 p2 "")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq p1 p2)<br/>&nbsp;&nbsp; )<br/>)</p><p></p>

dunwudun 发表于 2008-1-25 17:47:00

<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/>&nbsp;key = "popup1";<br/>&nbsp;label = "电缆型号:";<br/>&nbsp;list = "HYA";<br/>&nbsp;edit_width = 12;<br/>}<br/>: popup_list {<br/>&nbsp;key = "popup2";<br/>&nbsp;label = "电缆对数:";<br/>&nbsp;list = "10\n20\n30\n50\n100\n200\n300\n500\n600\n1200";<br/>&nbsp;edit_width = 12;<br/>}<br/>: popup_list {<br/>&nbsp;key = "popup3";<br/>&nbsp;label = "电缆线径:";<br/>&nbsp;list = "0.4\n0.5";<br/>&nbsp;edit_width = 12;<br/>}<br/>: edit_box {<br/>&nbsp;key = "editbox1";<br/>&nbsp;label = "电缆长度(米):";<br/>}<br/>: button {<br/>&nbsp;key = "button1";<br/>&nbsp;label = "确定";<br/>&nbsp;is_default = true;<br/>}<br/>}</p><p></p><p></p>

ZZXXQQ 发表于 2008-1-25 20:37:00

<p>在未退出对话框时对变量赋值。</p><p>(defun c:tt ()<br/>&nbsp;(if (&gt; (setq index_value (load_dialog "dcl_hdl")) 0) (progn<br/>&nbsp; (if (new_dialog "dcl_hdl" index_value) (progn<br/>&nbsp;&nbsp; (action_tile "button1" "(getdata) (done_dialog 1)")<br/>&nbsp;&nbsp; (action_tile "cancel" "(done_dialog 0)")<br/>&nbsp;&nbsp; (setq re (start_dialog))<br/>&nbsp; )<br/>&nbsp;&nbsp; (alert "Unable to display dialog box! 无法显示对话框!")<br/>&nbsp; )<br/>&nbsp; (unload_dialog index_value)<br/>&nbsp;)<br/>&nbsp; (alert "Unable to load dialog box! 无法加载对话框!")<br/>&nbsp;)<br/>&nbsp;(if (= re 1) (progn<br/>&nbsp;......<br/>&nbsp;))<br/>&nbsp;(princ)<br/>)<br/>(defun getdata ()<br/>&nbsp;(setq z1 (nth (atoi (get_tile "popup1")) (list "HYA"))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; z2 (nth (atoi (get_tile "popup2")) (list 10 20 30 50 100 200 300 500 600 1200))<br/>&nbsp;&nbsp;&nbsp; z3 (nth (atoi (get_tile "popup3")) (list 0.4 0.5))<br/>&nbsp;&nbsp;&nbsp; z4 (read (get_tile "editbox1"))<br/>&nbsp;)<br/>)</p>
页: [1] 2
查看完整版本: [求助]如何在一条直线中间插入文字