乐筑天下

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

[编程交流] 三维多段线到csv文件

[复制链接]

2

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 08:37:03 | 显示全部楼层 |阅读模式
我收到了一份直接来自专业软件的CAD文件,其中包含三维多段线。我正在使用的软件(Microdrainage Windes)接受csv文件,因此我可以创建一个3d tin。我目前正在做的是将每条线分成若干点(我真的不在乎有多少点,也不必那么精确),一旦它们被分割,我就使用数据提取工具。所以我的问题是:
·是否有任何方法可以在不首先分割线的情况下将三维多段线信息提取为单个点。
·有没有办法一次分割多行(可能是lisp例程),
·谁能想出一个更好的方法让我这么做。
非常感谢您的帮助!!
回复

使用道具 举报

18

主题

434

帖子

422

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
94
发表于 2022-7-6 08:44:31 | 显示全部楼层
你好
试试这个快速的。它将处理图形中找到的所有“旧式”多段线。运行它,从文本屏幕(F2)复制相关部分,然后粘贴到Excel甚至记事本中。从那里可以保存为CSV。调整lisp以直接保存在CSV文件中应该很简单,但我现在真的没有时间。也许明天-如果在同一时间你不会得到更好的帮助。
  1. (defun c:test()
  2. (setq ss (ssget "X" (list '(0 . "POLYLINE"))))
  3. (princ (strcat "\n" (itoa (setq i (sslength ss))) " polilines found"))
  4. (repeat i
  5.    (setq en (entnext (ssname ss (setq i (1- i)))) el (entget en))
  6.    (while (= (cdr (assoc 0 el)) "VERTEX")
  7.      (setq a (mapcar 'rtos (cdr (assoc 10 el)))
  8.        st (strcat (car a) "," (cadr a) "," (caddr a)))
  9.      (princ (strcat "\n" st))
  10.      (setq el (entget (setq en (entnext en))))
  11.      )
  12.    (princ "\n")
  13.    )
  14. (princ)
  15. )
回复

使用道具 举报

2

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 08:51:43 | 显示全部楼层
非常感谢您的回复!有什么方法可以指定多段线分成多少个点吗。例如每5米?
回复

使用道具 举报

18

主题

434

帖子

422

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
94
发表于 2022-7-6 08:57:08 | 显示全部楼层
这应该会更好。不要分割多段线;只需运行Lisp并在CSV文件中查看坐标
  1. (defun c:Plist( / s ss file f i en el a st)
  2. ;| Grabs the 3DPolylines found in the drawing
  3. and saves the vertices in a CSV file
  4.     mfuccaro@hotmail.com     11 Oct 2011 |;
  5. (setq s ",")        ;separator can be ";" or "," -Change to suit
  6. ;(setq s ";")
  7. (setq ss (ssget "X" '((0 . "POLYLINE")(-4 . "&=")(70 . )))
  8. (setq file (getfiled "Output file" (substr (getvar "dwgname") 1 (- (strlen (getvar "dwgname")) 3)) "Csv" 5))
  9. (setq f (open file "w"))
  10. (princ (strcat "\n" (itoa (setq i (sslength ss))) " polilines found \nX" s "Y" s "Z") f)
  11. (repeat i
  12.    (setq en (entnext (ssname ss (setq i (1- i)))) el (entget en))
  13.    (while (= (cdr (assoc 0 el)) "VERTEX")
  14.      (setq a (mapcar 'rtos (cdr (assoc 10 el)))
  15.        st (strcat (car a) s (cadr a) s (caddr a)))
  16.      (princ (strcat "\n" st) f)
  17.      (setq el (entget (setq en (entnext en))))
  18.      )
  19.    (princ "\n" f)
  20.    )
  21. (close f)
  22. (setq s "File saved")
  23. )
回复

使用道具 举报

2

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 09:01:52 | 显示全部楼层
非常感谢,这很有效。
回复

使用道具 举报

18

主题

434

帖子

422

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
94
发表于 2022-7-6 09:09:39 | 显示全部楼层
不客气,骗子!
回复

使用道具 举报

2

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 09:13:48 | 显示全部楼层
碰撞
 
上面的解决方案是在多段线的三维值发生变化的点处分割三维多段线。当我将csv文件导入软件时,点之间的插值不够精确。我想对CAD文件中的三维多段线每隔5m分成几个点的上方的lisp进行轻微编辑。拥有这些额外的分数应该能给我所需要的准确性。
 
有什么想法吗?
 
谢谢
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 09:16:09 | 显示全部楼层
Fuccaro可能只是在代码中添加一个除法,以创建点加上vertice作为点,然后将完整的点列表写入csv。唯一的问题是inc因子。
回复

使用道具 举报

18

主题

434

帖子

422

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
94
发表于 2022-7-6 09:25:48 | 显示全部楼层
抱歉耽搁了,这些天我没有时间编程。我重写了这个程序,试一试:
  1. (defun c:test( / sep f file ss pn)
  2. (setq sep ";")
  3. (setq f (getfiled "Output file" "" "CSV" 1)
  4.    file (open f "w"))
  5. (setq ss (ssget "X" '((0 . "POLYLINE"))))
  6. (repeat (setq pn (sslength ss))
  7.    (pl1 (ssname ss (setq pn (1- pn))) file sep)
  8.    (princ "\n" file)
  9.    )
  10. (close file)
  11. )
  12. (defun pl1(en file sep / prev m el)
  13. (setq en (entnext en) el (entget en) prev nil)
  14. (while (= "VERTEX" (cdr (assoc 0 el)))
  15.    (setq a (cdr (assoc 10 el)))
  16.    (if prev (slice prev a file sep))
  17.    (setq prev a)
  18.    (setq en (entnext en) el (entget en))
  19.    )
  20. (setq m (mapcar 'rtos prev)
  21.      m (strcat (car m) sep (cadr m) sep (caddr m) "\n"))
  22. (princ m file)
  23. )
  24. (defun slice(x y file sep / dist n d1 d2 p)
  25.    (setq m (mapcar 'rtos x)
  26.      m (strcat (car m) sep (cadr m) sep (caddr m) "\n"))
  27.    (princ m file)   
  28.    (setq dist 150)  ;change here the desired distance
  29.    (setq n (fix (/ (distance x y) (* 0.99 dist))))
  30.    (setq d1 (mapcar '/ (mapcar '- y x) (list n n n)))
  31.    (setq i 0)
  32.    (repeat (1- n)
  33.      (setq i (1+ i))
  34.      (setq d2 (mapcar '* d1 (list i i i)))
  35.      (setq p (mapcar '+ x d2))
  36.      (setq m (mapcar 'rtos p)
  37.      m (strcat (car m) sep (cadr m) sep (caddr m) "\n"))
  38.      (princ m file)   
  39.      )
  40.    )
  41.    
回复

使用道具 举报

2

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 09:27:15 | 显示全部楼层
感谢上述回复,但它只输出一个空白的csv文件
 
为了确认我正在执行lisp例程,该例程可以提取图形中的所有三维多段线,并每隔5m将其划分为点。这是为了反复使用divide命令来保存我。
 
谢谢您的努力,我们将非常感谢您的帮助!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 09:03 , Processed in 0.530809 second(s), 72 queries .

© 2020-2025 乐筑天下

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