乐筑天下

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

VB。Net代码来读取CSV点

[复制链接]
RMS

9

主题

38

帖子

29

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-6 22:58:53 | 显示全部楼层 |阅读模式
该代码将读取CSV点文件,例如空间分析仪(SA软件)将从某些项目、产品或竣工条件的激光扫描中输出什么。然后可以将这些数据读入AutoCAD(在本例中),以查看和创建扫描的点数据。我提供了一个包含49个点的示例CSV文本文件,但我使用此代码读取了20000多个点。
 
 
 
  1. '    File Name: ReadPointsFromSA
  2. '  Description: Read a CSV point file from SpatialAnalyzer (SA)
  3. '           By: Robert Souza
  4. ' Contact info: dreamtoneamps[AT]gmail.com
  5. '         Date: June 25, 2010
  6. Option Strict On
  7. Imports System.IO
  8. Imports System.Windows
  9. Imports Autodesk.AutoCAD.Colors
  10. Imports Autodesk.AutoCAD.Windows
  11. Imports Autodesk.AutoCAD.Runtime
  12. Imports Autodesk.AutoCAD.Geometry
  13. Imports Autodesk.AutoCAD.EditorInput
  14. Imports Autodesk.AutoCAD.DatabaseServices
  15. Imports Autodesk.AutoCAD.ApplicationServices
  16. Public Class Class1
  17.    Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  18.    Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  19.    Dim acCurDb As Database = acDoc.Database
  20.    <CommandMethod("SApoints")> _
  21.    Public Sub createLine()
  22.        Dim CSV_FileName As String = Nothing
  23.        ' navigate to the point text csv file using a file dialog
  24.        Dim dlg As New System.Windows.Forms.OpenFileDialog()
  25.        dlg.InitialDirectory = "C:"
  26.        dlg.Filter = "csv text files (*.txt)|*.txt|csv excel files (*.csv)|*.csv|All files (*.*)|*.*"
  27.        If dlg.ShowDialog() = Windows.Forms.DialogResult.OK Then
  28.            CSV_FileName = dlg.FileName().ToString
  29.            ' call sub to create points from CSV file
  30.            readCSVPoints(CSV_FileName)
  31.        Else
  32.            ' if canceled write to the command line and sub not called
  33.            ed.WriteMessage(vbCr & " command canceled")
  34.        End If
  35.    End Sub
  36.    Public Sub readCSVPoints(ByVal CSV_FileName As String)
  37.        Dim myPath As String = CSV_FileName
  38.        ' Start a transaction
  39.        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  40.            ' Open the Block table for read
  41.            Dim acBlkTbl As BlockTable
  42.            acBlkTbl = CType(acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead), BlockTable)
  43.            ' Open the Block table record Model space for write
  44.            Dim acBlkTblRec As BlockTableRecord
  45.            acBlkTblRec = CType(acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord)
  46.            ' Read a line containing (point ID, x, y, z) points from a text file that contains coordinates
  47.            Dim inputRecord As String = Nothing
  48.            Dim myPoints(3) As String
  49.            Dim x, y, z As Double
  50.            ' point ID
  51.            Dim pid As String
  52.            Dim inReader As StreamReader = File.OpenText(myPath)
  53.            ' Start reading text file one line at a time
  54.            inputRecord = inReader.ReadLine()
  55.            While (inputRecord IsNot Nothing)
  56.                If inputRecord.Contains(",") Then
  57.                    myPoints = inputRecord.Split(CChar(",")) ' get code string
  58.                    pid = (myPoints(0).Trim)
  59.                    x = CDbl(myPoints(1).Trim)
  60.                    y = CDbl(myPoints(2).Trim)
  61.                    z = CDbl(myPoints(3).Trim)
  62.                    ' Create a point at (x, y, z) in Model space
  63.                    Dim acPoint As DBPoint = New DBPoint(New Point3d(x, y, z))
  64.                    acPoint.SetDatabaseDefaults()
  65.                    ' create point ID text with single line text i.e. (p1 text just above the point)
  66.                    Dim acText As DBText = New DBText()
  67.                    acText.SetDatabaseDefaults()
  68.                    acText.Position = New Point3d((x - 0.25), (y + 0.075), z)
  69.                    acText.Height = 0.125
  70.                    acText.TextString = pid
  71.                    ' call sub and place items on a layer of their own
  72.                    CreateLayer(acPoint, acText)
  73.                    ' Add the new object to the block table record and the transaction
  74.                    acBlkTblRec.AppendEntity(acText)
  75.                    acTrans.AddNewlyCreatedDBObject(acText, True)
  76.                    ' Add the new object to the block table record and the transaction
  77.                    acBlkTblRec.AppendEntity(acPoint)
  78.                    acTrans.AddNewlyCreatedDBObject(acPoint, True)
  79.                End If
  80.                ' Read next line
  81.                inputRecord = inReader.ReadLine()
  82.            End While ' will end at EOF or keep looping
  83.            ' Set the style for all point objects in the drawing
  84.            acCurDb.Pdmode = 32    ' point style circle w/dot
  85.            acCurDb.Pdsize = 0.125 ' value 1 or more is absolute size; 0 is 5%
  86.            ' set iso mode
  87.            ToIsoView()
  88.            ' zoom all
  89.            SendACommandToAutoCAD()
  90.            ' now write to the command line
  91.            ed.WriteMessage(vbCr & "all points are in")
  92.            ' save the new object to the database
  93.            acTrans.Commit()
  94.            ' close reader to text file
  95.            inReader.Close()
  96.        End Using
  97.    End Sub
  98.    Public Sub CreateLayer(ByVal acPoint As DBPoint, ByVal acText As DBText)
  99.        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  100.            ' Open the Layer table for read
  101.            Dim acLyrTbl As LayerTable
  102.            acLyrTbl = CType(acTrans.GetObject(acCurDb.LayerTableId, OpenMode.ForRead), LayerTable)
  103.            Dim pLayerName As String = "110"
  104.            Dim pidLayerName As String = "109"
  105.            If acLyrTbl.Has(pLayerName) = False Then
  106.                Dim acLyrTblRec As LayerTableRecord = New LayerTableRecord()
  107.                ' Assign the layer the ACI color 1 and a name
  108.                acLyrTblRec.Color = Color.FromColorIndex(ColorMethod.ByAci, 1)
  109.                acLyrTblRec.Name = pLayerName
  110.                ' Upgrade the Layer table for write
  111.                acLyrTbl.UpgradeOpen()
  112.                ' Append the new layer to the Layer table and the transaction
  113.                acLyrTbl.Add(acLyrTblRec)
  114.                acTrans.AddNewlyCreatedDBObject(acLyrTblRec, True)
  115.            End If
  116.            If acLyrTbl.Has(pidLayerName) = False Then
  117.                Dim acLyrTblRec As LayerTableRecord = New LayerTableRecord()
  118.                ' Assign the layer the ACI color 1 and a name
  119.                acLyrTblRec.Color = Color.FromColorIndex(ColorMethod.ByAci, 5)
  120.                acLyrTblRec.Name = pidLayerName
  121.                ' Upgrade the Layer table for write
  122.                acLyrTbl.UpgradeOpen()
  123.                ' Append the new layer to the Layer table and the transaction
  124.                acLyrTbl.Add(acLyrTblRec)
  125.                acTrans.AddNewlyCreatedDBObject(acLyrTblRec, True)
  126.            End If
  127.            ' set each point to this layer
  128.            acPoint.Layer = pLayerName
  129.            ' set each point ID to this layer
  130.            acText.Layer = pidLayerName
  131.            ' Save the changes and dispose of the transaction
  132.            acTrans.Commit()
  133.        End Using
  134.    End Sub
  135.    ' zoom all
  136.    Public Sub SendACommandToAutoCAD()
  137.        ' limits of the drawing
  138.        acDoc.SendStringToExecute("._zoom _all ", True, False, False)
  139.    End Sub
  140.    Public Sub ToIsoView()
  141.        Dim vtr As ViewTableRecord = ed.GetCurrentView()
  142.        Dim newVtr As ViewTableRecord = vtr
  143.        newVtr.ViewDirection = New Vector3d(1, -1, 1)
  144.        ed.SetCurrentView(newVtr)
  145.    End Sub
  146. End Class

第3d点。txt文件
回复

使用道具 举报

0

主题

127

帖子

130

银币

限制会员

铜币
-2
发表于 2022-7-6 23:16:01 | 显示全部楼层
在这个论坛软件中有没有办法使代码窗格足够大以正确阅读代码。
 
在一个24英寸的显示器上,代码窗格占据了大约四分之一的屏幕……真是浪费!!
 
...
[添加]
.. 此外,观众需要垂直和水平滚动才能了解意图。
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 23:24:37 | 显示全部楼层
 
做得好。输入20000点肯定需要自动化。不过,我不得不说,您包含的示例点文件是一个相当无聊的形状。
回复

使用道具 举报

RMS

9

主题

38

帖子

29

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-6 23:44:33 | 显示全部楼层
 
非常感谢。
 
我很乐意与大家分享我在10-2万分下的作品,但是。。。。。。。。。我的工作场所有规矩,我必须遵守!
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 23:49:43 | 显示全部楼层
 
我理解。
 
 
对上述代码的另一个窥视引发了一些建议:
 
如果层分配不是CreateLayer子的一部分,那么可以在“While”循环之前调用该子,并避免重复的StartTransactions和LayerTable打开。在保证层已经存在的情况下,层分配可以在循环内发生。
 
用户将文本/点放入模型空间是有意义的,但该程序允许在纸面空间中调用自己。实体显式添加到适当的BlockTableRecord中不一定是问题,除非
纸张空间中不允许
  1. newVtr.ViewDirection = New Vector3d(1, -1, 1)
回复

使用道具 举报

RMS

9

主题

38

帖子

29

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-7 00:04:44 | 显示全部楼层
 
感谢这些建议,我可以对ToIsoView()Sub和ZoomAll进行评论;我很难找到一个使用AutoCAD 2008的示例,我看到的AutoCAD开发者指南似乎是2011版的。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2024-11-21 21:16 , Processed in 0.219568 second(s), 64 queries .

© 2020-2024 乐筑天下

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