Hilfe bei der Erstellung - wie bestreitet man den Weg "richtig" (Beispiel: Vermessung Kleinpunkt)

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Hilfe bei der Erstellung - wie bestreitet man den Weg "richtig" (Beispiel: Vermessung Kleinpunkt)

    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

    VB.NET-Quellcode

    1. Public Class Kleinpunkt
    2. '------- http://ms-wiki-1/eblwiki/index.php?title=Kleinpunkt_(Klasse_von_EBL.Service)
    3. Public _AcLog As EBL.AcadLogger.AcLog
    4. Public _Rechts_A As Double
    5. Public _Hoch_A As Double
    6. Public _Rechts_E As Double
    7. Public _Hoch_E As Double
    8. Private _IstStrecke As Double
    9. Private _IsBasisCalc As Boolean = False
    10. Public _Verteilungsfaktor As Double = 1
    11. Public _Anlegemass As Double = 0.0
    12. Private _Faktor_o As Double = 1
    13. Private _Faktor_a As Double = 1
    14. Public _Rechts_N As Double
    15. Public _Hoch_N As Double
    16. ''' <summary>
    17. ''' Init
    18. ''' </summary>
    19. ''' <param name="AcLog"></param>
    20. Public Sub New(AcLog As EBL.AcadLogger.AcLog)
    21. _AcLog = AcLog
    22. End Sub
    23. ''' <summary>
    24. ''' ANFANGspunkt RECHTS
    25. ''' </summary>
    26. Public WriteOnly Property AnfangRechts As Double
    27. Set(value As Double)
    28. _Rechts_A = value
    29. End Set
    30. End Property
    31. ''' <summary>
    32. ''' ANFANGspunkt HOCH
    33. ''' </summary>
    34. Public WriteOnly Property AnfangHoch As Double
    35. Set(value As Double)
    36. _Hoch_A = value
    37. End Set
    38. End Property
    39. ''' <summary>
    40. ''' ANFANG-Punkt als 2D-Punkt
    41. ''' </summary>
    42. Public WriteOnly Property AnfangPunkt2D As Autodesk.AutoCAD.Geometry.Point2d
    43. Set(value As Autodesk.AutoCAD.Geometry.Point2d)
    44. _Rechts_A = value.X
    45. _Hoch_A = value.Y
    46. End Set
    47. End Property
    48. ''' <summary>
    49. ''' ANFANG-Punkt als 3D-Punkt
    50. ''' </summary>
    51. Public WriteOnly Property AnfangPunkt3D As Autodesk.AutoCAD.Geometry.Point3d
    52. Set(value As Autodesk.AutoCAD.Geometry.Point3d)
    53. _Rechts_A = value.X
    54. _Hoch_A = value.Y
    55. End Set
    56. End Property
    57. ''' <summary>
    58. ''' ANFANG-Punkt als LinePoint
    59. ''' </summary>
    60. Public WriteOnly Property AnfangPunktAsLinePoint As Autodesk.Map.IM.Graphic.LinePoint
    61. Set(value As Autodesk.Map.IM.Graphic.LinePoint)
    62. _Rechts_A = value.X
    63. _Hoch_A = value.Y
    64. End Set
    65. End Property
    66. ''' <summary>
    67. ''' ANFANG-Punkt als Point
    68. ''' </summary>
    69. Public WriteOnly Property AnfangPunktAsPoint As Autodesk.Map.IM.Graphic.Point
    70. Set(value As Autodesk.Map.IM.Graphic.Point)
    71. _Rechts_A = value.X
    72. _Hoch_A = value.Y
    73. End Set
    74. End Property
    75. ''' <summary>
    76. ''' ENDpunkt RECHTS
    77. ''' </summary>
    78. Public WriteOnly Property EndRechts As Double
    79. Set(value As Double)
    80. _Rechts_E = value
    81. End Set
    82. End Property
    83. ''' <summary>
    84. ''' ENDpunkt HOCH
    85. ''' </summary>
    86. Public WriteOnly Property EndHoch As Double
    87. Set(value As Double)
    88. _Hoch_E = value
    89. End Set
    90. End Property
    91. ''' <summary>
    92. ''' END-Punkt als 2D-Punkt
    93. ''' </summary>
    94. Public WriteOnly Property EndPunkt2D As Autodesk.AutoCAD.Geometry.Point2d
    95. Set(value As Autodesk.AutoCAD.Geometry.Point2d)
    96. _Rechts_E = value.X
    97. _Hoch_E = value.Y
    98. End Set
    99. End Property
    100. ''' <summary>
    101. ''' END-Punkt als 3D-Punkt
    102. ''' </summary>
    103. Public WriteOnly Property EndPunkt3D As Autodesk.AutoCAD.Geometry.Point3d
    104. Set(value As Autodesk.AutoCAD.Geometry.Point3d)
    105. _Rechts_E = value.X
    106. _Hoch_E = value.Y
    107. End Set
    108. End Property
    109. ''' <summary>
    110. ''' END-Punkt als LinePoint
    111. ''' </summary>
    112. Public WriteOnly Property EndPunktAsLinePoint As Autodesk.Map.IM.Graphic.LinePoint
    113. Set(value As Autodesk.Map.IM.Graphic.LinePoint)
    114. _Rechts_E = value.X
    115. _Hoch_E = value.Y
    116. End Set
    117. End Property
    118. ''' <summary>
    119. ''' END-Punkt als Point
    120. ''' </summary>
    121. Public WriteOnly Property EndPunktAsPoint As Autodesk.Map.IM.Graphic.Point
    122. Set(value As Autodesk.Map.IM.Graphic.Point)
    123. _Rechts_E = value.X
    124. _Hoch_E = value.Y
    125. End Set
    126. End Property
    127. ''' <summary>
    128. ''' ENDpunkt HOCH
    129. ''' </summary>
    130. Public WriteOnly Property IstStrecke As Double
    131. Set(value As Double)
    132. _IstStrecke = value
    133. End Set
    134. End Property
    135. ''' <summary>
    136. ''' Verteilungsfaktor
    137. ''' </summary>
    138. Public WriteOnly Property VerteilungFaktor As Double
    139. Set(value As Double)
    140. _Verteilungsfaktor = value
    141. End Set
    142. End Property
    143. ''' <summary>
    144. ''' NEU-Punkt als AcPoint3D
    145. ''' </summary>
    146. Public ReadOnly Property NeuPoint3D As Autodesk.AutoCAD.Geometry.Point3d
    147. Get
    148. Dim Point As New Autodesk.AutoCAD.Geometry.Point3d(_Rechts_N, _Hoch_N, 0)
    149. Return Point
    150. End Get
    151. End Property
    152. ''' <summary>
    153. ''' NEU-Punkt als AcPoint2D
    154. ''' </summary>
    155. Public ReadOnly Property NeuPoint2D As Autodesk.AutoCAD.Geometry.Point2d
    156. Get
    157. Dim Point As New Autodesk.AutoCAD.Geometry.Point2d(_Rechts_N, _Hoch_N)
    158. Return Point
    159. End Get
    160. End Property
    161. ''' <summary>
    162. ''' Berechnen der Iststrecke aus gemessenen Anlegemass und Endmass
    163. ''' </summary>
    164. ''' <param name="Anlegemass">Anlegemass gemessen</param>
    165. ''' <param name="Endmass">Endmass gemessen</param>
    166. Public Sub IstStreckeMitAnlegemass(Anlegemass As Double, Endmass As Double)
    167. _Anlegemass = Anlegemass
    168. _IstStrecke = Endmass - Anlegemass
    169. End Sub
    170. ''' <summary>
    171. ''' Anlegemass zurücksetzen
    172. ''' </summary>
    173. Public Sub AnlegemassReset()
    174. _Anlegemass = 0
    175. End Sub
    176. ''' <summary>
    177. ''' Berechnung des Verteilungsfaktor
    178. ''' </summary>
    179. Public Sub CalcVerteilung(Endmass As Double)
    180. Dim Delta_R As Double = (_Rechts_E - _Rechts_A)
    181. Dim Delta_H As Double = (_Hoch_E - _Hoch_A)
    182. Dim SollStrecke As Double = Math.Sqrt(Delta_R * Delta_R + Delta_H * Delta_H)
    183. Dim IstStrecke As Double = _Anlegemass - Endmass
    184. VerteilungFaktor = IstStrecke / SollStrecke
    185. End Sub
    186. ''' <summary>
    187. ''' Berechnen der Basisparameter
    188. ''' </summary>
    189. ''' <returns>-1 ... Fehler / 0 ... keine Berechnung erfolgt / 1 .... erfolgt</returns>
    190. Public Function CalcBase() As Integer
    191. Dim Result As Integer = 0
    192. Try
    193. Dim Strecke As Double = 0
    194. Dim Delta_R As Double = (_Rechts_E - _Rechts_A)
    195. Dim Delta_H As Double = (_Hoch_E - _Hoch_A)
    196. Strecke = Math.Sqrt(Delta_R * Delta_R + Delta_H * Delta_H)
    197. _Faktor_o = (_Rechts_E - _Rechts_A) / Strecke 'Rechtswert abhängig
    198. _Faktor_a = (_Hoch_E - _Hoch_A) / Strecke 'Hochwert abhängig
    199. _IsBasisCalc = True
    200. Result = 1
    201. Catch ex As Exception
    202. _AcLog.WriteAsError("Fehler bei der Basisberechnung - CalcBase" & Environment.NewLine & ex.ToString())
    203. Result = -1
    204. End Try
    205. Return Result
    206. End Function
    207. ''' <summary>
    208. ''' Berechnen eines Kleinpunktes mit Verteilung in Abzizze und Ordinate
    209. ''' </summary>
    210. ''' <param name="Abzisse"></param>
    211. ''' <param name="Ordinate"></param>
    212. ''' <returns>-1 ... Fehler / 0 ... keine Berechnung erfolgt / 1 .... erfolgt</returns>
    213. Public Function CalcPointOhneVerteilung(Abzisse As Double, Ordinate As Double) As Integer
    214. Return CalcPointWork(Abzisse, Ordinate, VerteilungAbzisse:=False, VerteilungOrdinate:=False)
    215. End Function
    216. ''' <summary>
    217. ''' Berechnen eines Kleinpunktes mit Verteilung nur mit Abzizze
    218. ''' </summary>
    219. ''' <param name="Abzisse"></param>
    220. ''' <returns>-1 ... Fehler / 0 ... keine Berechnung erfolgt / 1 .... erfolgt</returns>
    221. Public Function CalcPointOhneVerteilung(Abzisse As Double) As Integer
    222. Return CalcPointWork(Abzisse, 0.0, VerteilungAbzisse:=False, VerteilungOrdinate:=False)
    223. End Function
    224. ''' <summary>
    225. ''' Berechnen eines Kleinpunktes mit Verteilung in Abzizze und Ordinate
    226. ''' </summary>
    227. ''' <param name="Abzisse"></param>
    228. ''' <param name="Ordinate"></param>
    229. ''' <returns>-1 ... Fehler / 0 ... keine Berechnung erfolgt / 1 .... erfolgt</returns>
    230. Public Function CalcPointVerteilung(Abzisse As Double, Ordinate As Double) As Integer
    231. Return CalcPointWork(Abzisse, Ordinate, VerteilungAbzisse:=True, VerteilungOrdinate:=True)
    232. End Function
    233. ''' <summary>
    234. ''' Berechnen eines Punktes
    235. ''' </summary>
    236. ''' <param name="Abzisse"></param>
    237. ''' <param name="Ordinate"></param>
    238. ''' <param name="VerteilungAbzisse">mit Verteilung auf die Abzisse</param>
    239. ''' <param name="VerteilungOrdinate">mit Verteilung auf die Ordinate</param>
    240. ''' <returns>-2 ... Fehler in den A-E-Punkten / -1 ... Fehler / 0 ... keine Berechnung erfolgt / 1 .... erfolgt</returns>
    241. Public Function CalcPointWork(Abzisse As Double, Ordinate As Double, Optional VerteilungAbzisse As Boolean = True, Optional VerteilungOrdinate As Boolean = True) As Integer
    242. Dim Result As Integer = 0
    243. Try
    244. If _IsBasisCalc = False Then
    245. _AcLog.Write("==> rufe CalcBase auf für die Basis-Parameter-Berechnung")
    246. If CalcBase() = -1 Then Return -1 ' Fehler in der Basisberechnung
    247. End If
    248. Dim Abz As Double = Abzisse - _Anlegemass
    249. Dim Ord As Double = Ordinate
    250. If VerteilungAbzisse = True Then Abz = Abz * _Verteilungsfaktor
    251. If VerteilungOrdinate = True Then Ord = Ord * _Verteilungsfaktor
    252. _Rechts_N = _Rechts_A + _Faktor_o * Abz + _Faktor_a * Ord
    253. _Hoch_N = _Hoch_A + _Faktor_a * Abz - _Faktor_o * Ord
    254. ' Protokoll der Kleinpunktberechnung
    255. If Doku() = False Then Return -2 ' Basisparameter
    256. With _AcLog
    257. .WriteParameter("VerteilungAbzisse", VerteilungAbzisse.ToString)
    258. .WriteParameter("VerteilungOrdinate", VerteilungOrdinate.ToString)
    259. .Write("Abzisse:= " & Abzisse.ToString("0.000") & " -> Vert:= " & Abz.ToString("0.000"))
    260. .Write("Ordinate:= " & Ordinate.ToString("0.000") & " -> Vert:= " & Ord.ToString("0.000"))
    261. .Write2D("Neu-Punkt", _Rechts_N, _Hoch_N)
    262. End With
    263. Result = 1
    264. Catch ex As Exception
    265. _AcLog.WriteAsError("Fehler bei der Basisberechnung - CalcPointWork" & Environment.NewLine & ex.ToString())
    266. Result = -1
    267. End Try
    268. Return Result
    269. End Function
    270. ''' <summary>
    271. ''' Protokoll der Basiswerte für die Kleinpunktberechnung
    272. ''' </summary>
    273. ''' <returns>false ... Fehler in den Daten / true ... alles OK</returns>
    274. Private Function Doku() As Boolean
    275. Dim Result As Boolean = True
    276. With _AcLog
    277. .Write("--- Kleinpunktberechnung ---")
    278. If _Rechts_A = _k_Invalid_Rechtswert Or _Hoch_A = _k_Invalid_Hochwert Then
    279. .WriteAsError("ANFANGSpunkt nicht korrekt definiert!")
    280. Result = False
    281. Else
    282. .Write2D("Anfang-Punkt", _Rechts_A, _Hoch_A)
    283. End If
    284. If _Rechts_E = _k_Invalid_Rechtswert Or _Hoch_E = _k_Invalid_Hochwert Then
    285. .WriteAsError("ENDpunkt nicht korrekt definiert!")
    286. Result = False
    287. Else
    288. .Write2D("End-Punkt", _Rechts_E, _Hoch_E)
    289. End If
    290. .WriteParameter("Anlegemass", _Anlegemass)
    291. .WriteParameter("Strecke", _IstStrecke)
    292. .WriteParameter("Faktor_o", _Faktor_o)
    293. .WriteParameter("Faktor_a", _Faktor_a)
    294. End With
    295. Return Result
    296. End Function
    297. ''' <summary>
    298. ''' klasssische 2D Kleinpunktberechnung für einen einfachen Punkt
    299. ''' </summary>
    300. ''' <param name="Anfangspunkt">Topobase-Punktobjekt</param>
    301. ''' <param name="Endpunkt">Topobase-Punktobjekt</param>
    302. ''' <param name="IstStrecke">für eine mögliche Streckenverteilung, kleiner 0, dann wird diese ignoriert</param>
    303. ''' <returns></returns>
    304. Public Function KlassischSimple(ByVal Anfangspunkt As Autodesk.AutoCAD.Geometry.Point3d,
    305. ByVal Endpunkt As Autodesk.AutoCAD.Geometry.Point3d,
    306. ByVal IstStrecke As Double,
    307. ByVal Abzisse As Double,
    308. ByVal Ordinate As Double) As Autodesk.AutoCAD.Geometry.Point3d
    309. 'Optional Höhe_N As Double = 0 - vorerst weggelassen
    310. _Rechts_A = Anfangspunkt.X
    311. _Hoch_A = Anfangspunkt.Y
    312. _Rechts_E = Endpunkt.X
    313. _Hoch_E = Endpunkt.Y
    314. AnlegemassReset()
    315. If IstStrecke = -1 Then ' kleine Verteilung
    316. _Verteilungsfaktor = 1
    317. Else
    318. CalcVerteilung(IstStrecke)
    319. End If
    320. CalcPointWork(Abzisse, Ordinate) ' druchführen der Berechnung
    321. Return NeuPoint3D
    322. End Function
    323. 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

    jan99 schrieb:

    Dann kommen ja immer die eigentlichen Berechnung. Hier ist ja immer zu gewährleisten, dass auch alle Grundparameter definiert sind.
    Baut man vor der eigentlichen Berechnung eine Methode (?) ein um zu prüfen, ob alles ok ist (Success)?
    Ja, kann man machen.
    Das heisst aber nicht Success, sondern Validierung, also Private Function IsInputValid() as Boolean oder sowas.

    An deiner Klasse gefällt mir nicht, dass da lauter WriteOnly-Properties rumfahren, deren Setzungen aber eiglich garnet benutzt werden.
    Zumindest in KlassischSimple() überschreibste fröhlich, was zuvor evtl. jemand als AnfangPunktAsLinePoint eingegeben hat.
    Dann lass die Properties lieber weg.