明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4831|回复: 13

[提问] 求修改个程序 读取曲线桩号后生成以下格式的txt格式

[复制链接]
发表于 2013-9-22 11:41:20 | 显示全部楼层 |阅读模式
20明经币
本帖最后由 spp_wall 于 2013-9-24 21:40 编辑

   如题   有没什么软件能实现?

   现在纬地的标注只能标注 固定的桩号! 如果要标注任意点的桩号 还是比较繁琐  比如市政道路的路幅宽度 渐变段太多 现在的方法改路幅宽度很麻烦,找了很多地方都没有找到修改纬地路幅宽度的好办法,不知道有没同行有更好的办法呢?

下面这个lsp能实现标注任意点桩号  但是 没有生成文本格式

如果可以 谁有能力希望能完善成下面的格式  就是纬地的wid格式

点取主线一点 输出这个点的桩号  然后点取下一点 输出距离 点下个点输出距离

格式如下:

ZZZZZZZ (左幅)

     桩号       距离1      距离2     距离3    距离4    距离5  
     0.000       1.00      17.00       0.00       0.00       0.00          0
   280.000       1.00      17.00       0.00       0.00       0.00          0

   280.000       1.00      11.50       0.00       0.00       0.00          0
  1612.586       1.00      11.50       0.00       0.00       0.00          0


(vl-load-com)
(vl-load-com)
(defun c:zhcx ();桩号查询
(prompt "2010-07-27 zo roo  CGGC 武赤公路")
(prompt "*查询线路任意点桩号* << C:zhcx>> *计算中桩坐标*")
(setq old_lay (getvar "clayer"))
(if (=(tblobjname "LAYER" "桩号标注") nil)
    (progn
        (entmake (list
                    '(0 . "LAYER")
                    '(100 . "AcDbSymbolTableRecord")
                    '(100 . "AcDbLayerTableRecord")
                    '(6 . "CONTINUOUS")
                    '(62 . 3)
                    '(70 . 0)
                    (cons 2 "桩号标注")
                  )
        )
    )
)
(setvar "clayer" "桩号标注")
(setq en  (entsel "\n选择道路中心线: ")
a (getreal "\n请输入起点桩号:")
e   (car en)
pt  (cadr en)
)
(if (setq len (getreal "\n输入垂线长度(道路半幅宽):")) ;此处要加入非法输入的控制
      (progn
(setq OBJ (vlax-ename->vla-object (car en)))
)
)
(while (setq pt0 (getPoint "\n选择查询点:"))
;画曲线的垂线
(setq Perpt (vlax-curve-getClosestPointTo OBJ pt0 T)
    LST   (vlax-curve-getfirstderiv OBJ (vlax-curve-getparamatpoint OBJ Perpt))
    ANG   (atan (/ (cadr LST) (car LST)))
    pt1   (polar Perpt (+ ANG (* 0.5 pi)) len)
    pt2   (polar Perpt (- ANG (* 0.5 pi)) len)
     ;此处就是你画出来的是水平线的原因,变量换个方向即可
   )
(setq ang2 (angtos (angle pt2 pt1)0 4) )
   (command "pline" pt1 pt2 "")
;计算桩号
  (setq leng (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e))
  leng1 (+ a (vlax-curve-getDistAtPoint e Perpt))
  leng2   (- leng leng1)
)
;计算桩号
(if (< leng1 0.0) (setq fh "-") (setq fh "+"))
(setq nn1 (fix (/ leng1 1000.0 )))
(setq nn2 (abs(- leng1 (* 1000.0 nn1 ))))
     (if  (= nn2 0.0) (setq str_1 (strcat fh "00" )))
     (if  (and (> nn2 0) (< nn2 10.0)) (setq str_1 (strcat (strcat fh "00" ) (rtos nn2 2 3))))
     (if  (and (> nn2 10.0) (< nn2 100.0)) (setq str_1 (strcat (strcat fh "0" ) (rtos nn2 2 3))))
     (if  (>= nn2 100.0)  (setq str_1 (strcat fh (rtos nn2 2 3))))

  (setq str_1 (strcat "K"(rtos nn1 2 0)"+" (rtos nn2 2 3) ))
  (setq pt4 (polar pt1 (+ (* pi 0.45) ang) (* -2 (* 1.65406 0.67))))
  (command "text" "j" "MC" pt4 "0.3" ang2 str_1)
(setq py (rtos (nth 0 pt0)));提取测量坐标系Y值
(setq px (rtos (nth 1 pt0)));提取测量坐标洗X值
(setq pxy (strcat str_1"中桩坐标:X="px",Y="py))
(princ pxy)
)
  (princ)
)

附件: 您需要 登录 才可以下载或查看,没有账号?注册

最佳答案

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2013-9-22 11:41:21 | 显示全部楼层
  1. (vl-load-com)

  2. (defun c:zhcx (/ a ang ang2 e en fh file len leng leng1        leng2 lst nn1 nn2 obj old_lay perpt pt pt0
  3.                pt1 pt2 pt4 px pxy py str_1) ;桩号查询
  4.   (prompt "2010-07-27 zo roo  CGGC 武赤公路")
  5.   (prompt "*查询线路任意点桩号* << C:zhcx>> *计算中桩坐标*")
  6.   (setq old_lay (getvar "clayer"))
  7.   (if (= (tblobjname "LAYER" "桩号标注") nil)
  8.     (progn
  9.       (entmake (list
  10.                  '(0 . "LAYER")
  11.                  '(100 . "AcDbSymbolTableRecord")
  12.                  '(100 . "AcDbLayerTableRecord")
  13.                  '(6 . "CONTINUOUS")
  14.                  '(62 . 3)
  15.                  '(70 . 0)
  16.                  (cons 2 "桩号标注")
  17.                )
  18.       )
  19.     )
  20.   )
  21.   (setvar "clayer" "桩号标注")
  22.   (setq        en (entsel "\n选择道路中心线: ")
  23.         a  (getreal "\n请输入起点桩号:")
  24.         e  (car en)
  25.         pt (cadr en)
  26.   )
  27.   (if (setq len (getreal "\n输入垂线长度(道路半幅宽):")) ;此处要加入非法输入的控制
  28.     (progn
  29.       (setq obj (vlax-ename->vla-object (car en)))
  30.     )
  31.   )

  32.   ;; A1 追加方式打开保存文件
  33.   (if (null filename)
  34.     (setq filename (getfiled
  35.                      "保存到文件"
  36.                      (strcat (getvar "dwgprefix")
  37.                              (vl-filename-base (getvar "dwgname"))
  38.                      )
  39.                      "txt"
  40.                      1
  41.                    )
  42.     )
  43.   )
  44.   (setq file (open filename "a"))
  45.   (setvar "DIMZIN" 0)



  46.   (while (setq pt0 (getpoint "\n选择查询点:"))
  47.                                         ;画曲线的垂线
  48.     (setq perpt        (vlax-curve-getclosestpointto obj pt0 t)
  49.           lst        (vlax-curve-getfirstderiv obj (vlax-curve-getparamatpoint obj perpt))
  50.           ang        (atan (/ (cadr lst) (car lst)))
  51.           pt1        (polar perpt (+ ang (* 0.5 pi)) len)
  52.           pt2        (polar perpt (- ang (* 0.5 pi)) len)
  53.                                         ;此处就是你画出来的是水平线的原因,变量换个方向即可
  54.     )
  55.     (setq ang2 (angtos (angle pt2 pt1) 0 4))
  56.     (command "pline" pt1 pt2 "")
  57.                                         ;计算桩号
  58.     (setq leng        (vlax-curve-getdistatparam e (vlax-curve-getendparam e))
  59.           leng1        (+ a (vlax-curve-getdistatpoint e perpt))
  60.           leng2        (- leng leng1)
  61.     )
  62.                                         ;计算桩号
  63.     (if        (< leng1 0.0)
  64.       (setq fh "-")
  65.       (setq fh "+")
  66.     )
  67.     (setq nn1 (fix (/ leng1 1000.0)))
  68.     (setq nn2 (abs (- leng1 (* 1000.0 nn1))))
  69.     (if        (= nn2 0.0)
  70.       (setq str_1 (strcat fh "00"))
  71.     )
  72.     (if        (and (> nn2 0) (< nn2 10.0))
  73.       (setq str_1 (strcat (strcat fh "00") (rtos nn2 2 3)))
  74.     )
  75.     (if        (and (> nn2 10.0) (< nn2 100.0))
  76.       (setq str_1 (strcat (strcat fh "0") (rtos nn2 2 3)))
  77.     )
  78.     (if        (>= nn2 100.0)
  79.       (setq str_1 (strcat fh (rtos nn2 2 3)))
  80.     )

  81.     (setq str_1 (strcat "K" (rtos nn1 2 0) "+" (rtos nn2 2 3)))
  82.     (setq pt4 (polar pt1 (+ (* pi 0.45) ang) (* -2 (* 1.65406 0.67))))
  83.     (command "text" "j" "MC" pt4 "0.3" ang2 str_1)

  84.     ;; A2 保存数据
  85.     (setq strout (rtos leng1 2 3))
  86.     (write-distance pt0 file strout)


  87.     (setq py (rtos (nth 0 pt0)))        ;提取测量坐标系Y值
  88.     (setq px (rtos (nth 1 pt0)))        ;提取测量坐标洗X值
  89.     (setq pxy (strcat str_1 "中桩坐标:X=" px ",Y=" py))
  90.     (princ pxy)
  91.   )

  92.   ;; A3 关闭文件
  93.   (close file)
  94.   (princ)
  95. )

  96. (defun write-distance (p file str /)
  97.   (princ "\n输出各点距离,回车退出")

  98.   (while (setq p2 (getpoint p "指定下一点:"))
  99.     (setq str (strcat str "\t" (rtos (distance p2 p) 2 2))
  100.           p   p2
  101.     )
  102.   )
  103.   (write-line str file)
  104. )
回复

使用道具 举报

 楼主| 发表于 2013-9-22 11:42:02 | 显示全部楼层
本帖最后由 spp_wall 于 2013-9-22 11:53 编辑

如果能实现下面说的功能  还可以追加明经B

点取主线一点 输出这个点的桩号  然后点取下一点 输出距离 点下个点输出距离

格式如下:

ZZZZZZZ (左幅)

     桩号       距离1      距离2     距离3    距离4    距离5  
     0.000       1.00      17.00       0.00       0.00       0.00          0
   280.000       1.00      17.00       0.00       0.00       0.00          0

   280.000       1.00      11.50       0.00       0.00       0.00          0
  1612.586       1.00      11.50       0.00       0.00       0.00          0

回复

使用道具 举报

发表于 2013-9-22 19:56:27 | 显示全部楼层
能附个DWG格式的测试图吗?
回复

使用道具 举报

发表于 2013-9-22 19:59:21 | 显示全部楼层
期待高手能帮助解决
回复

使用道具 举报

 楼主| 发表于 2013-9-23 08:39:12 | 显示全部楼层
scream2658 发表于 2013-9-22 19:56
能附个DWG格式的测试图吗?

已经添加了测试文件  希望能帮帮忙!
回复

使用道具 举报

发表于 2013-9-23 14:39:28 | 显示全部楼层
楼主,你说的功能用LISP都能实现,可能是你这个东西专业性太强了吧。我一直没明白你说的距离是什么意思? 是基于某个已知桩号,然后求人为指定点与这个已知桩的距离吗?还有你给的示例DWG图还是不太清晰。看了你的图几遍,真不知道你要求的是什么。麻烦你再说的具体点。因为写LISP的,不一定都是你这个行业的,所谓隔行如隔山。你要别人能帮你,你可能先要花点时间跟大家解释明白你要实现的目的。专业方面的东西最好也能讲讲,这样大家也好帮助你。
回复

使用道具 举报

 楼主| 发表于 2013-9-23 15:09:33 | 显示全部楼层
本帖最后由 spp_wall 于 2013-9-23 15:11 编辑
scream2658 发表于 2013-9-23 14:39
楼主,你说的功能用LISP都能实现,可能是你这个东西专业性太强了吧。我一直没明白你说的距离是什么意思? 是 ...

应该不会吧
上面的lsp   实现了在曲线上标注中心桩号 其实也就是曲线长度   接下来要实现的就是下面的内容
1:把提取的中心桩号 提取到文本  比如你点一下曲线上的点 出现280 把这个数字提取出来 就是我的回复里面的格式中的桩号下的280.这时候的点称点1 是曲线上的点 这个曲线就是道路的中心线 一般道路分左右两侧
2:由于道路分两侧 所以回复中格式有ZZZZ(左幅) 这样来区分左边很右边道路
3:再点一个点 这里称点2 这个点与开始曲线上点的距离就是回复中格式下的距离1
4:继续点一点 就是点三  距离3就是点2与点3的距离
5:以此类推 距离四就是点3与点4的距离了
6:距离点完后  重新拾取一个曲线上的点  也就是道路中心上的一个点  循环前面的1-5条要求
7:继续点曲线上的点 循环前面的1-5条要求
后面的都是循环了  把循环的桩号和距离按回复中的那样 生成txt格式就OK了
回复

使用道具 举报

 楼主| 发表于 2013-9-23 15:27:08 | 显示全部楼层
scream2658 发表于 2013-9-23 14:39
楼主,你说的功能用LISP都能实现,可能是你这个东西专业性太强了吧。我一直没明白你说的距离是什么意思? 是 ...

放上了数据形成的录像  你看看有用么!
回复

使用道具 举报

发表于 2013-9-23 17:36:36 | 显示全部楼层
能问下,这个距离是两点沿曲线的距离?还是点到点之间的最近距离?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-23 13:47 , Processed in 0.217533 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表