Moin!
ich möchte in naher Zukunft einige meiner zentralen Berechnungsfunktionen in Klassen auslagern um diese effektiver nutzen zu können.
Habe mir einfach einmal ein Beispiel aus der Vermessung - die Kleinpunktberechnung herangezogen. Vielleicht kommt einer von Euch aus dieser Branche und es ist so an dem Beispiel einfacher zu diskutieren.
Hier mein Beispiel-Code
Spoiler anzeigen
In einem Teil werden die Defintionspunkte für Gerade definiert auf der die Kleinpunktberechnung durchgeführt werden. Hier gibt es auch Eigenschaften getrennt für Rechts und Hochwert - aber auch für Punkte innerhalb einer Autocad-Programmierung.
Dann gibt es noch einige Randbedigungen für die Berechnungen, wie das Anlegemass und dass Endmass für eine mögliche Fehlerverteilung.
Dann kommen ja immer die eigentlichen Berechnung. Hier ist ja immer zu gewährleisten, dass auch alle Grundparameter definiert sind.
Genau hier ist einer der Punkte, wo ich mich immer etwas schwer tue. Baut man vor der eigentlichen Berechnung eine Methode (?) ein um zu prüfen, ob alles ok ist (Success)? Oder wie geht man mit dem ganzen um.
Würde mich über Rückmeldungen freuen.
Gruß Jan
ich möchte in naher Zukunft einige meiner zentralen Berechnungsfunktionen in Klassen auslagern um diese effektiver nutzen zu können.
Habe mir einfach einmal ein Beispiel aus der Vermessung - die Kleinpunktberechnung herangezogen. Vielleicht kommt einer von Euch aus dieser Branche und es ist so an dem Beispiel einfacher zu diskutieren.
Hier mein Beispiel-Code
VB.NET-Quellcode
- Public Class Kleinpunkt
- '------- http://ms-wiki-1/eblwiki/index.php?title=Kleinpunkt_(Klasse_von_EBL.Service)
- Public _AcLog As EBL.AcadLogger.AcLog
- Public _Rechts_A As Double
- Public _Hoch_A As Double
- Public _Rechts_E As Double
- Public _Hoch_E As Double
- Private _IstStrecke As Double
- Private _IsBasisCalc As Boolean = False
- Public _Verteilungsfaktor As Double = 1
- Public _Anlegemass As Double = 0.0
- Private _Faktor_o As Double = 1
- Private _Faktor_a As Double = 1
- Public _Rechts_N As Double
- Public _Hoch_N As Double
- ''' <summary>
- ''' Init
- ''' </summary>
- ''' <param name="AcLog"></param>
- Public Sub New(AcLog As EBL.AcadLogger.AcLog)
- _AcLog = AcLog
- End Sub
- ''' <summary>
- ''' ANFANGspunkt RECHTS
- ''' </summary>
- Public WriteOnly Property AnfangRechts As Double
- Set(value As Double)
- _Rechts_A = value
- End Set
- End Property
- ''' <summary>
- ''' ANFANGspunkt HOCH
- ''' </summary>
- Public WriteOnly Property AnfangHoch As Double
- Set(value As Double)
- _Hoch_A = value
- End Set
- End Property
- ''' <summary>
- ''' ANFANG-Punkt als 2D-Punkt
- ''' </summary>
- Public WriteOnly Property AnfangPunkt2D As Autodesk.AutoCAD.Geometry.Point2d
- Set(value As Autodesk.AutoCAD.Geometry.Point2d)
- _Rechts_A = value.X
- _Hoch_A = value.Y
- End Set
- End Property
- ''' <summary>
- ''' ANFANG-Punkt als 3D-Punkt
- ''' </summary>
- Public WriteOnly Property AnfangPunkt3D As Autodesk.AutoCAD.Geometry.Point3d
- Set(value As Autodesk.AutoCAD.Geometry.Point3d)
- _Rechts_A = value.X
- _Hoch_A = value.Y
- End Set
- End Property
- ''' <summary>
- ''' ANFANG-Punkt als LinePoint
- ''' </summary>
- Public WriteOnly Property AnfangPunktAsLinePoint As Autodesk.Map.IM.Graphic.LinePoint
- Set(value As Autodesk.Map.IM.Graphic.LinePoint)
- _Rechts_A = value.X
- _Hoch_A = value.Y
- End Set
- End Property
- ''' <summary>
- ''' ANFANG-Punkt als Point
- ''' </summary>
- Public WriteOnly Property AnfangPunktAsPoint As Autodesk.Map.IM.Graphic.Point
- Set(value As Autodesk.Map.IM.Graphic.Point)
- _Rechts_A = value.X
- _Hoch_A = value.Y
- End Set
- End Property
- ''' <summary>
- ''' ENDpunkt RECHTS
- ''' </summary>
- Public WriteOnly Property EndRechts As Double
- Set(value As Double)
- _Rechts_E = value
- End Set
- End Property
- ''' <summary>
- ''' ENDpunkt HOCH
- ''' </summary>
- Public WriteOnly Property EndHoch As Double
- Set(value As Double)
- _Hoch_E = value
- End Set
- End Property
- ''' <summary>
- ''' END-Punkt als 2D-Punkt
- ''' </summary>
- Public WriteOnly Property EndPunkt2D As Autodesk.AutoCAD.Geometry.Point2d
- Set(value As Autodesk.AutoCAD.Geometry.Point2d)
- _Rechts_E = value.X
- _Hoch_E = value.Y
- End Set
- End Property
- ''' <summary>
- ''' END-Punkt als 3D-Punkt
- ''' </summary>
- Public WriteOnly Property EndPunkt3D As Autodesk.AutoCAD.Geometry.Point3d
- Set(value As Autodesk.AutoCAD.Geometry.Point3d)
- _Rechts_E = value.X
- _Hoch_E = value.Y
- End Set
- End Property
- ''' <summary>
- ''' END-Punkt als LinePoint
- ''' </summary>
- Public WriteOnly Property EndPunktAsLinePoint As Autodesk.Map.IM.Graphic.LinePoint
- Set(value As Autodesk.Map.IM.Graphic.LinePoint)
- _Rechts_E = value.X
- _Hoch_E = value.Y
- End Set
- End Property
- ''' <summary>
- ''' END-Punkt als Point
- ''' </summary>
- Public WriteOnly Property EndPunktAsPoint As Autodesk.Map.IM.Graphic.Point
- Set(value As Autodesk.Map.IM.Graphic.Point)
- _Rechts_E = value.X
- _Hoch_E = value.Y
- End Set
- End Property
- ''' <summary>
- ''' ENDpunkt HOCH
- ''' </summary>
- Public WriteOnly Property IstStrecke As Double
- Set(value As Double)
- _IstStrecke = value
- End Set
- End Property
- ''' <summary>
- ''' Verteilungsfaktor
- ''' </summary>
- Public WriteOnly Property VerteilungFaktor As Double
- Set(value As Double)
- _Verteilungsfaktor = value
- End Set
- End Property
- ''' <summary>
- ''' NEU-Punkt als AcPoint3D
- ''' </summary>
- Public ReadOnly Property NeuPoint3D As Autodesk.AutoCAD.Geometry.Point3d
- Get
- Dim Point As New Autodesk.AutoCAD.Geometry.Point3d(_Rechts_N, _Hoch_N, 0)
- Return Point
- End Get
- End Property
- ''' <summary>
- ''' NEU-Punkt als AcPoint2D
- ''' </summary>
- Public ReadOnly Property NeuPoint2D As Autodesk.AutoCAD.Geometry.Point2d
- Get
- Dim Point As New Autodesk.AutoCAD.Geometry.Point2d(_Rechts_N, _Hoch_N)
- Return Point
- End Get
- End Property
- ''' <summary>
- ''' Berechnen der Iststrecke aus gemessenen Anlegemass und Endmass
- ''' </summary>
- ''' <param name="Anlegemass">Anlegemass gemessen</param>
- ''' <param name="Endmass">Endmass gemessen</param>
- Public Sub IstStreckeMitAnlegemass(Anlegemass As Double, Endmass As Double)
- _Anlegemass = Anlegemass
- _IstStrecke = Endmass - Anlegemass
- End Sub
- ''' <summary>
- ''' Anlegemass zurücksetzen
- ''' </summary>
- Public Sub AnlegemassReset()
- _Anlegemass = 0
- End Sub
- ''' <summary>
- ''' Berechnung des Verteilungsfaktor
- ''' </summary>
- Public Sub CalcVerteilung(Endmass As Double)
- Dim Delta_R As Double = (_Rechts_E - _Rechts_A)
- Dim Delta_H As Double = (_Hoch_E - _Hoch_A)
- Dim SollStrecke As Double = Math.Sqrt(Delta_R * Delta_R + Delta_H * Delta_H)
- Dim IstStrecke As Double = _Anlegemass - Endmass
- VerteilungFaktor = IstStrecke / SollStrecke
- End Sub
- ''' <summary>
- ''' Berechnen der Basisparameter
- ''' </summary>
- ''' <returns>-1 ... Fehler / 0 ... keine Berechnung erfolgt / 1 .... erfolgt</returns>
- Public Function CalcBase() As Integer
- Dim Result As Integer = 0
- Try
- Dim Strecke As Double = 0
- Dim Delta_R As Double = (_Rechts_E - _Rechts_A)
- Dim Delta_H As Double = (_Hoch_E - _Hoch_A)
- Strecke = Math.Sqrt(Delta_R * Delta_R + Delta_H * Delta_H)
- _Faktor_o = (_Rechts_E - _Rechts_A) / Strecke 'Rechtswert abhängig
- _Faktor_a = (_Hoch_E - _Hoch_A) / Strecke 'Hochwert abhängig
- _IsBasisCalc = True
- Result = 1
- Catch ex As Exception
- _AcLog.WriteAsError("Fehler bei der Basisberechnung - CalcBase" & Environment.NewLine & ex.ToString())
- Result = -1
- End Try
- Return Result
- End Function
- ''' <summary>
- ''' Berechnen eines Kleinpunktes mit Verteilung in Abzizze und Ordinate
- ''' </summary>
- ''' <param name="Abzisse"></param>
- ''' <param name="Ordinate"></param>
- ''' <returns>-1 ... Fehler / 0 ... keine Berechnung erfolgt / 1 .... erfolgt</returns>
- Public Function CalcPointOhneVerteilung(Abzisse As Double, Ordinate As Double) As Integer
- Return CalcPointWork(Abzisse, Ordinate, VerteilungAbzisse:=False, VerteilungOrdinate:=False)
- End Function
- ''' <summary>
- ''' Berechnen eines Kleinpunktes mit Verteilung nur mit Abzizze
- ''' </summary>
- ''' <param name="Abzisse"></param>
- ''' <returns>-1 ... Fehler / 0 ... keine Berechnung erfolgt / 1 .... erfolgt</returns>
- Public Function CalcPointOhneVerteilung(Abzisse As Double) As Integer
- Return CalcPointWork(Abzisse, 0.0, VerteilungAbzisse:=False, VerteilungOrdinate:=False)
- End Function
- ''' <summary>
- ''' Berechnen eines Kleinpunktes mit Verteilung in Abzizze und Ordinate
- ''' </summary>
- ''' <param name="Abzisse"></param>
- ''' <param name="Ordinate"></param>
- ''' <returns>-1 ... Fehler / 0 ... keine Berechnung erfolgt / 1 .... erfolgt</returns>
- Public Function CalcPointVerteilung(Abzisse As Double, Ordinate As Double) As Integer
- Return CalcPointWork(Abzisse, Ordinate, VerteilungAbzisse:=True, VerteilungOrdinate:=True)
- End Function
- ''' <summary>
- ''' Berechnen eines Punktes
- ''' </summary>
- ''' <param name="Abzisse"></param>
- ''' <param name="Ordinate"></param>
- ''' <param name="VerteilungAbzisse">mit Verteilung auf die Abzisse</param>
- ''' <param name="VerteilungOrdinate">mit Verteilung auf die Ordinate</param>
- ''' <returns>-2 ... Fehler in den A-E-Punkten / -1 ... Fehler / 0 ... keine Berechnung erfolgt / 1 .... erfolgt</returns>
- Public Function CalcPointWork(Abzisse As Double, Ordinate As Double, Optional VerteilungAbzisse As Boolean = True, Optional VerteilungOrdinate As Boolean = True) As Integer
- Dim Result As Integer = 0
- Try
- If _IsBasisCalc = False Then
- _AcLog.Write("==> rufe CalcBase auf für die Basis-Parameter-Berechnung")
- If CalcBase() = -1 Then Return -1 ' Fehler in der Basisberechnung
- End If
- Dim Abz As Double = Abzisse - _Anlegemass
- Dim Ord As Double = Ordinate
- If VerteilungAbzisse = True Then Abz = Abz * _Verteilungsfaktor
- If VerteilungOrdinate = True Then Ord = Ord * _Verteilungsfaktor
- _Rechts_N = _Rechts_A + _Faktor_o * Abz + _Faktor_a * Ord
- _Hoch_N = _Hoch_A + _Faktor_a * Abz - _Faktor_o * Ord
- ' Protokoll der Kleinpunktberechnung
- If Doku() = False Then Return -2 ' Basisparameter
- With _AcLog
- .WriteParameter("VerteilungAbzisse", VerteilungAbzisse.ToString)
- .WriteParameter("VerteilungOrdinate", VerteilungOrdinate.ToString)
- .Write("Abzisse:= " & Abzisse.ToString("0.000") & " -> Vert:= " & Abz.ToString("0.000"))
- .Write("Ordinate:= " & Ordinate.ToString("0.000") & " -> Vert:= " & Ord.ToString("0.000"))
- .Write2D("Neu-Punkt", _Rechts_N, _Hoch_N)
- End With
- Result = 1
- Catch ex As Exception
- _AcLog.WriteAsError("Fehler bei der Basisberechnung - CalcPointWork" & Environment.NewLine & ex.ToString())
- Result = -1
- End Try
- Return Result
- End Function
- ''' <summary>
- ''' Protokoll der Basiswerte für die Kleinpunktberechnung
- ''' </summary>
- ''' <returns>false ... Fehler in den Daten / true ... alles OK</returns>
- Private Function Doku() As Boolean
- Dim Result As Boolean = True
- With _AcLog
- .Write("--- Kleinpunktberechnung ---")
- If _Rechts_A = _k_Invalid_Rechtswert Or _Hoch_A = _k_Invalid_Hochwert Then
- .WriteAsError("ANFANGSpunkt nicht korrekt definiert!")
- Result = False
- Else
- .Write2D("Anfang-Punkt", _Rechts_A, _Hoch_A)
- End If
- If _Rechts_E = _k_Invalid_Rechtswert Or _Hoch_E = _k_Invalid_Hochwert Then
- .WriteAsError("ENDpunkt nicht korrekt definiert!")
- Result = False
- Else
- .Write2D("End-Punkt", _Rechts_E, _Hoch_E)
- End If
- .WriteParameter("Anlegemass", _Anlegemass)
- .WriteParameter("Strecke", _IstStrecke)
- .WriteParameter("Faktor_o", _Faktor_o)
- .WriteParameter("Faktor_a", _Faktor_a)
- End With
- Return Result
- End Function
- ''' <summary>
- ''' klasssische 2D Kleinpunktberechnung für einen einfachen Punkt
- ''' </summary>
- ''' <param name="Anfangspunkt">Topobase-Punktobjekt</param>
- ''' <param name="Endpunkt">Topobase-Punktobjekt</param>
- ''' <param name="IstStrecke">für eine mögliche Streckenverteilung, kleiner 0, dann wird diese ignoriert</param>
- ''' <returns></returns>
- Public Function KlassischSimple(ByVal Anfangspunkt As Autodesk.AutoCAD.Geometry.Point3d,
- ByVal Endpunkt As Autodesk.AutoCAD.Geometry.Point3d,
- ByVal IstStrecke As Double,
- ByVal Abzisse As Double,
- ByVal Ordinate As Double) As Autodesk.AutoCAD.Geometry.Point3d
- 'Optional Höhe_N As Double = 0 - vorerst weggelassen
- _Rechts_A = Anfangspunkt.X
- _Hoch_A = Anfangspunkt.Y
- _Rechts_E = Endpunkt.X
- _Hoch_E = Endpunkt.Y
- AnlegemassReset()
- If IstStrecke = -1 Then ' kleine Verteilung
- _Verteilungsfaktor = 1
- Else
- CalcVerteilung(IstStrecke)
- End If
- CalcPointWork(Abzisse, Ordinate) ' druchführen der Berechnung
- Return NeuPoint3D
- End Function
- End Class
In einem Teil werden die Defintionspunkte für Gerade definiert auf der die Kleinpunktberechnung durchgeführt werden. Hier gibt es auch Eigenschaften getrennt für Rechts und Hochwert - aber auch für Punkte innerhalb einer Autocad-Programmierung.
Dann gibt es noch einige Randbedigungen für die Berechnungen, wie das Anlegemass und dass Endmass für eine mögliche Fehlerverteilung.
Dann kommen ja immer die eigentlichen Berechnung. Hier ist ja immer zu gewährleisten, dass auch alle Grundparameter definiert sind.
Genau hier ist einer der Punkte, wo ich mich immer etwas schwer tue. Baut man vor der eigentlichen Berechnung eine Methode (?) ein um zu prüfen, ob alles ok ist (Success)? Oder wie geht man mit dem ganzen um.
Würde mich über Rückmeldungen freuen.
Gruß Jan