CAD Zoomfunktion

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    CAD Zoomfunktion

    Guten Tag,

    möchte gern auf einer Form eine oder mehrere einfache oder Komplexe Formen zeichnen. Dafür hätte ich gerne eine Zoom-Funktion mit dem Mausscroller aller CAD.

    So wie ich das sehe ist der ZoomPunkt immer bei TranslateTransform und die Formen müssen dazu verschoben werden.

    Hier mein TestProg.

    Mir fehlt der richtige Ansatz. Was mach ich falsch?

    Vielen Dank

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Public Class Form1
    3. Dim ScaleF As Single = 1
    4. Dim mpy As Integer = 0
    5. Dim mpx As Integer = 0
    6. Dim Path As New System.Drawing.Drawing2D.GraphicsPath()
    7. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    8. Dim Pen As New Pen(Color.Black, 2)
    9. e.Graphics.ScaleTransform(ScaleF, ScaleF, MatrixOrder.Append)
    10. e.Graphics.TranslateTransform(200 + mpx, 200 + mpy)
    11. Path.AddRectangle(New Rectangle((50 - mpx) * ScaleF, (50 - mpy) * ScaleF, 200 * ScaleF, 200 * ScaleF))
    12. e.Graphics.DrawPath(Pen, Path)
    13. Path.Reset()
    14. End Sub
    15. Private Sub Form2_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    16. mpx = e.X
    17. mpy = e.Y
    18. ' Labels nur zur Visualisierung der Werte
    19. Label1.Text = mpx
    20. Label2.Text = mpy
    21. Label3.Text = ScaleF
    22. End Sub
    23. Private Sub Form2_MouseWheel(sender As Object, e As MouseEventArgs) Handles Me.MouseWheel
    24. If e.Delta > 0 Then
    25. ScaleF = ScaleF + 0.1
    26. ElseIf e.Delta < 0 Then
    27. ScaleF = ScaleF - 0.1
    28. If ScaleF < 0 Or ScaleF = 0 Then
    29. ScaleF = 0.1
    30. GoTo Sprung1
    31. End If
    32. End If
    33. Sprung1:
    34. Me.Invalidate()
    35. End Sub
    36. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    37. ' Zoomn auf Ursprung
    38. mpx = 0
    39. mpy = 0
    40. ScaleF = 1
    41. Me.Invalidate()
    42. End Sub
    43. End Class

    DragsTrail schrieb:

    Was mach ich falsch?
    Du progst nicht mit Option Strict On.
    Wo soll denn der Zoompunkt liegen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    DragsTrail schrieb:

    Mausposition
    Da musst Du Dir beim Rollen die mausposition merken und diese geeignet in TranslateTransform() einbauen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @DragsTrail So was (ungetestet):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Public Class Form1
    3. Dim ScaleF As Single = 1
    4. Dim mpy As Integer = 0
    5. Dim mpx As Integer = 0
    6. Dim Path As New System.Drawing.Drawing2D.GraphicsPath()
    7. Dim mousePoint As Point ' dies hier
    8. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    9. Dim Pen As New Pen(Color.Black, 2)
    10. e.Graphics.ScaleTransform(ScaleF, ScaleF, MatrixOrder.Append)
    11. 'e.Graphics.TranslateTransform(200 + mpx, 200 + mpy)
    12. e.Graphics.TranslateTransform(mousePoint.X, mousePoint.Y)
    13. Path.AddRectangle(New RectangleF((50 - mpx) * ScaleF, (50 - mpy) * ScaleF, 200 * ScaleF, 200 * ScaleF))
    14. e.Graphics.DrawPath(Pen, Path)
    15. Path.Reset()
    16. End Sub
    17. Private Sub Form2_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    18. mpx = e.X
    19. mpy = e.Y
    20. ' Labels nur zur Visualisierung der Werte
    21. 'Label1.Text = mpx
    22. 'Label2.Text = mpy
    23. 'Label3.Text = ScaleF
    24. End Sub
    25. Private Sub Form2_MouseWheel(sender As Object, e As MouseEventArgs) Handles Me.MouseWheel
    26. If e.Delta > 0 Then
    27. ScaleF = ScaleF + 0.1F
    28. ElseIf e.Delta < 0 Then
    29. ScaleF = ScaleF - 0.1F
    30. If ScaleF <= 0 Then
    31. ScaleF = 0.1
    32. End If
    33. End If
    34. mousePoint = e.Location
    35. Me.Invalidate()
    36. End Sub
    37. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    38. ' Zoomn auf Ursprung
    39. mpx = 0
    40. mpy = 0
    41. ScaleF = 1
    42. Me.Invalidate()
    43. End Sub
    44. End Class

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @'RodDanke für die Hilfe. Hat geklappt

    Brauch bitte noch eine Hilfestellung- :-))

    Möchte gerne im GraphicPath bestimmte Linien anklicken und die Farbe verändern, dass man sieht das die Linie angeklickt ist.

    Hier mal der TestCode

    VB.NET-Quellcode

    1. Private Sub Form2_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
    2. Dim cnt As Integer = Path.PointCount ' Punkte im GraphicPath "Path" zählen
    3. If Path.IsOutlineVisible(e.X, e.Y, meinePen) Then
    4. MsgBox("Treffer")
    5. Return
    6. End If
    7. 'For i = 0 To cnt - 1
    8. ' If Path(i).IsOutlineVisible(e.X, e.Y, Pen) = True Then
    9. ' MsgBox("Treffer")
    10. ' End If
    11. 'Next
    12. End Sub


    Die ausgeblendete FOR-Schleife läuft nicht weil Path(i) keine Standard-Eigenschaft hat??????????????

    Die Idee mit der FOR-Schleife:

    Path davor klonen, jede Zeile im Path abfragen ob an der Mausposition sichtbar ist:

    wenn ja drin lassen, wenn nicht aus Path entfernen. Am Ende bleiben nur die geklickten Linien drin die man mit einer anderen Pen über den bestehenden Path neu zeichnet.
    @DragsTrail Wahrscheinlich musst Du die einzelnen Bestandteile Deines Graphicspaths einzeln testen, wenn Du eine Linie haben willst.
    Du solltest also eine List(Of Graphicspath) oder so vorhalten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Genau das hab ich gemacht. Siehe TestCode.

    Das Problem ist: Beim MausDown in For Each ist das Shape nicht eine aktuelle Zeile sondern der ganze Path wird im tempPath reinkopiert.

    Deswegen wollte ich mit FOR i, funkt aber nicht wegen fehlender Standard-Eigenschaft? Was soll das eigentlich bedeuten?

    Vielleicht anders abfragen?

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Drawing.Drawing2D
    3. Public Class Form1
    4. Private MyPaths As New List(Of Drawing2D.GraphicsPath)
    5. Dim myPath As New Drawing2D.GraphicsPath()
    6. Private tempPaths As New List(Of Drawing2D.GraphicsPath)
    7. Private MyPen As New Pen(Color.Black, 4)
    8. Private MyPen2 As New Pen(Color.Red, 4)
    9. Dim mark As Boolean = False
    10. Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
    11. Dim Gr As Graphics = Me.CreateGraphics
    12. tempPaths.Clear()
    13. For Each shape As Drawing2D.GraphicsPath In MyPaths
    14. If shape.IsOutlineVisible(e.X, e.Y, MyPen, Gr) = True Then
    15. tempPaths.Add(shape)
    16. mark = True
    17. Me.Invalidate()
    18. End If
    19. Next
    20. End Sub
    21. Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    22. If mark = False Then
    23. myPath.StartFigure()
    24. myPath.AddLine(0, 0, 100, 100)
    25. MyPaths.Add(myPath)
    26. myPath.StartFigure()
    27. myPath.AddLine(100, 0, 200, 100)
    28. MyPaths.Add(myPath)
    29. myPath.StartFigure()
    30. myPath.AddLine(200, 0, 300, 100)
    31. MyPaths.Add(myPath)
    32. For Each shape As Drawing2D.GraphicsPath In MyPaths
    33. e.Graphics.DrawPath(MyPen, shape)
    34. Next
    35. Else
    36. For Each shape As Drawing2D.GraphicsPath In tempPaths
    37. e.Graphics.DrawPath(MyPen2, shape)
    38. Next
    39. mark = False
    40. End If
    41. End Sub
    42. End Class

    DragsTrail schrieb:

    funkt aber nicht wegen fehlender Standard-Eigenschaft
    Was wäre denn die Standard-Eigenschaft?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @DragsTrail Was soll denn passieren?
    =======
    Teste mal mit 2 zusätzlichen Labels dies:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    2. If mark = False Then
    3. For Each shape As Drawing2D.GraphicsPath In MyPaths
    4. e.Graphics.DrawPath(MyPen, shape)
    5. Next
    6. Else
    7. For Each shape As Drawing2D.GraphicsPath In tempPaths
    8. e.Graphics.DrawPath(MyPen2, shape)
    9. Next
    10. mark = False
    11. End If
    12. Label1.Text = MyPaths.Count.ToString
    13. Label2.Text = tempPaths.Count.ToString
    14. End Sub
    15. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    16. myPath.StartFigure()
    17. myPath.AddLine(0, 0, 100, 100)
    18. MyPaths.Add(myPath)
    19. myPath.StartFigure()
    20. myPath.AddLine(100, 0, 200, 100)
    21. MyPaths.Add(myPath)
    22. myPath.StartFigure()
    23. myPath.AddLine(200, 0, 300, 100)
    24. MyPaths.Add(myPath)
    25. myPath.CloseFigure()
    26. End Sub

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    DragsTrail schrieb:

    nur die Linien
    Alle Einzellinien befinden sich in myPath.
    Dort sollten sich 3 GraphicsPaths befinden.
    Teste dies:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim myPath1 As New Drawing2D.GraphicsPath()
    3. Dim myPath2 As New Drawing2D.GraphicsPath()
    4. Dim myPath3 As New Drawing2D.GraphicsPath()
    5. myPath1.StartFigure()
    6. myPath1.AddLine(0, 0, 100, 100)
    7. MyPaths.Add(myPath1)
    8. myPath1.CloseFigure()
    9. myPath2.StartFigure()
    10. myPath2.AddLine(100, 0, 200, 100)
    11. MyPaths.Add(myPath2)
    12. myPath2.CloseFigure()
    13. myPath3.StartFigure()
    14. myPath3.AddLine(200, 0, 300, 100)
    15. MyPaths.Add(myPath3)
    16. myPath3.CloseFigure()
    17. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Das hab ich schon mal probiert. Es Funkt 100%ig.

    Wenn ich eine komplexe DXF reinlade kann es durch aus sein das man so eben über 2000 Objekte hat, also brauche ich genau so viele Paths.

    Man müsste bei der Deklaration des Paths den Namen als String nehmen und jedes mal +1 dazu zählen. Das funkt aber nicht.

    So hätte ich es mir vorgestellt. Ist ein Blödsinn weil es nicht geht. Da gibts sicher einer andere Möglichkeit????

    VB.NET-Quellcode

    1. Dim str As String = "MyPath"
    2. Dim str2 As String
    3. For i = 0 To 10
    4. str2 = str & i
    5. str = New GraphicsPath
    6. Next

    DragsTrail schrieb:

    eine komplexe DXF
    Jetzt fang mal an und beschreibe das vollständige Problem.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    DXF ist ein 3D-Gittermodell, meist aber nur als 2D verwendet. Es ist eine Klartextdatei. Total simpel auszulesen.

    Mit komplex meine ich eigentlich viele Komponenten. Also LIne, Circle, Arc, Polyline, Spline,..... etc.

    Ablauf bis jetzt:

    1. DXF mit OpebFileD öffnen und in List of String einlesen
    2. Mit FOR Loop die Punkte auslesen und in 2 List of String übergeben
    3. Noch mal FOR und alles Sortieren nach LINE, ARC, ....
    4. Im Paint_Event die 2te list Of String mit FOR auslesen und Objekt für Objekt in GrapfikPath Adden, also AddLine, AddArc...... etc.
    5. GrafikPath zeichnen

    Funktioniert Perfekt und extrem schnell finde ich. Für eine DXF mit 55000Zeilen braucht das Programm von Klick Öffnen bis zur vollständigen Darstellung im Pain_Event keine Sekunde.
    Hab die wildesten Sachen gezeichnet und es wird alles richtig geladen und dar gestellt.
    Zoomfunktionen sind auch alle fertig.

    Jetzt das Klicken von Objekten ( Linien, Arc, Ellipse,...):

    Hintergrund: Ich will aus einer bestimmten Kontur ein Bearbeitungsprogramm für eine CNC_Maschine erstellen. Dafür möchte ich meine Kontur mit der Maus oder mit einem Mausrechteck markieren, die Farbe ändern damit man optisch sieht was ausgewählt ist und die Punkte auslesen damit ich diese für den PostProzessor weiterverwenden kann.

    Es missen also mehrere Objekte markiert werden. Das ist die Aufgabenstellung und eine große Baustelle. Der Rest sollte selbst zu schaffen sein.

    Jetzt noch mal zurück zu der List of GraphicPath:

    Es kann ja sein das die DXF z.B. 500 Linien, 250 Arc, 60 Circle und 20 Splines hat.
    Wir wissen ja das das Anklicken mit der List of GraphicsPath funkt. für das Beispiel brauch ich also 830 Paths.

    Also die Anzahl der Objekte = die Anzahl der GraphicPats

    Ich kann die ja nicht von Hand rein schreiben.

    Wenn das generell der richtige Ansatz ist, ist die Frage wie bringt man das in einer Logik unter?
    @DragsTrail In der Einleseroutine identifizierst Du die entsprechende Kontur und rufst eine korrespondierende Routine auf, die lokal einen entsprechenden GraphicsPath generiert und in der zentralen Liste ablegt, etwa so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Me.AddLine(0, 0, 100, 100)
    3. Me.AddLine(100, 0, 200, 100)
    4. Me.AddLine(200, 0, 300, 100)
    5. End Sub
    6. Sub AddLine(x1 As Integer, y1 As Integer, x2 As Integer, y2 As Integer)
    7. Dim myPath1 As New Drawing2D.GraphicsPath()
    8. myPath1.StartFigure()
    9. myPath1.AddLine(x1, y1, x2, y2)
    10. Me.MyPaths.Add(myPath1)
    11. myPath1.CloseFigure()
    12. End Sub
    Das Markieren mehrerer Objekte kannst Du bei MouseDown steuern, indem Du die Ctrl-Taste abfragst:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices

    VB.NET-Quellcode

    1. Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
    2. Dim Gr As Graphics = Nothing
    3. Dim ctrl = ((GetAsyncKeyState(Keys.LControlKey) And &H8000) <> 0)
    4. If Not ctrl Then
    5. tempPaths.Clear()
    6. End If
    7. For Each shape As Drawing2D.GraphicsPath In MyPaths
    8. If shape.IsOutlineVisible(e.X, e.Y, MyPen, Gr) = True Then
    9. tempPaths.Add(shape)
    10. mark = True
    11. Me.Invalidate()
    12. End If
    13. Next
    14. End Sub

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @Rod Bin erst heute dazu gekommen. Also das funkt ja Perfekt. Vielen Dank.

    Jetzt hat sich ein Problem aufgetan. Wenn ich die Objekte vergrößere sind diese nicht mehr anzuklicken. Sie werden quasi nicht mit vergrößert im Hintergrund.
    Die einzige Lösung auf die ich gekommen bin ist die Objekte selber zu skalieren bevor sie im Path eingefügt werden.

    Glaubst du das es eine elegantere Lösung gibt??

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Imports System.Runtime.InteropServices
    3. Public Class Form1
    4. Private Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Long) As Long
    5. Private tempPaths As New List(Of Drawing2D.GraphicsPath)
    6. Private MyPaths As New List(Of Drawing2D.GraphicsPath)
    7. Dim myPath As New Drawing2D.GraphicsPath
    8. Private MyPen As New Pen(Color.Black, 4)
    9. Private MyPen2 As New Pen(Color.Red, 4)
    10. Dim mark As Boolean = False
    11. Dim _Scale As Single = 1
    12. Dim _PanZeichnenZeroX As Single = 0
    13. Dim _PanZeichnenZeroY As Single = 0
    14. Dim isDrag As Boolean = False
    15. Dim theRectangle As New Rectangle(New Point(0, 0), New Size(0, 0))
    16. Dim startPoint As Point
    17. Dim Scalex As Single
    18. Dim Scaley As Single
    19. Dim MdownX As Single
    20. Dim MdownY As Single
    21. Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
    22. Dim MPoint As Point = CType(sender, Control).PointToScreen(New Point(e.X, e.Y))
    23. MdownX = e.X
    24. MdownY = e.Y
    25. If (e.Button = MouseButtons.Left) Then
    26. isDrag = True
    27. End If
    28. Dim control As Control = CType(sender, Control)
    29. startPoint = control.PointToScreen(New Point(e.X, e.Y))
    30. Dim ctrl = ((GetAsyncKeyState(Keys.LControlKey) And &H8000) <> 0)
    31. Dim Gr As Graphics = Nothing
    32. If Not ctrl Then
    33. tempPaths.Clear()
    34. Me.Invalidate()
    35. End If
    36. For Each shape As Drawing2D.GraphicsPath In MyPaths
    37. If shape.IsOutlineVisible(e.X, e.Y, MyPen, Gr) = True Then
    38. tempPaths.Add(shape)
    39. mark = True
    40. Me.Invalidate()
    41. End If
    42. Next
    43. End Sub
    44. Private Sub Form2_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove
    45. If (isDrag) Then
    46. ControlPaint.DrawReversibleFrame(theRectangle, Me.BackColor, _
    47. FrameStyle.Dashed)
    48. Dim endPoint As Point = CType(sender, Control).PointToScreen(New Point(e.X, e.Y))
    49. Dim width As Integer = endPoint.X - startPoint.X
    50. Dim height As Integer = endPoint.Y - startPoint.Y
    51. theRectangle = New Rectangle(startPoint.X, startPoint.Y, width, height)
    52. ControlPaint.DrawReversibleFrame(theRectangle, Me.BackColor, FrameStyle.Dashed)
    53. End If
    54. End Sub
    55. Private Sub Form2_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp
    56. If MdownX = e.X Or MdownY = e.Y Then
    57. isDrag = False
    58. Return
    59. End If
    60. isDrag = False
    61. ControlPaint.DrawReversibleFrame(theRectangle, Me.BackColor, FrameStyle.Dashed)
    62. Dim i As Integer
    63. Dim controlRectangle As Rectangle
    64. For i = 0 To Controls.Count - 1
    65. controlRectangle = Controls(i).RectangleToScreen _
    66. (Controls(i).ClientRectangle)
    67. If controlRectangle.IntersectsWith(theRectangle) Then
    68. Controls(i).BackColor = Color.BurlyWood
    69. End If
    70. Next
    71. '' Zoom
    72. Dim tempsx As Single = (e.X - MdownX)
    73. If tempsx < 0 Then
    74. tempsx = tempsx * (-1)
    75. tempsx = Me.Width / tempsx
    76. Else
    77. tempsx = Me.Width / tempsx
    78. End If
    79. Dim tempsy As Single = (MdownY - e.Y)
    80. If tempsy < 0 Then
    81. tempsy = tempsy * (-1)
    82. tempsy = Me.Height / tempsy
    83. Else
    84. tempsy = Me.Height / tempsy
    85. End If
    86. Scalex = CSng(((e.X + MdownX) / 2) / _Scale) - _PanZeichnenZeroX
    87. Scaley = (CSng(((e.Y + MdownY) / 2) / _Scale) - _PanZeichnenZeroY)
    88. If tempsx > tempsy Then
    89. _Scale += tempsy
    90. Else
    91. _Scale += tempsx
    92. End If
    93. _PanZeichnenZeroX += ((((Scalex / _Scale - _PanZeichnenZeroX))) - (Scalex))
    94. _PanZeichnenZeroY += ((((Scaley / (_Scale) - _PanZeichnenZeroY))) - (Scaley))
    95. Me.Invalidate()
    96. theRectangle = New Rectangle(0, 0, 0, 0)
    97. End Sub
    98. Private Sub _MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel
    99. Dim _Step As Single = CSng((e.Delta / SystemInformation.MouseWheelScrollDelta)) / 5
    100. Scalex = e.X / _Scale - _PanZeichnenZeroX
    101. Scaley = e.Y / _Scale - _PanZeichnenZeroY
    102. _Scale += _Step
    103. Select Case _Scale
    104. Case Is < 0.1
    105. _Scale = 0.1
    106. Case Is > 100
    107. _Scale = 100
    108. Case Else
    109. _PanZeichnenZeroX += (e.X / _Scale - _PanZeichnenZeroX) - Scalex
    110. _PanZeichnenZeroY += (e.Y / _Scale - _PanZeichnenZeroY) - Scaley
    111. End Select
    112. Label1.Text = CStr(_PanZeichnenZeroX)
    113. Label2.Text = CStr(_PanZeichnenZeroY)
    114. drawDXF()
    115. Me.Invalidate()
    116. End Sub
    117. Sub AddLine(x1 As Single, y1 As Single, x2 As Single, y2 As Single)
    118. Dim myPath1 As New Drawing2D.GraphicsPath()
    119. myPath1.StartFigure()
    120. myPath1.AddLine(x1, y1, x2, y2)
    121. Me.MyPaths.Add(myPath1)
    122. End Sub
    123. Sub AddArc(x1 As Single, y1 As Single, x2 As Single, y2 As Single, wins As Single, wine As Single)
    124. Dim myPath1 As New Drawing2D.GraphicsPath()
    125. myPath1.StartFigure()
    126. myPath1.AddArc(x1, y1, x2, y2, wins, wine)
    127. Me.MyPaths.Add(myPath1)
    128. End Sub
    129. Sub AddEllipse(x1 As Single, y1 As Single, x2 As Single, y2 As Single)
    130. Dim myPath1 As New Drawing2D.GraphicsPath()
    131. myPath1.StartFigure()
    132. myPath1.AddEllipse(x1, y1, x2, y2)
    133. Me.MyPaths.Add(myPath1)
    134. End Sub
    135. Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    136. e.Graphics.TranslateTransform(_PanZeichnenZeroX, _PanZeichnenZeroY)
    137. e.Graphics.ScaleTransform(_Scale, _Scale, MatrixOrder.Append)
    138. If mark = False Then
    139. For Each shape As Drawing2D.GraphicsPath In MyPaths
    140. e.Graphics.DrawPath(MyPen, shape)
    141. Next
    142. Else
    143. For Each shape As Drawing2D.GraphicsPath In MyPaths
    144. e.Graphics.DrawPath(MyPen, shape)
    145. Next
    146. For Each shape As Drawing2D.GraphicsPath In tempPaths
    147. e.Graphics.DrawPath(MyPen2, shape)
    148. Next
    149. End If
    150. mark = False
    151. End Sub
    152. Sub drawDXF()
    153. MyPaths.Clear()
    154. Me.AddLine(100, 100, 200, 200)
    155. Me.AddLine(100, 0, 200, 100)
    156. Me.AddLine(200, 0, 300, 100)
    157. Me.AddLine(200, 200, 400, 400)
    158. Me.AddArc(200, 200, 150, 150, 0, 270)
    159. Me.AddEllipse(250, 300, 200, 100)
    160. Me.AddEllipse(-100, -100, 200, 200)
    161. End Sub
    162. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    163. drawDXF()
    164. End Sub
    165. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    166. MyPaths.Clear()
    167. _Scale = 1
    168. _PanZeichnenZeroX = 0
    169. _PanZeichnenZeroY = 0
    170. drawDXF()
    171. Me.Invalidate()
    172. End Sub
    173. End Class