乐筑天下

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

[编程交流] vb。净交易问题

[复制链接]

15

主题

46

帖子

31

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 12:50:52 | 显示全部楼层 |阅读模式
你好
我的问题很简单,但我无法摆脱它。程序崩溃是因为我试图添加已经在图形中的对象。如果我错了,请纠正我,我不知道如何修复这可能是某种更新功能?
  1. <CommandMethod("src")> _
  2.   Public Sub src()
  3.        Dim lCmd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  4.        Dim acBaza As Database = lCmd.Document.Database
  5.        Dim trn As Transaction = acBaza.TransactionManager.StartTransaction
  6.        Dim lnL1 As Line = New Line()
  7.        Dim usrPtOp As PromptPointOptions = New PromptPointOptions("Wskarz srodek pomieszczenia :")
  8.        Dim usrPt As PromptPointResult = lCmd.GetPoint(usrPtOp)
  9.        Dim prevPt As Point3d = usrPt.Value
  10.        Dim nextPt As Point3d = usrPt.Value
  11.        If usrPt.Status = PromptStatus.OK Then
  12.            Dim usrPtXmod As Point3d = New Point3d(usrPt.Value.X + 1, usrPt.Value.Y, usrPt.Value.Z)
  13.            Dim promienSledzacy As Ray = New Ray()
  14.            promienSledzacy.BasePoint = usrPt.Value
  15.            promienSledzacy.SecondPoint = usrPtXmod
  16.            'FILTRACJA LINII
  17.            Dim typeValue() As TypedValue = {New TypedValue(0, "line")}
  18.            Dim selFilter As SelectionFilter = New SelectionFilter(typeValue)
  19.            Dim selResult As PromptSelectionResult = lCmd.SelectAll(selFilter)
  20.            Dim ssLinie As SelectionSet = selResult.Value
  21.            Dim tabID() As ObjectId = ssLinie.GetObjectIds
  22.            'TRANSAKCJA
  23.            Try
  24.                Dim btr As BlockTableRecord = trn.GetObject(acBaza.CurrentSpaceId, OpenMode.ForWrite)
  25.                Dim objID As ObjectId
  26.                Dim licz As Integer = 0
  27.                Dim ilosc As Integer = 0
  28.                Dim ra3d As Ray3d = New Ray3d(promienSledzacy.StartPoint, promienSledzacy.SecondPoint)
  29.                Dim lnNajblizsza As Line = Nothing
  30.                For Each objID In tabID
  31.                    Dim ln As Line = CType(trn.GetObject(objID, OpenMode.ForRead), Line)
  32.                    Dim ls As LineSegment3d = New LineSegment3d(ln.StartPoint, ln.EndPoint)
  33.                    Dim ptArray() As Point3d = ls.IntersectWith(ra3d)
  34.                    If ptArray Is Nothing Then Continue For
  35.                    Dim ptkPrzeciecia As Point3dCollection = New Point3dCollection(ptArray)
  36.                    'SZUKANIE PIERWSZEJ NAJBLIZSZEJ LINII                    
  37.                    If ptkPrzeciecia.Count <> ilosc Then
  38.                        ilosc = ptkPrzeciecia.Count
  39.                        If licz = 0 Then
  40.                            nextPt = ptkPrzeciecia.Item(0)
  41.                            lnNajblizsza = ln
  42.                        End If
  43.                        If nextPt.X >= ptkPrzeciecia.Item(licz).X Then
  44.                            nextPt = ptkPrzeciecia.Item(licz)
  45.                            lnNajblizsza = ln
  46.                        End If
  47.                        licz = licz + 1
  48.                    End If
  49.                Next
  50.                promienSledzacy.SetDatabaseDefaults()
  51.                btr.AppendEntity(promienSledzacy)
  52.                trn.AddNewlyCreatedDBObject(promienSledzacy, True)
  53.                trn.Commit()
  54.            Catch ex As Exception
  55.            Finally
  56.                trn.Dispose()
  57.            End Try
  58.            Dim tmpPt2 As Point3d
  59.            Dim przeciecia As Integer
  60.            Dim bezpiecznik As Integer = 0
  61.            While (bezpiecznik < 3)
  62.                bezpiecznik = bezpiecznik + 1
  63.                rysujOdPomocniczy(prevPt, nextPt, tmpPt2, lnL1)
  64.                '  szukajPtk(przeciecia, prevPt, nextPt, tmpPt2, tabID, lnL1)
  65.                If przeciecia = 0 Then
  66.                    prevPt = tmpPt2
  67.                Else
  68.                    prevPt = nextPt
  69.                    przeciecia = 0
  70.                End If
  71.            End While
  72.        End If
  73.    End Sub
  74.    Public Sub rysujOdPomocniczy(ByRef prevPt As Point3d, ByRef nextPt As Point3d, ByRef tmpPt2 As Point3d, ByRef lnL1 As Line)
  75.        Dim  lCmd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  76.        Dim acBaza As Database = lCmd.Document.Database
  77.        Dim trn As Transaction = acBaza.TransactionManager.StartTransaction
  78.        Dim tmpPt1 As Point3d = prevPt
  79.        tmpPt2 = nextPt
  80.        ' WYZNACZANIE KATOW KTORE TRZEBA SPRAWDZIC NA PODSTWAIE POPRZEDNIEGO PUNKTU
  81.        If Math.Round(prevPt.X) = Math.Round(nextPt.X) Then
  82.            If nextPt.Y > prevPt.Y Then
  83.                tmpPt2 = New Point3d(nextPt.X - 10, nextPt.Y, 0)
  84.                lnL1 = CType(trn.GetObject(lnL1.ObjectId, OpenMode.ForWrite), Line)
  85.                lnL1.StartPoint = tmpPt1
  86.                lnL1.EndPoint = tmpPt2
  87.            Else
  88.                Try
  89.                    Dim btr As BlockTableRecord = trn.GetObject(acBaza.CurrentSpaceId, OpenMode.ForWrite)
  90.                    tmpPt2 = New Point3d(nextPt.X + 10, nextPt.Y, 0)
  91.                    lnL1 = CType(trn.GetObject(lnL1.ObjectId, OpenMode.ForWrite), Line)
  92.                    lnL1.StartPoint = tmpPt1
  93.                    lnL1.EndPoint = tmpPt2
  94.                    btr.AppendEntity(lnL1)
  95.                    trn.AddNewlyCreatedDBObject(lnL1, True)
  96.                    lnL1.UpgradeOpen()
  97.                    trn.Commit()
  98.                Catch ex As Exception
  99.                    lCmd.WriteMessage("Wyjatek")
  100.                Finally
  101.                    trn.Dispose()
  102.                End Try
  103.            End If
  104.        ElseIf Math.Round(prevPt.Y) = Math.Round(nextPt.Y) Then
  105.            If nextPt.X > prevPt.X Then
  106.                tmpPt2 = New Point3d(nextPt.X, nextPt.Y + 10, 0)
  107.                lnL1.StartPoint = tmpPt1
  108.                lnL1.EndPoint = tmpPt2
  109.                Try
  110.                    Dim btr As BlockTableRecord = trn.GetObject(acBaza.CurrentSpaceId, OpenMode.ForWrite)
  111.                    btr.AppendEntity(lnL1)
  112.                    trn.AddNewlyCreatedDBObject(lnL1, True)
  113.                    trn.Commit()
  114.                Catch ex As Exception
  115.                    lCmd.WriteMessage("Wyjatek")
  116.                Finally
  117.                    trn.Dispose()
  118.                End Try
  119.            Else
  120.                tmpPt2 = New Point3d(nextPt.X, nextPt.Y + 10, 0)
  121.                lnL1.StartPoint = tmpPt1
  122.                lnL1.EndPoint = tmpPt2
  123.            End If
  124.        End If
  125.    End Sub
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 13:02:00 | 显示全部楼层
潜艇“rysujOdPomocniczy”应该做什么?它需要复制lnL1吗,还是只需要更改起点和终点?
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 13:04:42 | 显示全部楼层
可能有帮助的一件事是将这些行移到If语句之前,以准备任何意外事件:
 
  1. Dim btr As BlockTableRecord = trn.GetObject(acBaza.CurrentSpaceId, OpenMode.ForWrite)

 
  1. lnL1 = CType(trn.GetObject(lnL1.ObjectId, OpenMode.ForWrite), Line)
回复

使用道具 举报

15

主题

46

帖子

31

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 13:16:21 | 显示全部楼层
是的,它需要制作一个lnL1的副本,或者只是用指定的起点和终点绘制不同的线。它做什么呢?它画一条临时线,然后sub szukajPtk检查它是否与某物相交
回复

使用道具 举报

15

主题

46

帖子

31

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 13:20:13 | 显示全部楼层
或者我有没有可能只更新lnL1?
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 13:30:10 | 显示全部楼层
 
如果不需要副本,我会这么做。
回复

使用道具 举报

15

主题

46

帖子

31

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 13:33:07 | 显示全部楼层
但是当我尝试更新这些行时会导致错误
  1.                    btr.AppendEntity(lnL1)
  2.                    trn.AddNewlyCreatedDBObject(lnL1, True)
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 13:42:50 | 显示全部楼层
如果不需要额外的代码行,那么这些代码行将被删除。换句话说,如果原始直线图元只需要修改,则无需追加图元或添加新创建的对象。
 
只是:
 
  1. lnL1 = CType(trn.GetObject(lnL1.ObjectId, OpenMode.ForWrite), Line)

 

 
  1. lnL1.StartPoint = tmpPt1
  2. lnL1.EndPoint = tmpPt2
回复

使用道具 举报

15

主题

46

帖子

31

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 13:49:41 | 显示全部楼层
是的
你总是对的thx
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 13:51:19 | 显示全部楼层
不客气。
 
 
 
谁知道这会持续多久?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-5 03:18 , Processed in 0.329794 second(s), 72 queries .

© 2020-2025 乐筑天下

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