将折线导入到 Autocad 速度
嗨嗨,我玩点空间导入SHP文件到Autopcad,如果我导入一个文件,那是可以的,但有几个速度是小显示
是有人可以帮助我如何加快这个
_
Public Sub XYinsert()
ReadSHPfile("C:\map\streetline.shp", "st")
End Sub
a few
Public Sub ReadSHPfile(ByVal slod, ByVal Layerinst)
Dim doc As Document = Application.DocumentManager.MdiActiveDocument
Dim db As Database = doc.Database
Dim ed As Editor = doc.Editor
Using acTrans As Transaction = db.TransactionManager.StartTransaction()
Dim acBlkTbl As BlockTable
acBlkTbl = CType(acTrans.GetObject(db.BlockTableId, OpenMode.ForRead), BlockTable)
Dim acBlkTblRec As BlockTableRecord
acBlkTblRec = CType(acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord)
Dim shapeActual As FeatureSet = FeatureSet.Open(slod)
shapeActual.FillAttributes()
Dim dt As System.Data.DataTable = shapeActual.DataTable
Dim pline As Polyline = New Polyline()
pline.SetDatabaseDefaults()
Dim ptColl As Point3dCollection = New Point3dCollection()
For count As Integer = 0 To shapeActual.Features.Count - 1
For Each feature As IFeature In shapeActual.Features 'circle through the features
For i As Integer = 0 To feature.BasicGeometry.NumGeometries - 1 'circle through the parts of one feature
For Each coord As Coordinate In feature.BasicGeometry.GetBasicGeometryN(i).Coordinates() 'circle through the coordinates of the feature part
'Dim AdresX = coord.X
'Dim AdresY = coord.Y
pline.AddVertexAt(count, New Point2d(coord.X, (coord.Y)), 0.0, 0.0, 0.0)
count = count + 1
Dim pt As New Point3d(coord.X, coord.Y, coord.Z)
pts.Add(pt)
Next
' installa1()
ed.WriteMessage(vbCr & feature.FeatureType.ToString)
Next
insert_with_layer(Layerinst)
pts.Clear()
Next
Next
acTrans.Commit()
End Using
End Sub
Public Sub insert_with_layer(ByVal Layer_name As String)
Dim doc As Document = Application.DocumentManager.MdiActiveDocument
Dim db As Database = doc.Database
Dim trans As Transaction
Dim transMan As Autodesk.AutoCAD.ApplicationServices.TransactionManager
transMan = db.TransactionManager
trans = transMan.StartTransaction
' Dim lne As New Line(pt1, pt2)
Dim pline As Polyline = New Polyline()
Dim bt As BlockTable
Dim btr As BlockTableRecord
bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead)
btr = trans.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
Dim i As Integer = 0
For Each pnt As Point3d In pts
Dim pt As New Point3d(pnt.X, pnt.Y, pnt.Z)
pline.AddVertexAt(i, New Point2d(pt.X, (pt.Y)), 0.0, 0.0, 0.0)
i += 1
Next
pline.Layer = Layer_name
btr.AppendEntity(pline)
trans.AddNewlyCreatedDBObject(pline, True)
trans.Commit()
trans.Dispose()
transMan.Dispose()
End Sub
**** Hidden Message ***** 快速浏览后:
您可能不需要创建“新”折线或集合对象,只需重置/清除它们,这将节省每次迭代分配的新内存。对于您可能重用的任何其他对象也是如此。
这听起来似乎不太直观,但是我发现为每个实体创建一个单独的事务有时比试图在一个循环中完成所有事务然后提交要快。您可以将循环封装在一个事务中,然后用内部事务添加实体,类似于辅助函数“postToDatabase”。
如我所说,听起来开销更大,但这是我的经验 你在acad部分做得很好
在调试中运行时,请注意代码行右侧显示的数字
它会显示为10毫秒,这意味着最后一次操作需要10毫秒
使用该功能,您可以快速找到速度较慢的部件,并在自己的环境中进行测试
在快速情况下,您只需尝试两者,因为事务分组很容易
我也使用了dotspacial,实际上我已经准备好做一个shapefile->google earth工具,就像我自己做的acad->kmz一样,比civil3d工具好100倍左右。顺便说一句,我在coord translations中使用mapguide api。其优点是coord系统的“短”名称与acad map使用的名称匹配,因为map也使用mapguide引擎。您可以在普通acad或bcad中使用它,无需垂直。
页:
[1]