Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  CATIA V5 Programmierung
  Grafikpoblem mir UserForm

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:  Grafikpoblem mir UserForm (2285 mal gelesen)
roccat
Mitglied
Konstrukteur


Sehen Sie sich das Profil von roccat an!   Senden Sie eine Private Message an roccat  Schreiben Sie einen Gästebucheintrag für roccat

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 Explicit

Private 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


Sehen Sie sich das Profil von HoBLila an!   Senden Sie eine Private Message an HoBLila  Schreiben Sie einen Gästebucheintrag für HoBLila

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für roccat 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von bgrittmann an!   Senden Sie eine Private Message an bgrittmann  Schreiben Sie einen Gästebucheintrag für bgrittmann

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 05. Jun. 2013 20:18    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für roccat 10 Unities + Antwort hilfreich

Servus
Nur so eine Idee:
Vielleicht wäre das ganze schneller wenn man die DirectDraw-Funktionen (siehe zb hier) von DirectX nutzt.

Gruß
Bernd

------------------
Warum einfach, wenn es auch kompliziert geht.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

roccat
Mitglied
Konstrukteur


Sehen Sie sich das Profil von roccat an!   Senden Sie eine Private Message an roccat  Schreiben Sie einen Gästebucheintrag für roccat

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von roccat an!   Senden Sie eine Private Message an roccat  Schreiben Sie einen Gästebucheintrag für roccat

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


CAD.png

 
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


Sehen Sie sich das Profil von bgrittmann an!   Senden Sie eine Private Message an bgrittmann  Schreiben Sie einen Gästebucheintrag für bgrittmann

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 07. Jun. 2013 12:17    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für roccat 10 Unities + Antwort hilfreich

Servus
je nach Brower (HTML 5 fähig) kannst du auch direkt das svg in die html (bzw xhtml) einbauen: siehe zB hier und hier.
Eine weiter Möglichkeit im Browser wäre Canvas mit JavaScript.

Gruß
Bernd

------------------
Warum einfach, wenn es auch kompliziert geht.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

roccat
Mitglied
Konstrukteur


Sehen Sie sich das Profil von roccat an!   Senden Sie eine Private Message an roccat  Schreiben Sie einen Gästebucheintrag für roccat

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 Maschinen­technik in Stuttgart einen

BIM-Konstrukteur / CAD-Administrator (m/w/d)


  • Weiterentwicklung, ...
Anzeige ansehenMaschinenbau
HoBLila
Mitglied
Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx


Sehen Sie sich das Profil von HoBLila an!   Senden Sie eine Private Message an HoBLila  Schreiben Sie einen Gästebucheintrag für HoBLila

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für roccat 10 Unities + Antwort hilfreich

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 >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz