|
Afficher un DXF en utilisant GDI+ et DotNet |
|
Anonyme
|
Bonjour souhaite afficher un DXF dans un champ image sous Windev 10. J'ai commencé par décortiquer le fichier en lui même et retirer les informations de lignes, arcs ... J'en suis au stade de l'affichage, mes premiers essais avec les fonctions de dessin standard Windev ne sont pas très concluent: Pas de gestion de cotes réelles, problèmes d'arrondi. Je me suis donc orienter vers l'objet Graphics de l'assemblage DotNet System.drawing, qui me permet d'utiliser des fonctions très intéressantes comme des traçages de lignes avec en paramètres des réels ou simplement l'antialiasing. Grâce à la fonction Graphics::FromHwnd(Handle(MonImage)) je peux dessiner sur mon champ image, quelques problèmes se soulèvent désormais. Mon dessin s'efface quand la fenêtre perd le focus et j'aimerais utiliser quand même les fonctions windev d'enregistrement dSauveImage... J'aimerai avoir vos avis sur le sujet et si vous aviez des solutions pour résoudre cette problématique.
Contribution le : 10/04/2006 10:10
|
|
|
Re: Afficher un DXF en utilisant GDI+ et DotNet |
|
|
Il n'y a pas de fonctions natives dans GDIPLUS pour lire directement le format AUTOCAD. Néanmoins si vous cherchez un composant graphique capable d'utiliser toutes les commandes GDI+ avec WinDev, je vous invite a tester GDImage, vous le trouverez ici : Lien vers démos GDI+ WinDev avec GDImage
Contribution le : 10/04/2006 10:24
|
|
|
Re: Afficher un DXF en utilisant GDI+ et DotNet |
|
Anonyme
|
Je vais essayer l'exemple tout de suite, merci
Contribution le : 10/04/2006 11:16
|
|
|
Re: Afficher un DXF en utilisant GDI+ et DotNet |
|
Anonyme
|
On peut réaliser beaucoup de choses avec cette DLL, mais je pense que je n'en ai pas besoin, j'ai déjà beaucoup de fonctionnalités avec les assemblages DotNet. il me reste juste le rafraichissement et lier le dessin afficher dans mon champ image avec les fonctions dsauveimage de windev, en effet quand je sauve l'image elle ressort toute blanche. Je ne sais pas vraiment pourquoi, peut etre le device context ou ...
Contribution le : 10/04/2006 12:22
|
|
|
Re: Afficher un DXF en utilisant GDI+ et DotNet |
|
|
GDImage utilise la "FLAT API" de GDIPLUS qui est NETtement plus rapide que les assemblages DOT.NET
et surtout çà marche, même avec des machines sur lesquelles les 20 Mo du runtime DOT.NET n'est pas installé.
>>quand je sauve l'image elle ressort toute blanche Je vous conseille d'utiliser l'API GdipCreateFromHDC et d'utiliser les fonctions GDIPLUS pour enregistrer l'image.
Contribution le : 10/04/2006 13:37
|
|
|
Re: Afficher un DXF en utilisant GDI+ et DotNet |
|
Stagiaire WDF
Inscrit: 27/12/2004 12:14
Post(s): 38
|
J'ai voulu tester GDIPlus directement dans Windev en appellant directement la FlatAPI les fonctions repondent bien mais il se s'affiche rien dans la fenêtre Windev (champ Image,HDC de l'écran, HDC de la fenêtre).
J'ai tout essayé mais rien de rien et pourtant j'ai bien un token valide
voici les bouts de code qui ont l'air correct (car le même code fonctionne en VB)
PROCEDURE Constructeur(HDC=Null,Ver=1)
:Hlib = ChargeDLL("gdiplus.dll")
:GDIPlusStartUp(Ver) :GdiCreateFromHDC(HDC)
PROCEDURE GDIPlusStartUp(Version)
h est un entier s est un Variant = Null
Token est un entier Status est un entier gdiplusstartout est un Variant
:Version = Version
:GdiIN:GdiplusVersion = :Version :GdiIN:DebugEventCallback = Null :GdiIN:SuppressBackgroundThread = 0 :GdiIN:SuppressExternalCodecs = 0
//ChargeDLL("gdiplus.dll") gdiplusstartout=Null :GStatus = AppelDLL32("gdiplus.dll","GdiplusStartup",&:hToKen,&:GdiIN,gdiplusstartout)
Trace("token="+:hToKen+" status="+:GStatus)
PROCEDURE GdiCreateFromHDC(HDC)
Ret est un entier
SI :GStatus <>0 ALORS RETOUR
:hDC = HDC
Ret =AppelDLL32("gdiplus.dll","GdipCreateFromHDC",:hDC,&:GpGraphics)
....
PROCEDURE GdipFillRectangle(X1,Y1,X2,Y2,pHBrush=0)
hBrush est un entier Ret est un entier pX1 est un entier sur 4 octets = X1 pY1 est un entier sur 4 octets = Y1 pX2 est un entier sur 4 octets = X2 pY2 est un entier sur 4 octets = Y2
SI :GStatus <>0 OU :GpGraphics=0 ALORS RETOUR
SI pHBrush = 0 ALORS hBrush = :hBrush SINON hBrush = pHBrush
Ret = API("gdiplus.dll","GdipFillRectangle",:GpGraphics,hBrush,pX1,pY1,pX2,pY2) //Ret = AppelDLL32("gdiplus.dll","GdipCreateSolidFill",0x2000FF,&:hBrush) //ret = AppelDLL32("gdiplus.dll","GdipFillRectangle",:GpGraphics,:hBrush,0,0,1000,1000)
Trace("ret="+Ret+" hbrush="+hBrush )
Contribution le : 20/04/2006 13:09
|
|
|
Re: Afficher un DXF en utilisant GDI+ et DotNet |
|
Anonyme
|
Il n'est pas nécessaire de passer par une classe, le code s'exécutera plus vite.
GdiplusStartupInput is structure
GdiplusVersion is int
DebugEventCallback is int
SuppressBackgroundThread is int
SuppressExternalCodecs is int
END
// Load the GDI+ Dll
FUNCTION GdipStart()
nRet, hGDIplus are int
GpInput is GdiplusStartupInput
GpInput:GdiplusVersion = 1
IF GdiplusStartup(hGDIplus, GpInput) = 0 THEN
nRet = hGDIplus
END
RESULT nRet
END
// Unload the GDI+ Dll
PROCEDURE GdipEnd(hGDIplus is int)
IF hGDIplus THEN
GdiplusShutdown(hGDIplus&); hGDIplus = 0
END
END
etc... Note : Avec GDI+, il est préférable d'utiliser un composant graphique qui utilise le format ARGB en natif, ce qui n'est pas le cas du contrôle image de WinDev. Patrice Terrier
Contribution le : 20/04/2006 15:06
|
|
|
Re: Afficher un DXF en utilisant GDI+ et DotNet |
|
Stagiaire WDF
Inscrit: 27/12/2004 12:14
Post(s): 38
|
Le gain de vitesse n'est pas forcement rentable surtout si la classe est bien écrite
J'ai bien créer la fonction de conversion ARGB mais le pb vient apparement de windev car exectemnt le meme code en VB trace bien qq chose.
Aurriez-vous une piste ?
Contribution le : 20/04/2006 15:42
|
|
|
Re: Afficher un DXF en utilisant GDI+ et DotNet |
|
|
Quel est le DC que vous utilisez avec GdipCreateFromHDC.
Au besoin vous pouvez créer un DC compatible en utilisant : CreateIC("DISPLAY", BYVAL 0, BYVAL 0, BYVAL 0)
vous pouvez aussi utiliser le DC retourné par dDébutDessin.
L'ideal étant de travailler avec un DIB ou un memory bitmap (CreateCompatibleBitmap).
Contribution le : 20/04/2006 16:35
|
|
|
Re: Afficher un DXF en utilisant GDI+ et DotNet |
|
Anonyme
|
j'ai essayé plein de chose et même d'écrire dans une fenetre non windev (VB)
Il y a vraiment qq chose qui m'echappe
//hdc est un entier //hdc = dDébutDessin(IMG_GRAPH) // //gdip est un ZGdiplus(SysRécupèreDC(handle("Img_graph"))) //gdip est un ZGdiplus(handle("Img_graph")) //gdip est un ZGdiplus(SysRécupèreDC(handle(testgraph))) //gdip est un ZGdiplus(sysrecupereDC(SysFenHandle("Form1")))
Contribution le : 20/04/2006 17:45
|
|
|
Re: Afficher un DXF en utilisant GDI+ et DotNet |
|
Stagiaire WDF
Inscrit: 27/12/2004 12:14
Post(s): 38
|
Pareil avec
hDC = API("gdi32","CreateICA", "DISPLAY",0, 0,0) // BeginPaint Trace("hdc="+hDC)
pourtant ma trace est remplie avec des valeurs correctes
hdc=184620400 token=190036687 status=0 ret=2 gp=153371008 hdc=184620400 brush=153371728 ret=0 ret=0 hbrush=153371728 ret=0
Contribution le : 20/04/2006 17:59
|
|
|
Re: Afficher un DXF en utilisant GDI+ et DotNet |
|
|
En ce qui concerne l'utilisation du DC, mon exemple DIBtutor peut peut-être vous mettre sur la bonne piste. vous le trouverez ici: Télécharger DIBtutor
Contribution le : 20/04/2006 19:18
|
|
|
Re: Afficher un DXF en utilisant GDI+ et DotNet |
|
|
Voici la solution :
GdiplusStartupInput is structure
GdiplusVersion is int // Must be 1
DebugEventCallback is int // Ignored on free builds
SuppressBackgroundThread is int // FALSE unless you're prepared to call
// the hook/unhook functions properly
SuppressExternalCodecs is int // FALSE unless you want GDI+ only to use
// its internal image codecs.
END
hDLL is int = ChargeDLL("gdiplus.dll")
GSI is GdiplusStartupInput
GSI:GdiplusVersion = 1
hGDIplus is int
IF API("gdiplus", "GdiplusStartup", &hGDIplus, &GSI, Null) = 0 THEN
nGraphics is 4-byte unsigned int
nBrush is 4-byte unsigned int
Hwnd is int = Handle(IMG_GRAPH)
hDC is int = dDébutDessin(IMG_GRAPH, dSansEffacer)
nRet is int = API("gdiplus", "GdipCreateFromHDC", hDC, &nGraphics)
nARGB is 4-byte unsigned int = 0xFFFF0000
nRet = API("gdiplus", "GdipCreateSolidFill", nARGB, &nBrush)
nRet = API("gdiplus", "GdipFillRectangleI", nGraphics, nBrush, 1, 1, 500, 500)
nRet = API("gdiplus", "GdipDeleteBrush", nBrush)
nRet = API("gdiplus", "GdipDeleteGraphics", nGraphics)
UpdateWindow(Hwnd)
API("gdiplus", "GdiplusShutdown", hGDIplus)
END
Note : comme le code n'est pas réellement compilé, ne vous attendez pas à des miracles du point de vue de la vitesse.
Contribution le : 21/04/2006 20:39
|
|
Vous ne pouvez pas débuter de nouveaux sujets.
Vous pouvez voir les sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.
|
Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
|