thereisnotime 发表于 2022-7-6 21:52:13

帮助介绍一个简单的示例

我真的刚刚进入。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

Hippe013 发表于 2022-7-6 22:00:05

我希望这能帮助你朝着正确的方向前进。如果您有任何疑问,请随时询问代码中发生了什么。
 


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

thereisnotime 发表于 2022-7-6 22:03:00

太棒了,非常感谢。
 
我主要来自VBS,从数据库连接/读取有点不同;在VBS中,您可以使用ADO连接连接到MS Access数据库,但它就像任何文件一样。。。你必须打开阅读,然后在完成后关闭连接。您是否也必须关闭或断开与DB的连接?

Hippe013 发表于 2022-7-6 22:08:20

通过事务访问数据库对象。由于我使用的是“使用”语句,因此我不需要处置交易,因为这是在“使用结束”时自动完成的。如果我没有使用“using”语句,那么我将不得不调用trans。dispose可处置交易对象。

thereisnotime 发表于 2022-7-6 22:11:47

哦,太好了!因此,使用类似于以只读方式访问数据库。。。这真的很方便。

Hippe013 发表于 2022-7-6 22:13:54

 
我想我不会那样看待“使用”。“使用”是一种或多或少轻松处理一次性物品的方法。当您使用完事务实例时,需要正确地处理它。我可以在事务中使用“using”,并在何时写入数据库。事务只是与AutoCAD数据库交互的正确方式。“使用”是在使用完物品后处置物品的一种简单方法。

thereisnotime 发表于 2022-7-6 22:21:23

好吧,我更进一步。。。不确定我是否应该为此创建新线程。。。如果我需要。。。无论如何
 
该代码允许用户使用交叉窗口选择对象。然后,它将获取所有对象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

Hippe013 发表于 2022-7-6 22:22:27

如果你知道你只会使用管道。然后只允许用户选择管道。
 
 
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)

Hippe013 发表于 2022-7-6 22:30:05

您可以从已打开以供写入的对象中读取。
 
还有一种升级开放方法。如果您之前已打开以进行读取,则可以升级为打开以进行写入。
 
如果你知道你正在使用管道,你应该

Dim dbobj as Pipe = trans.GetObject(ObjID,openmode.forwrite)

Hippe013 发表于 2022-7-6 22:31:09

***注***
 
不要忘记:
 
trans.commit()
 
否则,您的事务将回滚,就像什么都没有发生一样。这可能令人沮丧,因为代码似乎都是正确的,但什么都不起作用。
页: [1] 2
查看完整版本: 帮助介绍一个简单的示例