vb中的2d数组。网
你好我有一个问题,如何创建一个包含直线起点和终点的数组
表(0)第一行
表(1)第二行
我应该使用这样的东西吗?它可以工作,但这些点都在一起,所以它并不完美
Dim Tab() As Point3d
有几种方法可以存储与点相关的坐标,最佳选择可能取决于数据的下游要求。
数组是一种有效的选择,从计算机处理的角度来看,它甚至可能是最有效的。然而,如果点的类型和数量未知,那么对于编码器来说,数组有点少。
Autodesk。AutoCAD。几何学Point3dCollection非常易于使用,因为可以随意添加和减去点。
关于集合(及其一般易用性),系统。收藏。通用名称空间提供了几种其他存储点(或与此相关的任何数据)的方法,并具有使代码更通用的附加好处,即不仅限于AutoCAD例程。 好啊
我试试thx 我认为不需要创建新线程,所以我会在这里问你,你知道为什么函数中的光线在图形中不可见吗?如果我使用没有函数的代码,它可以正常工作
<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 我不能确切地说这是一种确定的方法,但在子/函数之间传递开放数据库对象引用可能不是最佳做法。我修改了结构以说明另一种选择。注意: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 谢谢你的建议和解决方案
页:
[1]