乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 102|回复: 18

[编程交流] 提取三维多段线桩号an

[复制链接]

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-5 22:28:47 | 显示全部楼层 |阅读模式
您好,我正在尝试将桩号和高程从三维多段线提取到txt文件
 
重要提示:对于车站,我只需要水平距离,不需要坡度距离
(我需要这个文件用于横截面)
 
这是一个旧代码,我试图更改它,但失败了!!例如,我附加了两个导出文件
 
  1. (defun c:sz (/ ent fh fn hnd itm num obj pnt sset v vexx)
  2. ;; helper to get 3dpoly coordinates
  3. (defun 3dpoly-verts  (en / elist  lst vex)
  4. (if (member "AcDb3dPolyline"
  5.       (mapcar 'cdr (entget en)))
  6.    (progn
  7.      (setq vex (entnext en))
  8.      (setq elist (entget vex))
  9.      (while (= (cdr (assoc 0 elist)) "VERTEX")
  10. (setq lst (cons (trans (cdr (assoc 10 elist)) 1 0) lst))
  11. (setq vex (entnext vex))
  12. (setq elist (entget vex))
  13. )
  14.      )
  15.    )
  16. (reverse lst)
  17. )
  18. ;;________________________________________________;;
  19. (setq sset (ssget '((-4 . "<OR")(0 . "POINT")
  20.                      (0 . "POLYLINE")(-4 . "OR>"))))
  21. (if sset
  22.    (progn
  23.      (setq itm 0 num (sslength sset))
  24.      (setq fn (getfiled "Αποθήκευση αρχείου station,Z" "" "txt" 1))
  25.      (if (/= fn nil)
  26.        (progn
  27.          (setq fh (open fn "w"))
  28.          (while (< itm num)
  29.            (setq hnd (ssname sset itm))
  30.            (setq ent (entget hnd))
  31.            (setq obj (cdr (assoc 0 ent)))
  32.            (cond
  33.              ((eq obj "POINT")
  34.                (setq pnt (cdr (assoc 10 ent)))
  35.                (setq pnt (trans pnt 0 1));;**CAB
  36.                (write-line (strcat (rtos (distance pnt pnt) 2 3) ","    ; i don't know how to give the distanse
  37.                                       (rtos (caddr pnt) 2 3)) fh)
  38.              )
  39.              ((= obj "POLYLINE")
  40.        (setq v hnd)
  41.        (setq vexx (3dpoly-verts v ))
  42.        (foreach pnt vexx
  43.                (write-line (strcat (rtos (distance pnt pnt) 2 3) ","; i don't know how to give the distanse
  44.                               (rtos (caddr pnt) 2 3)) fh)
  45. )               
  46. )
  47.              (t nil)
  48.            )
  49.            (setq itm (1+ itm))
  50.          )
  51.          (close fh)
  52.        )
  53.      )
  54.    )
  55. )
  56. (princ)
  57. )
  58. (princ)

测试1(开放多边形)。txt文件
test1(闭合多边形)。txt文件
测验图纸
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 22:32:32 | 显示全部楼层
如果你没有任何曲线,这将起作用,但你必须做距离点的xy位,记住毕达哥拉斯thereom。
 
  1. ; pline co-ords example
  2. (defun getcoords (ent)
  3. (vlax-safearray->list
  4.    (vlax-variant-value
  5.      (vlax-get-property
  6.    (vlax-ename->vla-object ent)
  7.    "Coordinates"
  8.      )
  9.    )
  10. )
  11. )
  12. (defun co-ords2xy ()
  13. ; convert now to a list of xy as co-ords are x y x y x y if 3d x y z x y z
  14. (setq numb (/ (length co-ords) 2))
  15. (setq I 0)
  16. (repeat numb
  17. (setq xy (list (nth i co-ords)(nth (+ I 1) co-ords) ))
  18. (setq co-ordsxy (cons xy co-ordsxy))
  19. (setq I (+ I 2))
  20. )
  21. )
  22. ; program starts here
  23. (setq co-ords (getcoords (car (entsel "\nplease pick pline"))))
  24. (co-ords2xy) ; list of 2d or 3d points making pline
  25. ; list xy is 2d or 3d pts
回复

使用道具 举报

1

主题

475

帖子

481

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 22:36:16 | 显示全部楼层
 
嗨,prodromosm,
 
只是一个想法,
我认为是时候开始尝试编写自己的代码了。
 
这个演示只是一种不同的方法。。。
试着理解代码,它是以一种简单的方式编写的,我认为它将很容易理解,如果不是,只要问。。。
 
  1. (defun c:demo (/ e fn fo lst par parpt poly pos pre pt s)
  2. (prompt "\nSelect a 3DPolyline to extract Stations and Elevations to txt file: ")
  3. (if
  4.    (and (setq s (ssget "_+.:E:S" '((0 . "POLYLINE") (-4 . "&") (70 . )))
  5. (setq fn (getfiled "Enter the output filename:" (getvar 'DWGPREFIX) "txt" 1))
  6. (setq pre (strcase (getstring "\nEnter station prefix:")))
  7.    );; and
  8.     (progn
  9.       (setq poly (vlax-ename->vla-object (ssname s 0))
  10.      e          (fix (vlax-curve-getEndParam poly))
  11.      pos  0
  12.      par  0
  13.      lst  nil
  14.       );; setq
  15.       (while (/= par (1+ e))
  16. (setq pt  (vlax-curve-getPointAtParam poly par)
  17.        pos (1+ pos)
  18. );; setq
  19. (if (not parpt)
  20.    (setq lst   (cons (strcat pre (itoa pos) "," "0.000," (rtos (caddr pt) 2 3)) lst)
  21.          parpt pt
  22.    );; setq
  23.    (setq lst (cons (strcat pre (itoa pos) "," (rtos (distance (list (car pt) (cadr pt)) (list (car parpt) (cadr parpt))) 2 3) "," (rtos (caddr pt) 2 3)) lst)
  24.          parpt pt
  25.    );; setq
  26. );; if
  27. (setq par (1+ par))
  28.       );; while
  29.       (if lst
  30. (progn
  31.    (setq lst (reverse lst)
  32.          fo  (open fn "w")
  33.    );; setq
  34.    (foreach l lst
  35.      (write-line l fo)
  36.    );; foreach
  37.    (close fo)
  38. );; progn
  39.       );; if
  40.     );; progn
  41. );; if
  42. (princ)
  43. );; demo

 
HTH公司
亨里克
回复

使用道具 举报

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-5 22:39:59 | 显示全部楼层
谢谢你,hmsilva。我有个问题。如果我想从多段线导出更多数据,我该怎么做?例如,在中间距离列之后,我想添加一个从起始列到elevetion的距离
 
回复

使用道具 举报

1

主题

475

帖子

481

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 22:45:18 | 显示全部楼层
 
不客气,prodromosm!
 
尝试
  1. (defun c:demo (/ acdist e fn fo lst par parpt pdist poly pos pre pt s)
  2. (prompt "\nSelect a 3DPolyline to extract Stations and Elevations to txt file: ")
  3. (if
  4.    (and (setq s (ssget "_+.:E:S" '((0 . "POLYLINE") (-4 . "&") (70 . )))
  5. (setq fn (getfiled "Enter the output filename:" (getvar 'DWGPREFIX) "txt" 1))
  6. (setq pre (strcase (getstring "\nEnter station prefix:")))
  7.    );; and
  8.     (progn
  9.       (setq poly (vlax-ename->vla-object (ssname s 0))
  10.      e          (fix (vlax-curve-getEndParam poly))
  11.      pos  0
  12.      par  0
  13.      acdist 0.0;; <--Start accumulated distance
  14.      lst  nil
  15.       );; setq
  16.       (while (/= par (1+ e))
  17. (setq pt  (vlax-curve-getPointAtParam poly par)
  18.        pos (1+ pos)
  19. );; setq
  20. (if (not parpt)
  21.    (setq lst   (cons (strcat pre (itoa pos) "," "0.000,0.000," (rtos (caddr pt) 2 3)) lst)
  22.          parpt pt
  23.    );; setq
  24.    (setq lst (cons (strcat pre (itoa pos) ","
  25.                            ;; store the partial distance at the pdist variable
  26.                            (rtos (setq pdist (distance (list (car pt) (cadr pt)) (list (car parpt) (cadr parpt)))) 2 3)
  27.                            ;; adding acdist and pdist, and store the accumulated distance at acdist variable
  28.                            "," (rtos (setq acdist (+ acdist pdist)) 2 3)
  29.                            "," (rtos (caddr pt) 2 3)) lst)
  30.          parpt pt
  31.    );; setq
  32. );; if
  33. (setq par (1+ par))
  34.       );; while
  35.       (if lst
  36. (progn
  37.    (setq lst (reverse lst)
  38.          fo  (open fn "w")
  39.    );; setq
  40.    (foreach l lst
  41.      (write-line l fo)
  42.    );; foreach
  43.    (close fo)
  44. );; progn
  45.       );; if
  46.     );; progn
  47. );; if
  48. (princ)
  49. );; demo
回复

使用道具 举报

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-5 22:47:03 | 显示全部楼层
嗨,席尔瓦,你能修改一下帖子#5中的代码吗
 
在帖子#5中,我们得到了这个结果
 
 
非常感谢。
 
你能把它改成只出口吗
 
回复

使用道具 举报

1

主题

475

帖子

481

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 22:51:07 | 显示全部楼层
 
 
嗨prodromosm,
正如我早些时候所说的
 
 
“我认为是时候开始尝试编写自己的代码了。”
 
 
所以,我确实给你想要修改的代码添加了一些注释,这是一项简单的任务,试着自己修改代码,如果你有任何问题,只要问。。。
 
  1. ; pline example listing various properties like pts and lengths
  2. ; By Alan H 2014
  3. (defun getcoords (ent)
  4. (vlax-safearray->list
  5.    (vlax-variant-value
  6.      (vlax-get-property
  7.    (vlax-ename->vla-object ent)
  8.    "Coordinates"
  9.      )
  10.    )
  11. )
  12. )
  13. (defun getlength (ent)
  14.      (vlax-get-property (vlax-ename->vla-object ent) "Length")
  15. )
  16. (defun co-ords2xy ()
  17. ; convert now to xyz
  18. (setq xyprin "\n") ; new line
  19. (if (= xyz 2)
  20. (progn
  21. (setq I 0)
  22. (repeat (/ len 2)
  23. (setq x (nth i co-ords))
  24. (setq y (nth (+ I 1) co-ords))
  25. (setq xy (list  x y))
  26. (setq xyprin (strcat xyprin "\n" (rtos x 2 2) "," (rtos y 2 2 )))
  27. (setq co-ordsxy (cons xy co-ordsxy))
  28. (setq I (+ I 2))
  29. ) ; repeat
  30. ) ; progn
  31. ) ; if
  32. (if (= xyz 3)
  33. (progn
  34. (setq xyprin "\n") ; new line
  35. (setq I 0)
  36. (repeat (/ len 3)
  37. (setq x (nth i co-ords))
  38. (setq y (nth (+ I 1) co-ords))
  39. (setq z (nth (+ I 2) co-ords))
  40. (setq xy (list x y z))
  41. (setq xyprin (strcat xyprin "\n" (rtos x 2 2) "," (rtos y 2 2 ) "," (rtos z 2 2 )))
  42. (setq co-ordsxy (cons xy co-ordsxy))
  43. (setq I (+ I 3))
  44. ) ; repeat
  45. ) ; progn
  46. ) ; if
  47. ) ; defun
  48. ; program starts here
  49. (setq ent (car (entsel "\nPlease pick pline")))
  50. (setq co-ords (getcoords ent ))
  51. (setq len (length co-ords))
  52. ; check for odd even list 2d v's 3d
  53. (setq oddeven (- (fix (/ len 2.0))(/ len 2.0)))
  54. (if (= oddeven 0.5)
  55. (setq xyz 3) ; 3d pline
  56. (setq xyz 2) ; 2d pline
  57. )
  58. (setq numvert (/ len xyz))
  59. (princ (strcat "\nNumber of vertices " (rtos numvert 2 0)))
  60. (co-ords2xy)
  61. (princ xyprin) ; prints out points co-ords
  62. (setq pllen (getlength))
  63. (princ (strcat "\nActual length of pline " (rtos pllen 2 2)))
  64. ; to be done (princ segment lengths 2d)
  65. ; tobe done (princ segment lengths 3d) if different
  66. ; to be done (princ angle of segments)
  67. ; to be done (princ delta angle of segments
  68. (princ)

 
HTH公司
亨里克
回复

使用道具 举报

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-5 22:54:44 | 显示全部楼层
嗨,hmsilva你能帮我解决这个错误吗?我试着把代码改成只导出
 
 
但是现在我不能导出任何文件!!!
 
  1. (if (not parpt);; tests for parpt existence, if not, initializes the lst list with the first string
  2. (setq lst (cons;; to add elements to the lst list
  3. (strcat;; to concatenate multiple strings in one
  4. pre;; first sting element, the prefix i.e D
  5. (itoa pos);; the prefix index
  6. "," "0.000,0.000,";; second and third string elements, the partial and accumulated distances
  7. (rtos (caddr pt) 2 3);; the fourth string element, the Z value
  8. );; strcat
  9. lst);; cons
  10. parpt pt;; sets parpt with the pt value
  11. );; setq
  12. ;; if the lst list is already initialized, just continues to add strings to the lst list
  13. (setq lst (cons;; to add elements to the lst list
  14. (strcat;; to concatenate multiple strings in one
  15. pre;; first sting element, the prefix i.e D
  16. (itoa pos);; the prefix index
  17. ",";; the first comma separator
  18. ;; store the partial distance at the pdist variable
  19. (rtos (setq pdist (distance (list (car pt) (cadr pt)) (list (car parpt) (cadr parpt)))) 2 3)
  20. ",";; the second comma separator
  21. ;; the third string element adding acdist and pdist,
  22. ;; and store the accumulated distance at acdist variable
  23. (rtos (setq acdist (+ acdist pdist)) 2 3)
  24. ",";; the third comma separator       
  25. (rtos (caddr pt) 2 3);; the fourth string element, the Z value
  26. );; strcat
  27. lst);; cons
  28. parpt pt;; sets parpt with the pt value
  29. );; setq
  30. );; if

 
 
谢谢
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 22:57:21 | 显示全部楼层
 
 
嗨,prodromosm,
快速修复。。。
  1. (defun c:demo (/ e fn fo lst par parpt poly pos pre pt s)
  2. (prompt "\nSelect a 3DPolyline to extract Stations and Elevations to txt file: ")
  3. (if
  4.    (and (setq s (ssget "_+.:E:S" '((0 . "POLYLINE") (-4 . "&") (70 . )))
  5. (setq fn (getfiled "Enter the output filename:" (getvar 'DWGPREFIX) "txt" 1))
  6.      );; and
  7.     (progn
  8.       (setq poly (vlax-ename->vla-object (ssname s 0))
  9.      e          (fix (vlax-curve-getEndParam poly))
  10.      pos  0
  11.      par  0
  12.      lst  nil
  13.       );; setq
  14.       (while (/= par (1+ e))
  15. (if (not parpt)
  16.    (setq lst   (cons (strcat  "," "0.000," (rtos (caddr pt) 2 3)) lst)
  17.          parpt pt
  18.    );; setq
  19.    (setq lst (cons (strcat "," (rtos (setq acdist (+ acdist pdist)) 2 3) "," (rtos (caddr pt) 2 3)) lst)
  20.          parpt pt
  21.    );; setq
  22. );; if
  23. (setq par (1+ par))
  24.       );; while
  25.       (if lst
  26. (progn
  27.    (setq lst (reverse lst)
  28.          fo  (open fn "w")
  29.    );; setq
  30.    (foreach l lst
  31.      (write-line l fo)
  32.    );; foreach
  33.    (close fo)
  34. );; progn
  35.       );; if
  36.     );; progn
  37. );; if
  38. (princ)
  39. );; demo

 
未经测试,我现在没有AutoCAD。。。
 
亨里克
回复

使用道具 举报

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-5 22:59:19 | 显示全部楼层
无论有没有AutoCAD,你都是我最棒的朋友!!!
 
谢谢
 
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-11 06:25 , Processed in 1.153995 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表