你好
我写了一些代码,但它只在某些时候起作用,我不明白为什么代码假设使用光线和一小行来跟踪一行(如果有必要,我可以用我的概念画一些文件)。当我画两行类似“/”的东西时,问题很奇怪,我启动了光线“->/”它有时起作用,如果有人能带着批评的眼光看代码,有时会画一些愚蠢的东西
<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 usrPtOp As PromptPointOptions = New PromptPointOptions("Wskarz srodek pomieszczenia" + vbCrLf) 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 ' sprawdzenie czy poprawnie wpisano punkt poczatkowy 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 If selResult.Status = PromptStatus.OK Then ' sprawdzenie czy w rysunku znajduja sie jakies linie If ssLinie.Count >= 1 Then tabId = ssLinie.GetObjectIds Dim oid As ObjectId Dim tmpPt2 As Point3d Dim przeciecia As Integer Dim lnL1 As Line = New Line() Dim promienSledzacy As Ray = New Ray() Dim btr As BlockTableRecord = trn.GetObject(acBaza.CurrentSpaceId, OpenMode.ForWrite) 'dodanie do rysunku lnL1 i promienia sledzacego bez parametrow jeszcze niewidoczne btr.AppendEntity(lnL1) trn.AddNewlyCreatedDBObject(lnL1, True) btr.AppendEntity(promienSledzacy) trn.AddNewlyCreatedDBObject(promienSledzacy, True) ' rysowanie pierwszego promienia sledzacego oid = przecieciaPromienia(promienSledzacy, ls3d, tabId, prevPt, nextPt) Dim lnNajblizsza As Line = CType(trn.GetObject(oid, OpenMode.ForRead), Line) 'Sprawdzenie ktory punkt jest nizej Dim START As Point3d Dim FIN As Point3d Dim PunktyPomieszczenia As Point3dCollection = New Point3dCollection() If lnNajblizsza.StartPoint.Y > lnNajblizsza.EndPoint.Y Then START = lnNajblizsza.EndPoint PunktyPomieszczenia.Add(lnNajblizsza.EndPoint) PunktyPomieszczenia.Add(lnNajblizsza.StartPoint) Else START = lnNajblizsza.StartPoint PunktyPomieszczenia.Add(lnNajblizsza.StartPoint) PunktyPomieszczenia.Add(lnNajblizsza.EndPoint) End If Dim IloscWszystkichLinii As Integer = tabId.Count() Dim licznik As Integer = 0 Dim bezpiecznik As Integer = 0 While (licznik < IloscWszystkichLinii) And (bezpiecznik < IloscWszystkichLinii * 6) rysujOdPomocniczy(prevPt, nextPt, tmpPt2, lnL1) szukajPrzecieciaPomocniczego(przeciecia, prevPt, nextPt, tmpPt2, tabId, lnL1) If przeciecia = 0 Then prevPt = tmpPt2 ElseIf przeciecia = 1 Then licznik = licznik + 1 ls3d = New LineSegment3d(nextPt, prevPt) Using trn1 As Transaction = acBaza.TransactionManager.StartTransaction Try Dim btr1 As BlockTableRecord = trn1.GetObject(acBaza.CurrentSpaceId, OpenMode.ForWrite) Dim ll As Line = CType(trn1.GetObject(lnNajblizsza.ObjectId, OpenMode.ForWrite), Line) ll.Erase() trn1.Commit() Catch ex As Exception lCmd.WriteMessage("Wyjatek w usowanie linii" + vbCrLf) Finally trn1.Dispose() End Try End Using 'aktualizacja lini z rysunku selResult = (lCmd.SelectAll(selFilter)) ssLinie = selResult.Value tabId = ssLinie.GetObjectIds 'rysowanie promieni oid = przecieciaPromienia(promienSledzacy, ls3d, tabId, prevPt, nextPt) przeciecia = 0 lnNajblizsza = CType(trn.GetObject(oid, OpenMode.ForRead), Line) Else lCmd.WriteMessage("WIECEJ NIZ JEDNO PRZECIECIE" + vbCrLf) End If bezpiecznik = bezpiecznik + 1 End While If bezpiecznik = IloscWszystkichLinii * 4 Then lCmd.WriteMessage("Linia nie zakonczona") End If Else lCmd.WriteMessage("ERROR : Mniej niz 3 linie pomieszczenie nie moze byc domkniete") End If Else lCmd.WriteMessage("ERROR : Brak linii w rysunku") End If trn.Commit() End If End Using End Sub ' RYSUJE PROMIEN SLEDZACY ' DRAW A TRACING RAY ' SZUKA LINII NAJBLIZSZEJ DANEMU PUNKTOWI ' SEARCH FOR THE NEAREST LINE FOR THE POINT Public Function przecieciaPromienia(ByRef promienSledzacy As Ray, 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)