PanHasan 发表于 2022-7-6 12:50:52

vb。净交易问题

你好
我的问题很简单,但我无法摆脱它。程序崩溃是因为我试图添加已经在图形中的对象。如果我错了,请纠正我,我不知道如何修复这可能是某种更新功能?
<CommandMethod("src")> _
Public Sub src()
       Dim lCmd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
       Dim acBaza As Database = lCmd.Document.Database
       Dim trn As Transaction = acBaza.TransactionManager.StartTransaction

       Dim lnL1 As Line = New Line()

       Dim usrPtOp As PromptPointOptions = New PromptPointOptions("Wskarz srodek pomieszczenia :")
       Dim usrPt As PromptPointResult = lCmd.GetPoint(usrPtOp)

       Dim prevPt As Point3d = usrPt.Value
       Dim nextPt As Point3d = usrPt.Value

       If usrPt.Status = PromptStatus.OK Then
         Dim usrPtXmod As Point3d = New Point3d(usrPt.Value.X + 1, usrPt.Value.Y, usrPt.Value.Z)
         Dim promienSledzacy As Ray = New Ray()
         promienSledzacy.BasePoint = usrPt.Value
         promienSledzacy.SecondPoint = usrPtXmod

         'FILTRACJA LINII
         Dim typeValue() As TypedValue = {New TypedValue(0, "line")}
         Dim selFilter As SelectionFilter = New SelectionFilter(typeValue)
         Dim selResult As PromptSelectionResult = lCmd.SelectAll(selFilter)
         Dim ssLinie As SelectionSet = selResult.Value
         Dim tabID() As ObjectId = ssLinie.GetObjectIds

         'TRANSAKCJA
         Try
               Dim btr As BlockTableRecord = trn.GetObject(acBaza.CurrentSpaceId, OpenMode.ForWrite)

               Dim objID As ObjectId
               Dim licz As Integer = 0
               Dim ilosc As Integer = 0
               Dim ra3d As Ray3d = New Ray3d(promienSledzacy.StartPoint, promienSledzacy.SecondPoint)
               Dim lnNajblizsza As Line = Nothing

               For Each objID In tabID
                   Dim ln As Line = CType(trn.GetObject(objID, OpenMode.ForRead), Line)
                   Dim ls As LineSegment3d = New LineSegment3d(ln.StartPoint, ln.EndPoint)
                   Dim ptArray() As Point3d = ls.IntersectWith(ra3d)
                   If ptArray Is Nothing Then Continue For
                   Dim ptkPrzeciecia As Point3dCollection = New Point3dCollection(ptArray)

                   'SZUKANIE PIERWSZEJ NAJBLIZSZEJ LINII                  
                   If ptkPrzeciecia.Count <> ilosc Then
                     ilosc = ptkPrzeciecia.Count
                     If licz = 0 Then
                           nextPt = ptkPrzeciecia.Item(0)
                           lnNajblizsza = ln
                     End If
                     If nextPt.X >= ptkPrzeciecia.Item(licz).X Then
                           nextPt = ptkPrzeciecia.Item(licz)
                           lnNajblizsza = ln
                     End If
                     licz = licz + 1
                   End If
               Next
               promienSledzacy.SetDatabaseDefaults()
               btr.AppendEntity(promienSledzacy)
               trn.AddNewlyCreatedDBObject(promienSledzacy, True)
               trn.Commit()
         Catch ex As Exception
         Finally
               trn.Dispose()
         End Try

         Dim tmpPt2 As Point3d
         Dim przeciecia As Integer
         Dim bezpiecznik As Integer = 0

         While (bezpiecznik < 3)
               bezpiecznik = bezpiecznik + 1
               rysujOdPomocniczy(prevPt, nextPt, tmpPt2, lnL1)
               'szukajPtk(przeciecia, prevPt, nextPt, tmpPt2, tabID, lnL1)
               If przeciecia = 0 Then
                   prevPt = tmpPt2
               Else
                   prevPt = nextPt
                   przeciecia = 0
               End If
         End While

       End If

   End Sub

   Public Sub rysujOdPomocniczy(ByRef prevPt As Point3d, ByRef nextPt As Point3d, ByRef tmpPt2 As Point3d, ByRef lnL1 As Line)
       DimlCmd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
       Dim acBaza As Database = lCmd.Document.Database
       Dim trn As Transaction = acBaza.TransactionManager.StartTransaction

       Dim tmpPt1 As Point3d = prevPt
       tmpPt2 = nextPt
       ' WYZNACZANIE KATOW KTORE TRZEBA SPRAWDZIC NA PODSTWAIE POPRZEDNIEGO PUNKTU

       If Math.Round(prevPt.X) = Math.Round(nextPt.X) Then
         If nextPt.Y > prevPt.Y Then
               tmpPt2 = New Point3d(nextPt.X - 10, nextPt.Y, 0)
               lnL1 = CType(trn.GetObject(lnL1.ObjectId, OpenMode.ForWrite), Line)
               lnL1.StartPoint = tmpPt1
               lnL1.EndPoint = tmpPt2
         Else
               Try
                   Dim btr As BlockTableRecord = trn.GetObject(acBaza.CurrentSpaceId, OpenMode.ForWrite)
                   tmpPt2 = New Point3d(nextPt.X + 10, nextPt.Y, 0)
                   lnL1 = CType(trn.GetObject(lnL1.ObjectId, OpenMode.ForWrite), Line)
                   lnL1.StartPoint = tmpPt1
                   lnL1.EndPoint = tmpPt2
                   btr.AppendEntity(lnL1)
                   trn.AddNewlyCreatedDBObject(lnL1, True)
                   lnL1.UpgradeOpen()
                   trn.Commit()
               Catch ex As Exception
                   lCmd.WriteMessage("Wyjatek")
               Finally
                   trn.Dispose()
               End Try
         End If
       ElseIf Math.Round(prevPt.Y) = Math.Round(nextPt.Y) Then
         If nextPt.X > prevPt.X Then
               tmpPt2 = New Point3d(nextPt.X, nextPt.Y + 10, 0)
               lnL1.StartPoint = tmpPt1
               lnL1.EndPoint = tmpPt2
               Try
                   Dim btr As BlockTableRecord = trn.GetObject(acBaza.CurrentSpaceId, OpenMode.ForWrite)
                   btr.AppendEntity(lnL1)
                   trn.AddNewlyCreatedDBObject(lnL1, True)
                   trn.Commit()
               Catch ex As Exception
                   lCmd.WriteMessage("Wyjatek")
               Finally
                   trn.Dispose()
               End Try
         Else
               tmpPt2 = New Point3d(nextPt.X, nextPt.Y + 10, 0)
               lnL1.StartPoint = tmpPt1
               lnL1.EndPoint = tmpPt2
         End If
       End If
   End Sub

SEANT 发表于 2022-7-6 13:02:00

潜艇“rysujOdPomocniczy”应该做什么?它需要复制lnL1吗,还是只需要更改起点和终点?

SEANT 发表于 2022-7-6 13:04:42

可能有帮助的一件事是将这些行移到If语句之前,以准备任何意外事件:
 
Dim btr As BlockTableRecord = trn.GetObject(acBaza.CurrentSpaceId, OpenMode.ForWrite)
 
lnL1 = CType(trn.GetObject(lnL1.ObjectId, OpenMode.ForWrite), Line)

PanHasan 发表于 2022-7-6 13:16:21

是的,它需要制作一个lnL1的副本,或者只是用指定的起点和终点绘制不同的线。它做什么呢?它画一条临时线,然后sub szukajPtk检查它是否与某物相交

PanHasan 发表于 2022-7-6 13:20:13

或者我有没有可能只更新lnL1?

SEANT 发表于 2022-7-6 13:30:10

 
如果不需要副本,我会这么做。

PanHasan 发表于 2022-7-6 13:33:07

但是当我尝试更新这些行时会导致错误

                   btr.AppendEntity(lnL1)
                   trn.AddNewlyCreatedDBObject(lnL1, True)

SEANT 发表于 2022-7-6 13:42:50

如果不需要额外的代码行,那么这些代码行将被删除。换句话说,如果原始直线图元只需要修改,则无需追加图元或添加新创建的对象。
 
只是:
 
lnL1 = CType(trn.GetObject(lnL1.ObjectId, OpenMode.ForWrite), Line)
 

 
lnL1.StartPoint = tmpPt1
lnL1.EndPoint = tmpPt2

PanHasan 发表于 2022-7-6 13:49:41

是的
你总是对的thx

SEANT 发表于 2022-7-6 13:51:19

不客气。
 
 
 
谁知道这会持续多久?
页: [1]
查看完整版本: vb。净交易问题