Autor
|
Thema: Grafikpoblem mir UserForm (2285 mal gelesen)
|
roccat Mitglied Konstrukteur
Beiträge: 172 Registriert: 19.02.2010 WinXP/Win7 Office XP/2007 Catia V5 R16-R19, VB6.0, VBA, BASCOM-AVR VB .Net 2010
|
erstellt am: 04. Jun. 2013 09:47 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich erstelle auf einer UserForm ein Abbild einer Geometrie die ich aus einem Sketch auslese. Soweit funktioniert das auch. Wird die Geometrie komplizierter, wird das Abbild auf der Userform nicht mehr korrekt gezeichnet oder die Grafik von Catia bricht zusammen so das Catia neu gestartet werden muß. Es müssen teilweise mehrere tausend Elements gezeichnet werden. Das Programm liest die Gemetrie und generiert einen passenden G-Code und das Abbild dient zur Voransicht. Bei Geometrie aus Text kommen da schnell einmal mehrere tausende Elemente zusammen. (siehe Bild) Ich habe Versucht mit dem DrawingBuffer der Userform etwas zu bewirken. Leider vergebens. Anbei mal die Funktionen wie ich die Linien und Kreise erzeuge. Evtl. hat jemand eine Idee wie Ich das Problem mit der Grafik beheben kann. Code:
Option ExplicitPrivate Declare Function AngleArc Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal dwRadius As Long, ByVal eStartAngle As Single, ByVal eSweepAngle As Single) As Long Private Declare Function GetArcDirection Lib "gdi32" (ByVal hdc As Long) As Long Private Declare Function SetArcDirection Lib "gdi32" (ByVal hdc As Long, ByVal ArcDirection As Long) As Long Private Declare Function ArcTo Lib "gdi32.dll" (ByVal hdc As Long, ByVal nLeftRect As Long, ByVal nTopRect As Long, ByVal nRightRect As Long, ByVal nBottomRect As Long, ByVal nXRadial1 As Long, ByVal nYRadial1 As Long, ByVal nXRadial2 As Long, ByVal nYRadial2 As Long) As Long ' Get- / SetArcDirection Rückgabe-/ArcDirection-Konstanten Private Const AD_CLOCKWISE = 2 ' mit dem Uhrzeigersinn Private Const AD_COUNTERCLOCKWISE = 1 ' gegen den Uhrzeigersinn
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long Private Declare Function LineTo Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long Private Declare Function MoveToEx Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As POINTAPI) As Long Private Type POINTAPI x As Long y As Long End Type Private Const BLACK_BRUSH = 4 Private Const BLACK_PEN = 7 Private Const PS_SOLID = 0 Function CreateLine(Xs As Long, Ys As Long, Xe As Long, Ye As Long, iThick As Integer, iColor As Long) Dim hdc As Long, hpen As Long, hbrush As Long, r As Long, S As Double, hwnd As Long Dim PT As POINTAPI hwnd = FindWindow("ThunderDFrame", FrMain.Caption) hdc = GetDC(hwnd) hpen = CreatePen(PS_SOLID, iThick, iColor) ' schwarze Linie SelectObject hdc, hpen hbrush = CreateSolidBrush(iColor) ' rote Füllung SelectObject hdc, hbrush MoveToEx hdc, Xs, Ys, PT LineTo hdc, Xe, Ye ReleaseDC hwnd, hdc End Function Function CreateCircle(X1 As Long, Y1 As Long, X2 As Long, Y2 As Long, Xs As Long, Ys As Long, Xe As Long, Ye As Long, iThick As Integer, iColor As Long, bClock As Boolean) Dim hdc As Long, hpen As Long, hbrush As Long, r As Long, S As Double, hwnd As Long, Retval As Long, PT As POINTAPI hwnd = FindWindow("ThunderDFrame", FrMain.Caption) hdc = GetDC(hwnd) 'hpen = CreatePen(PS_SOLID, iThick, RGB(0, 0, 0)) ' schwarze Linie hpen = CreatePen(PS_SOLID, iThick, iColor) ' schwarze Linie SelectObject hdc, hpen hbrush = CreateSolidBrush(iColor) ' rote Füllung SelectObject hdc, hbrush MoveToEx hdc, Xs, Ys, PT ' Richtung zum Zeichnen des Bogens ändern If bClock = False Then Retval = SetArcDirection(hdc, AD_CLOCKWISE) Retval = ArcTo(hdc, X1, Y1, X2, Y2, Xs, Ys, Xe, Ye) Else Retval = SetArcDirection(hdc, AD_COUNTERCLOCKWISE) Retval = ArcTo(hdc, X1, Y1, X2, Y2, Xs, Ys, Xe, Ye) End If ReleaseDC hwnd, hdc End Function
tausend Dank mfG Mario Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 05. Jun. 2013 13:27 <-- editieren / zitieren --> Unities abgeben: Nur für roccat
Krasses Projekt! Ich glaub Deine Funktion ist nicht ganz so effizient für die Datenmenge. Es wird jedes Mal das Zeichengerät neu erzeugt und dann gezeichnet, auch wenn es nur ein Punkt ist. Man kann es vielleicht so gestalten, dass alles in einem Abwasch erzeugt wird und so das Ansprechen, dass man jedes Mal zeichnen möchte, auf einmal verkürzt wird. Ist ja wie in Excel, das Befüllen jeder Zelle einzeln kostet deutlich mehr Zeit, als ein Array für eine Tabelle zu übergeben, da jedes Mal die API neu angesprochen werden muss. Eventuell wäre es auch besser hier eine andere Grafik zu erzeugen (z.B. SVG) und als Bild wiederum einzubinden. So muss die Grafik auch nur einmal angesteuert werden um das Endbild zu zeigen. Nur ein paar Ideen, hat keine wissenschaftliche Grundlage. :-) ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 05. Jun. 2013 20:18 <-- editieren / zitieren --> Unities abgeben: Nur für roccat
|
roccat Mitglied Konstrukteur
Beiträge: 172 Registriert: 19.02.2010 WinXP/Win7 Office XP/2007 Catia V5 R16-R19, VB6.0, VBA, BASCOM-AVR VB .Net 2010
|
erstellt am: 06. Jun. 2013 06:40 <-- editieren / zitieren --> Unities abgeben:
Hallo Henry, Hallo Bernd, und wieder mal vielen Dank für Eure Antworten. @Henry, ich habe mal Code: hwnd = FindWindow("ThunderDFrame", FrMain.Caption) hdc = GetDC(hwnd)
und Code: ReleaseDC hwnd, hdc
aus der Schleife genommen. Und die Strichstärke etwas verringert (weniger Pixel). Hat Leider auch nichts gebracht. Die Zeichengeschwindigkeit ist i.O., die Graphik schafft es eben nicht. Zum Thema SVG. Ich schau mir das mal an. Ich denke das würde wohl in einen integrierten Webbrowser gut laufen. Probleme sehe ich bei der Geschwindigkeit. Wie auf dem oben gelinkten Bild zu sehen, wird die selektierte Kontur und Elemente in der Vorschau farblich hervorgehoben. Bei jedem neu selektierten Element muss die SVG-datei neu geschrieben und in den Webbrowser geladen werden. Ich vermute dass das etwas dauert und im Webbrowser flackert. @Bernd, DirectDraw wäre wohl die beste Variante aber lässt sich das in VBA integrieren? Ich dachte das bekommt man nur in VB implementiert. Ich hätte wohl gleich in VB.net schreiben sollen. Aktuell habe ich die Vorschau, für Projekte mit viel Geometrie, deaktiviert. Die Vorschau ist zur Kontrolle ziemlich wichtig, um zu sehen welche Konturen der Reihe nach bearbeitet werden. Ich sehe das zwar auch in der CNC-Simulation, bei Fehlern fange ich dann aber wieder ganz vorne an.
Vielen Dank Euch beiden, ich schau mir SVG und DirectDraw nochmal genauer an. mfG Mario Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
roccat Mitglied Konstrukteur
Beiträge: 172 Registriert: 19.02.2010 WinXP/Win7 Office XP/2007 Catia V5 R16-R19, VB6.0, VBA, BASCOM-AVR VB .Net 2010
|
erstellt am: 07. Jun. 2013 10:34 <-- editieren / zitieren --> Unities abgeben:
Grüße, So ich habe mal die ganze Zeichnerei auf SVG umgebaut. Jetzt macht er auch mehrere tausend Elemente (siehe Anhang). Ist zwar etwas grober als die API aber damit kann ich leben. Für das Bsp. im Anhang, mit über 11000 Elementen, braucht er ca. 1sec. für die Aktualisierung. Es könnte noch schneller gehen wenn ich es hinbekomme, den SVG Quelltext direkt an den Webbrowser zu übergeben. Mit HTML-Code funktioniert das so: Code:
WebBrowser1.Navigate "about:blank" DoEvents Dim sHTML As String sHTML = "..." WebBrowser1.Document.Body.innerHTML = sHTML
Will aber bei SVG-Quellcode nicht funktionieren da der HEADER schon als HTML definiert ist und somit kein SVG erkannt wird. Momentan schreibe ich erst eine "dummy.svg" die ich dann in den Browser lade. Hat dazu jemand noch eine Idee, wie ich direkt den SVG-Quelltext in den Webbrowser laden kann? Das Thema DirectDraw musste ich leider verwerfen, da auf mehreren Rechnern keine/oder unterschiedliche DirectX Versionen installiert sind. Das war mir dann zu viel Aufwand. Denke aber dass es damit auch funktioniert hätte. tausend Dank mfG Mario
------------------ Wenn das die Lösung sein soll, will ich mein Problem zurück !! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 07. Jun. 2013 12:17 <-- editieren / zitieren --> Unities abgeben: Nur für roccat
|
roccat Mitglied Konstrukteur
Beiträge: 172 Registriert: 19.02.2010 WinXP/Win7 Office XP/2007 Catia V5 R16-R19, VB6.0, VBA, BASCOM-AVR VB .Net 2010
|
erstellt am: 07. Jun. 2013 12:40 <-- editieren / zitieren --> Unities abgeben:
Danke Bernd, das eingebundene SVG im HTML ist mir auch schon über den Weg gelaufen. Das werde ich als nächstes mal versuchen. Javascript wäre auch eine Option, ich optimiere erstmal das SVG weiter da es in den VBA Webbrowser-Control schon mal läuft. mfG Mario ------------------ Wenn das die Lösung sein soll, will ich mein Problem zurück !! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| BIM-Konstrukteur / CAD-Administrator (m/w/d) | Wasser ist lebenswichtig. Seit über 60 Jahren sorgen wir dafür, dass vier Millionen Menschen in Baden-Württemberg bestes Trinkwasser bekommen. Tag für Tag. Rund um die Uhr. Wir suchen für unser Team der Abteilung Elektro- und Maschinentechnik in Stuttgart einen BIM-Konstrukteur / CAD-Administrator (m/w/d)
| Anzeige ansehen | Maschinenbau |
|
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 07. Jun. 2013 16:02 <-- editieren / zitieren --> Unities abgeben: Nur für roccat
Hallo Mario, wie gesagt, witziges Projekt und auch interessante Lösung! Man merkt aber wenigstens auch, dass man mit Dir auch mal unkonventionelle Wege gehen kann um in's Ziel zu gelangen! :-) Bernd hat Dir schon die richtigen Links geschickt. Das mit SVG war auch nur ein Beispiel, da mir das Format, nativ, sehr gut gefällt, sich nur leider nie richtig durchgesetzt hat. Mir gefällt es, da ich den Browser als Viewer verwenden kann und es schön als plain text runterschreiben und weiterverabreiten kann. Zudem ist es skalierbar und ich kann auch mal schnell ne Farbe wechseln oder so. Mit HTML5 kann man auch zeichnen und Canvas sowieso. Beides auch sehr gut und performant. Das Beispiel ist auch sehr gut gewählt! :-D ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|