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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant




Enregistrer votre réponse
CompteNom   Mot de passe   Authentification
Message:


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.

[Recherche avancée]


Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2