wowan1314 发表于 2007-11-17 20:05:00

[求助]各位大侠帮忙编个标管长的LSP

<p>&nbsp;&nbsp;&nbsp; 在实际工作中经常要对PL线画的管子标管径,管长,坡度。每次都先复制文字再旋转,后量取长度再修改。</p><p>想请大侠编个LSP实现如下功能:1,选择管线即可在管线上标注单行文字:DN300&nbsp; L=30.0&nbsp; i=0.004(管线可能是L线或者PL线)。(各元素间用空格隔离,若有难度可由DN300-L=30.0-i=0.004代替)</p><p>2,其中L=后面的数字是框选管线后得到的(保留一位小数)! 其他部分照标就是(我的计算才能确定)</p><p>3,文字随鼠标在管线上面移动,由鼠标左键确定是上或者下!右键退出!(能实现上两步就很好了)</p><p>希望大侠能帮忙思考!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不胜感激!!&nbsp; !&nbsp;</p>

wowan1314 发表于 2007-11-17 20:23:00

另外文字样式应设定为TXT+HZTXT,出现的单行文字应该于线平行! 字线距离与文字大小为可设置选项,默认字线距离80,字高300。             期待

wowan1314 发表于 2007-11-17 21:19:00

<p>忘记今天休假哦! 高手度假去了! 为免帖子沉了!我顶起</p>

sailorcwx 发表于 2007-11-18 00:13:00

sailorcwx 发表于 2007-11-18 00:17:00

<p>上面是我自编自用的<br/>其实你说的不是不能实现,只是我觉得点管线不是很理想,最好是点2个检查井来测量距离。因为管线可能在交叉的时候打断过,这个时候读取的长度不是我们想要的长度。</p>

wowan1314 发表于 2007-11-18 14:36:00

<p>楼上的程序看着蛮好! 说的也有道理,我忽略了管线在检查井处打断过了!看来楼上也是做水的把!</p><p>那么更正一点:: 由点取两点(一般是两圆心点)来确定管线的长度与文字的角度问题!(那么对象捕捉应该被开启)。</p><p>楼上程序再修改下应该能实现这个功能吧!?</p><p>请高手试着编写。</p><p></p>

dwgplt 发表于 2007-11-19 08:59:00

leeyuan 发表于 2007-11-19 09:11:00

<p>基本满足楼主的要求,可能局部需要调整。</p><p>(defun c:WF (/ old_osmode d i p1 ent p2 di ds pt dn ang)<br/>&nbsp; (setq old_osmode (getvar "osmode"))<br/>&nbsp; (setq old_layer (getvar "clayer"))<br/>&nbsp; (if (not (setq d (getreal "\n输入管径 D&lt;200mm&gt;:")))<br/>&nbsp;&nbsp;&nbsp; (setq d 200)<br/>&nbsp; )<br/>&nbsp; (if (= d 200)<br/>&nbsp;&nbsp;&nbsp; (setq i "0.008")<br/>&nbsp;&nbsp;&nbsp; (setq i "0.005")<br/>&nbsp; )<br/>&nbsp; (while (setq p1 (getpoint "\n选择第一点&lt;回车退出&gt;:"))<br/>&nbsp;&nbsp;&nbsp; (setvar "osmode" 5)<br/>&nbsp;&nbsp;&nbsp; (setq p2 (getpoint p1 "\n选择第二点:"))<br/>&nbsp;&nbsp;&nbsp; (setvar "osmode" 0)<br/>&nbsp;&nbsp;&nbsp; (setq di (distance p1 p2))<br/>&nbsp;&nbsp;&nbsp; (setq ds (rtos (/ di 1000) 2 1))<br/>&nbsp;&nbsp;&nbsp; (setq dn (strcat "D" (rtos d 2 0) ",L=" ds ",i=" i))<br/>&nbsp;&nbsp;&nbsp; (setq ang (angle p1 p2))<br/>&nbsp;&nbsp;&nbsp; (setq ang (* ang (/ 180 3.1415926)))<br/>&nbsp;&nbsp;&nbsp; (setq pt (getpoint "\n输入文字脚点:"))<br/>&nbsp;&nbsp;&nbsp; (setvar "clayer" "s-Wsbz")<br/>&nbsp;&nbsp;&nbsp; (command "text" pt gao ang dn)<br/>&nbsp;&nbsp;&nbsp; (command "move" (entlast) "" pt pause)<br/>&nbsp;&nbsp;&nbsp; (setvar "osmode" 5)<br/>&nbsp; )<br/>&nbsp; (setvar "osmode" old_osmode)<br/>;;;&nbsp; (setvar "clayer" old_layer)<br/>&nbsp; (princ)<br/>)</p>

wowan1314 发表于 2007-11-19 10:29:00

<p>关于四楼的标注应该很多! 建议7楼搜索下“管径标注LSP”就好了!但随鼠标上下移动估计就难找点了!</p><p></p><p>感谢8楼的热心!但似乎程序有点问题! 无法执行!思路差不多了! 先点取两点来确定长度与方向!而文字输入位置最好能像四楼一样可以在线上下移动!而最初应该加上设置比例(默认1:100)这样比较好把!</p><p>期待新版本!&nbsp;&nbsp;&nbsp; 谢谢</p>

ZZXXQQ 发表于 2007-11-19 10:39:00



dcl_settings : default_dcl_settings { audit_level =3; }
wtxt : dialog {
label="Enter the Text 输入标注文本";
:popup_list{
key="apost";
label="管径DN=";
list="";
value="6";
}
:edit_box{key="len";label="管长 L=";}
:edit_box{key="post";label="坡度 i=";}
ok_cancel_help;
}
mhelp : dialog {
label = "HELP 帮助";
: list_box { key="info_box"; width=60; height=20;}
ok_only ;
}

;标注管径、管长、坡度 明经 ZZXXQQ 2007.11.19
(DEFUN C:WTXT ()
(SETVAR "CMDECHO" 0)
(COMMAND "STYLE" "HZ" "TXT,HZTXT" "" "" "" "" "" "")
(IF (< (GETVAR "DIMTXT") 300) (SETVAR "DIMTXT" 300))
(IF (< (GETVAR "DIMGAP") 80) (SETVAR "DIMGAP" 80))
(SETQ OLDOS (GETVAR "OSMODE")
      SC (GETVAR "DIMSCALE")
      H (GETVAR "DIMTXT")
      D (* (IF (> SC 0) SC 1) (+ (* H 0.5) (GETVAR "DIMGAP"))))
(SETQ BLST (LIST "25" "30" "40" "50" "100" "150" "200" "300" "400" "500"))
(SETVAR "OSMODE" 0)
(WHILE (SETQ PT1 (GETPOINT "\nInsert Point 插入点 :"))
(IF (SETQ PT2 (OSNAP PT1 "NEA")) (PROGN
(SETQ A (ANGLE PT2 PT1)
      PANG (- A (/ PI 2))
PD (RTOS (/ (SIN PANG) (COS PANG)) 2 4)
      ANG (- (* (/ A PI) 180) 90)
      ANG (IF (< ANG 0) (+ ANG 360) ANG)
      ANG (IF (< 120 ANG 300) (- ANG 180) ANG)
      PT3 (POLAR PT2 A D))
(IF (SETQ S1 (SSGET "C" PT2 PT2 '((0 . "ARC,CIRCLE,*LINE")))) (PROGN
   (SETQ EN (SSNAME S1 0))
   (COMMAND "LENGTHED" EN "")
   (SETQ L (RTOS (GETVAR "PERIMETER") 2 1))
)
   (SETQ L "0.0")
)
(IF (> (SETQ DCL_ID (LOAD_DIALOG "WTXT")) 0)
   (IF (NEW_DIALOG "wtxt" DCL_ID "") (PROGN
    (START_LIST "apost")(MAPCAR 'ADD_LIST BLST)(END_LIST)
(SET_TILE "len" L)
(SET_TILE "post" PD)
    (action_tile "help" "(PRINCHELP)")
    (action_tile "accept" "(GETDATA) (DONE_DIALOG 1)")
    (action_tile "cancel" "(DONE_DIALOG 0)")
    (SETQ RE (START_DIALOG))
   ) (PROGN
    (ALERT "Unable to display dialog box!\n无法显示对话框!")
    (UNLOAD_DIALOG DCL_ID)
   ))
   (ALERT "Unable to load dialog box!\n无法装载对话框!")
)
(IF (= RE 1) (COMMAND "TEXT" "M" PT3 H ANG TX))
))
(SETVAR "OSMODE" 0)
)
(SETVAR "OSMODE" OLDOS)
(SETVAR "CMDECHO" 0)
(PRINC)
)
(DEFUN GETDATA ()
(SETQ TX
(STRCAT "DN" (NTH (ATOI (GET_TILE "apost")) BLST)
          " L=" (GET_TILE "len")
    " i=" (GET_TILE "post"))
)
)
(DEFUN PRINCHELP ( / Q%O)
(SETQ Q%O (LIST
"      您好!" ""
"                欢迎您使用本软件!" ""
"" "" "" "" ""
"      软件运行条件:" ""
"                1、能运行AutoCAD R12以上版的计算机;" ""
"                2、支持下拉式菜单和对话框;" ""
"                3、实模式、世界坐标系。" ""
"" ""
"                用鼠标点选插入点时尽量靠近线条就行,不要使用" ""
"      特征点捕捉。从哪方向靠近线条,文字就写在哪边。" ""
"      程序自行判断文字方向。" ""
"                程序中使用尺寸标注的文字高度、比例、字线间距。" ""
"      如果要改变字高等参数,请修改相应的尺寸变量。" ""
"" "                若您在使用中有问题,请您及时与我们联系!" ""
"                        联系电话:010-"
"                        传      真:010-"
"                        电子邮箱:"))
(IF (NEW_DIALOG "mhelp" DCL_ID "") (PROGN
(START_LIST "info_box")(MAPCAR 'ADD_LIST Q%O)(END_LIST)
(action_tile "ok""(DONE_DIALOG 2)")
(START_DIALOG)
)
(ALERT "Unable to display dialog box!\n无法显示对话框!")
)
)

页: [1] 2 3 4
查看完整版本: [求助]各位大侠帮忙编个标管长的LSP