PanHasan 发表于 2022-7-6 12:49:54

vb中的2d数组。网

你好
我有一个问题,如何创建一个包含直线起点和终点的数组
 
表(0)第一行
表(1)第二行
 
我应该使用这样的东西吗?它可以工作,但这些点都在一起,所以它并不完美
 

Dim Tab() As Point3d

SEANT 发表于 2022-7-6 13:03:08

有几种方法可以存储与点相关的坐标,最佳选择可能取决于数据的下游要求。
 
数组是一种有效的选择,从计算机处理的角度来看,它甚至可能是最有效的。然而,如果点的类型和数量未知,那么对于编码器来说,数组有点少。
 
Autodesk。AutoCAD。几何学Point3dCollection非常易于使用,因为可以随意添加和减去点。
 
关于集合(及其一般易用性),系统。收藏。通用名称空间提供了几种其他存储点(或与此相关的任何数据)的方法,并具有使代码更通用的附加好处,即不仅限于AutoCAD例程。

PanHasan 发表于 2022-7-6 13:18:50

好啊
我试试thx

PanHasan 发表于 2022-7-6 13:32:35

我认为不需要创建新线程,所以我会在这里问你,你知道为什么函数中的光线在图形中不可见吗?如果我使用没有函数的代码,它可以正常工作
 
    <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
         Dim lnNajblizsza As Line = Nothing
         'TRANSAKCJA
         przecieciaPromienia(promienSledzacy, tabID, prevPt, nextPt, lnNajblizsza)

         'Sprawdzenie ktury punkt jest nizej
         Dim START As Point3d
         Dim FIN As Point3d
         If lnNajblizsza.StartPoint.Y > lnNajblizsza.EndPoint.Y Then
               START = lnNajblizsza.EndPoint
         Else
               START = lnNajblizsza.StartPoint
         End If
       End If
   End Sub

   Public Sub przecieciaPromienia(ByRef promienSledzacy As Ray, ByRef tabID() As ObjectId, ByRef prevPt As Point3d, ByRef nextPt As Point3d, ByRef lnNajblizsza As Line)
       Dim lCmd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
       Dim acBaza As Database = lCmd.Document.Database
       Dim trn As Transaction = acBaza.TransactionManager.StartTransaction
       Try
         Dim btr As BlockTableRecord = trn.GetObject(acBaza.CurrentSpaceId, OpenMode.ForWrite)
         Dim objID As ObjectId
         Dim ra3d As Ray3d = New Ray3d(promienSledzacy.StartPoint, promienSledzacy.SecondPoint)
         Dim odl As Single = 0.0
         Dim odlTmp As Single = 0.0
         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   
               '   odl=sqrt ((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2))

               odlTmp = Math.Sqrt((prevPt.X - ptkPrzeciecia.Item(0).X) * (prevPt.X - ptkPrzeciecia.Item(0).X) + (prevPt.Y - ptkPrzeciecia.Item(0).Y) * (prevPt.Y - ptkPrzeciecia.Item(0).Y))

               If odl = 0.0 Then
                   odl = odlTmp
                   nextPt = ptkPrzeciecia.Item(0)
                   lnNajblizsza = ln
               ElseIf odl >= odlTmp Then
                   nextPt = ptkPrzeciecia.Item(0)
                   lnNajblizsza = ln
               End If
         Next
         lnNajblizsza.Highlight()
         promienSledzacy.SetDatabaseDefaults()
         btr.AppendEntity(promienSledzacy)
         trn.AddNewlyCreatedDBObject(promienSledzacy, True)
         trn.Commit()
       Catch ex As Exception
       Finally
         trn.Dispose()
       End Try
   End Sub

SEANT 发表于 2022-7-6 13:39:33

我不能确切地说这是一种确定的方法,但在子/函数之间传递开放数据库对象引用可能不是最佳做法。我修改了结构以说明另一种选择。注意:Autodesk。AutoCAD。几何体对象不是数据库驻留对象
 
我认为Ray没有显示的原因是顶级事务尚未提交。我再次修改了例程来说明这一点。
 
 
    <CommandMethod("src")> _
Public Sub src()
       Dim lCmd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
       Dim acBaza As Database = lCmd.Document.Database
       Using 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 ls3d As LineSegment3d = New LineSegment3d(usrPt.Value, 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

               Dim oid As ObjectId
               'TRANSAKCJA
               oid = przecieciaPromienia(ls3d, tabID, prevPt, nextPt)
               Dim lnNajblizsza As Line = CType(trn.GetObject(oid, OpenMode.ForRead), Line)
               'Sprawdzenie ktury punkt jest nizej
               Dim START As Point3d
               'Dim FIN As Point3d
               If lnNajblizsza.StartPoint.Y > lnNajblizsza.EndPoint.Y Then
                   START = lnNajblizsza.EndPoint
               Else
                   START = lnNajblizsza.StartPoint
               End If

         End If
         trn.Commit()
       End Using
   End Sub

   Public Function przecieciaPromienia(ByRef ls3d As LineSegment3d, ByRef tabID() As ObjectId, ByRef prevPt As Point3d, ByRef nextPt As Point3d) As ObjectId
       Dim lCmd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
       Dim acBaza As Database = Application.DocumentManager.MdiActiveDocument.Database
       Dim lnNajblizsza As Line = Nothing
       Using trn As Transaction = acBaza.TransactionManager.StartTransaction

         Try
               Dim btr As BlockTableRecord = CType(trn.GetObject(acBaza.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
               Dim objID As ObjectId
               Dim ra3d As Ray3d = New Ray3d(ls3d.StartPoint, ls3d.EndPoint)

               Dim odl As Single = 0.0
               Dim odlTmp As Single = 0.0
               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   
                   '   odl=sqrt ((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2))

                   odlTmp = Math.Sqrt((prevPt.X - ptkPrzeciecia.Item(0).X) * (prevPt.X - ptkPrzeciecia.Item(0).X) + (prevPt.Y - ptkPrzeciecia.Item(0).Y) * (prevPt.Y - ptkPrzeciecia.Item(0).Y))

                   If odl = 0.0 Then
                     odl = odlTmp
                     nextPt = ptkPrzeciecia.Item(0)

                   ElseIf odl >= odlTmp Then
                     nextPt = ptkPrzeciecia.Item(0)

                   End If
                   lnNajblizsza = ln
               Next
               lnNajblizsza.Highlight()
               Dim promienSledzacy As Ray = New Ray()
               promienSledzacy.BasePoint = ls3d.StartPoint
               promienSledzacy.SecondPoint = ls3d.EndPoint
               promienSledzacy.SetDatabaseDefaults()
               btr.AppendEntity(promienSledzacy)
               trn.AddNewlyCreatedDBObject(promienSledzacy, True)
               trn.Commit()
         Catch ex As Exception
         End Try
         Return lnNajblizsza.ObjectId
       End Using
   End Function

PanHasan 发表于 2022-7-6 14:01:09

谢谢你的建议和解决方案
页: [1]
查看完整版本: vb中的2d数组。网