帮助介绍一个简单的示例
我真的刚刚进入。NET编程,我很难弄清楚如何请求管道信息。我这里有一些简单的东西,我在图纸中计算了管道。现在,我最终尝试通过管道循环并列出其坡度,但我不太确定如何做到这一点。如您所见,我试图首先列出不同的管道ID,我得到了以下错误。。。任何帮助或解释都将不胜感激,因为API参考在提供示例方面做得不是很好。
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.Civil.DatabaseServices
Public Class PipeSlope
<CommandMethod("GetPipeSlope")>
Public Sub cmdGetPipeSlope()
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
Dim civDoc As Autodesk.Civil.ApplicationServices.CivilDocument
civDoc = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument
Dim pipeIds As ObjectIdCollection = civDoc.GetPipeNetworkIds
ed.WriteMessage("There are " & pipeIds.Count & " pipes in the drawing.")
Dim oCurrentPipe = civDoc.NetworkState.CurrentPipeId
For i = 0 To pipeIds.Count
ed.WriteMessage(oCurrentPipe)
Next
End Sub
End Class 我希望这能帮助你朝着正确的方向前进。如果您有任何疑问,请随时询问代码中发生了什么。
Imports Autodesk.Civil.ApplicationServices
<CommandMethod("GetPipeSlope")>
Public Sub cmdGetPipeSlope()
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
Dim civDoc As civilDocument = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument
Dim aDoc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
Dim db As Database = aDoc.Database
Dim NetworkIds As ObjectIdCollection = civDoc.GetPipeNetworkIds
Using trans As Transaction = db.TransactionManager.StartTransaction
For Each NetId As ObjectId In NetworkIds
Dim net As Network = trans.GetObject(NetId, OpenMode.ForRead)
ed.WriteMessage(vbCrLf + net.Name)
Dim PipeIds As ObjectIdCollection = net.GetPipeIds
Using trans2 As Transaction = db.TransactionManager.StartTransaction
Dim cnt As Integer = 1
For Each PipeId As ObjectId In PipeIds
Dim pipe As Pipe = trans2.GetObject(PipeId, OpenMode.ForRead)
ed.WriteMessage(vbCrLf + cnt.ToString + " : " + pipe.Name + " - " + (pipe.Slope * 100.0).ToString("N2") + "%")
cnt = cnt + 1
Next
trans2.Commit()
End Using
Next
trans.Commit()
End Using
End Sub 太棒了,非常感谢。
我主要来自VBS,从数据库连接/读取有点不同;在VBS中,您可以使用ADO连接连接到MS Access数据库,但它就像任何文件一样。。。你必须打开阅读,然后在完成后关闭连接。您是否也必须关闭或断开与DB的连接? 通过事务访问数据库对象。由于我使用的是“使用”语句,因此我不需要处置交易,因为这是在“使用结束”时自动完成的。如果我没有使用“using”语句,那么我将不得不调用trans。dispose可处置交易对象。 哦,太好了!因此,使用类似于以只读方式访问数据库。。。这真的很方便。
我想我不会那样看待“使用”。“使用”是一种或多或少轻松处理一次性物品的方法。当您使用完事务实例时,需要正确地处理它。我可以在事务中使用“using”,并在何时写入数据库。事务只是与AutoCAD数据库交互的正确方式。“使用”是在使用完物品后处置物品的一种简单方法。 好吧,我更进一步。。。不确定我是否应该为此创建新线程。。。如果我需要。。。无论如何
该代码允许用户使用交叉窗口选择对象。然后,它将获取所有对象ID,并将其与管网对象集合中的对象ID进行比较。如果他们匹配,这是一个管道。然后,它将在屏幕上显示每个管道的流量方法。
我想做的是将一个变量设为“ForWrite”,将方法更改为3。我尝试过这样做,但它给了我一个错误,关于实体的名称太宽,我不知道如何修复它:
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.Civil.ApplicationServices
Imports Autodesk.Civil.DatabaseServices
Public Class DisplayPipeInfoSingleSelection
<CommandMethod("DisplayPipeInfo")>
Public Sub cmdDisplayPipeInfo()
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
Dim civilDOC As CivilDocument = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument
Dim cadDOC As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
Dim cadDB As Database = cadDOC.Database
Dim pipeNetIDs As ObjectIdCollection = civilDOC.GetPipeNetworkIds
'// Open the DB query
Using cadTrans As Transaction = cadDB.TransactionManager.StartTransaction()
Dim cadSSPrompt As PromptSelectionResult = cadDOC.Editor.GetSelection()
'// If user pressed enter after prompt
If cadSSPrompt.Status = PromptStatus.OK Then
Dim cadSSet As SelectionSet = cadSSPrompt.Value
For Each item As SelectedObject In cadSSet
ed.WriteMessage(vbCrLf & "Object in CAD DB: " & item.ObjectId.ToString)
'// Check if the item is in the DB
If Not IsDBNull(item) Then
'// Loop through the networks and see if the object ID is a pipe
For Each netID As ObjectId In pipeNetIDs
Dim net As Network = cadTrans.GetObject(netID, OpenMode.ForRead)
Dim pipeIDs As ObjectIdCollection = net.GetPipeIds
Using cadTrans2 As Transaction = cadDB.TransactionManager.StartTransaction
For Each pipeID As ObjectId In pipeIDs
Dim pipeOBJ As Pipe = cadTrans2.GetObject(pipeID, OpenMode.ForRead)
If pipeID = item.ObjectId Then
Select Case pipeOBJ.FlowDirectionMethod
Case 0
ed.WriteMessage(vbCrLf & pipeOBJ.Name & " flow method: Bi-Directional")
Case 1
ed.WriteMessage(vbCrLf & pipeOBJ.Name & " flow method: Start to End")
Case 2
ed.WriteMessage(vbCrLf & pipeOBJ.Name & " flow method: End to Start")
Case 3
ed.WriteMessage(vbCrLf & pipeOBJ.Name & " flow method: By Slope")
End Select
'// This is where the "Entity" error is
Dim pipeOBJwrite As Entity = cadTrans2.GetObject(pipeID, OpenMode.ForWrite)
End If
Next
End Using
Next
End If
Next
End If
End Using
End Sub
End Class
如果你知道你只会使用管道。然后只允许用户选择管道。
Dim acTypValAr(0) As TypedValue
acTypValAr.SetValue(New TypedValue(DxfCode.Start, "AECC_PIPE"), 0)
Dim pSelFil As SelectionFilter = New SelectionFilter(acTypValAr)
Dim cadSSPrompt As PromptSelectionResult = cadDOC.Editor.GetSelection(pSelFil) 您可以从已打开以供写入的对象中读取。
还有一种升级开放方法。如果您之前已打开以进行读取,则可以升级为打开以进行写入。
如果你知道你正在使用管道,你应该
Dim dbobj as Pipe = trans.GetObject(ObjID,openmode.forwrite) ***注***
不要忘记:
trans.commit()
否则,您的事务将回滚,就像什么都没有发生一样。这可能令人沮丧,因为代码似乎都是正确的,但什么都不起作用。
页:
[1]
2