scampymoogin 发表于 2022-7-6 08:37:03

三维多段线到csv文件

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

fuccaro 发表于 2022-7-6 08:44:31

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

scampymoogin 发表于 2022-7-6 08:51:43

非常感谢您的回复!有什么方法可以指定多段线分成多少个点吗。例如每5米?

fuccaro 发表于 2022-7-6 08:57:08

这应该会更好。不要分割多段线;只需运行Lisp并在CSV文件中查看坐标
(defun c:Plist( / s ss file f i en el a st)
;| Grabs the 3DPolylines found in the drawing
and saves the vertices in a CSV file
    mfuccaro@hotmail.com   11 Oct 2011 |;
(setq s ",")      ;separator can be ";" or "," -Change to suit
;(setq s ";")
(setq ss (ssget "X" '((0 . "POLYLINE")(-4 . "&=")(70 . )))
(setq file (getfiled "Output file" (substr (getvar "dwgname") 1 (- (strlen (getvar "dwgname")) 3)) "Csv" 5))
(setq f (open file "w"))
(princ (strcat "\n" (itoa (setq i (sslength ss))) " polilines found \nX" s "Y" s "Z") f)
(repeat i
   (setq en (entnext (ssname ss (setq i (1- i)))) el (entget en))
   (while (= (cdr (assoc 0 el)) "VERTEX")
   (setq a (mapcar 'rtos (cdr (assoc 10 el)))
       st (strcat (car a) s (cadr a) s (caddr a)))
   (princ (strcat "\n" st) f)
   (setq el (entget (setq en (entnext en))))
   )
   (princ "\n" f)
   )
(close f)
(setq s "File saved")
)

scampymoogin 发表于 2022-7-6 09:01:52

非常感谢,这很有效。

fuccaro 发表于 2022-7-6 09:09:39

不客气,骗子!

scampymoogin 发表于 2022-7-6 09:13:48

碰撞
 
上面的解决方案是在多段线的三维值发生变化的点处分割三维多段线。当我将csv文件导入软件时,点之间的插值不够精确。我想对CAD文件中的三维多段线每隔5m分成几个点的上方的lisp进行轻微编辑。拥有这些额外的分数应该能给我所需要的准确性。
 
有什么想法吗?
 
谢谢

BIGAL 发表于 2022-7-6 09:16:09

Fuccaro可能只是在代码中添加一个除法,以创建点加上vertice作为点,然后将完整的点列表写入csv。唯一的问题是inc因子。

fuccaro 发表于 2022-7-6 09:25:48

抱歉耽搁了,这些天我没有时间编程。我重写了这个程序,试一试:
(defun c:test( / sep f file ss pn)
(setq sep ";")
(setq f (getfiled "Output file" "" "CSV" 1)
   file (open f "w"))
(setq ss (ssget "X" '((0 . "POLYLINE"))))
(repeat (setq pn (sslength ss))
   (pl1 (ssname ss (setq pn (1- pn))) file sep)
   (princ "\n" file)
   )
(close file)
)
(defun pl1(en file sep / prev m el)
(setq en (entnext en) el (entget en) prev nil)
(while (= "VERTEX" (cdr (assoc 0 el)))
   (setq a (cdr (assoc 10 el)))
   (if prev (slice prev a file sep))
   (setq prev a)
   (setq en (entnext en) el (entget en))
   )
(setq m (mapcar 'rtos prev)
   m (strcat (car m) sep (cadr m) sep (caddr m) "\n"))
(princ m file)
)
(defun slice(x y file sep / dist n d1 d2 p)
   (setq m (mapcar 'rtos x)
   m (strcat (car m) sep (cadr m) sep (caddr m) "\n"))
   (princ m file)   
   (setq dist 150);change here the desired distance
   (setq n (fix (/ (distance x y) (* 0.99 dist))))
   (setq d1 (mapcar '/ (mapcar '- y x) (list n n n)))
   (setq i 0)
   (repeat (1- n)
   (setq i (1+ i))
   (setq d2 (mapcar '* d1 (list i i i)))
   (setq p (mapcar '+ x d2))
   (setq m (mapcar 'rtos p)
   m (strcat (car m) sep (cadr m) sep (caddr m) "\n"))
   (princ m file)   
   )
   )
   

scampymoogin 发表于 2022-7-6 09:27:15

感谢上述回复,但它只输出一个空白的csv文件
 
为了确认我正在执行lisp例程,该例程可以提取图形中的所有三维多段线,并每隔5m将其划分为点。这是为了反复使用divide命令来保存我。
 
谢谢您的努力,我们将非常感谢您的帮助!
页: [1] 2
查看完整版本: 三维多段线到csv文件