« .NET »

GDI+Complexes = MyGraph.net : générez vos graphiques radar facilement :)

26 février 2007

Vous connaissez les graphiques en radar ? Mais si, ces sortes de graphique en étoile :

Je me suis amusé pendant mes heures libres a développer une petite classe de génération de graphique de type radar. Bon certe, qu’on se le dise tout de suite, face a Office 2007 mes graphiques ne valent pas grand chose mais au moins c’est facilement exploitable sous .NET :)

J’avais initialement écrit cela dans un contexte professionnel et puis je me suis dis que ça valait le coup de pousser le bouchon un peu plus loin de en faire quelque chose de facilement ré-exploitable dans mes (et vos ^^) développements prochains..

Au début, je me suis demandé comment j’allais faire… Et puis quelques minutes plus tard j’ai repensé a une classe que j’avais écrite l’an dernier sur les complexes et publiée sur ce blog en Avril 2006 : Les complexes, pas complexe !!!
Et en effet avec les complexes, il n’y avait plus rien de complexe :)

Explications : je connais la taille de graphique voulu (passée dans le constructeur de ma classe), donc je devine assez facilement la taille d’une branche ainsi que le centre de mon graphique; j’ai donc ma 1er droite.
Pour avoir mes autres droites, il me suffit tout d’abord de calculer l’angle en fonction du nombre de branche par le calcul :
2PI/Nb.Branches
Par exemple, pour un graphique a 6 branches, mon angle est 2PI/6 soit PI/3 radian ou 60° degré ! Il me reste donc plus qu’a effectuer une rotation de mon point initial A de l’angle PI/3 par rapport au centre et j’obtiens bien mon 2eme point B.

Pour la suite, c’est identique sauf que le prochain point sera une rotation de l’angle PI/3 * 2; pour le suivant PI/3 * 3, etc… jusqu’à ce qu’on fasse le tour !
Il ne me reste plus qu’a dessiner les X droites partant du centre jusqu’aux points calculés et j’ai déjà ma base :

Pour placer les valeurs, il n’y a toujours rien de compliqué. Comme je connais mon centre et mon point A, j’ai une petite méthode qui me renvoi la position en pixel de ma valeur (branchSize – ((pourcentage * branchSize ) / 100)). Par exemple. 100% revient a placer le point sur le point A, par contre 0% sur le centre, 50% a mi-chemin entre le centre et le point A !
La 1er valeur est placée ! Pour le reste, je fais de même : je place ma valeur sur la 1er droite puis j’applique une rotation pour la placée sur la bonne branche et le tour est joué :) Il ne me reste plus qu’a mettre le tout dans un tableau de Point et de l’envoyer à la méthode DrawPolygon() de l’objet Graphic :

Comme quoi les complexes simplifient vraiment la vie :) Au final, nous n’utilisons que la méthode Rotation() du complexe a déplacer en lui passant comme argument l’angle (double) de rotation et le centre (complexe). J’ai quand même effectué quelques changements dans cette classe pour :

  • Proposer un constructeur prenant un objet Point; afin de construire un complexe facilement a partir d’un point
  • Proposer un accesseur get/set de type Point pour facilement passer d’un point à un complexe et vise vers sa !
  • Ré-ecrire en plus propre (oui, oui, en 10mois on fais des progrès :) )

Pour plus d’infos sur ma classe Complexe, je vous renvoie ici !

Utilisation : l’utilisation de ma classe de génération est vraiment très facile !
Tout d’abord, nous allons générer une liste de RadarItem contenant les valeurs, couleurs, noms etc.. des séries de votre graphique ! Ensuite nous construirons l’objet RadarChart pour appeler la methode GenerateChart qui vous renverra une simple image !

1ère étape : la liste de ChartItem
L’objet RadarItem représente les informations pour une série. Elle contient un tableau de double pour les valeurs, un Pen pour dessiner, un string pour le nom de la série et la possibilité de mettre un Brush pour remplir le polygon ! Exemple :

1
2
3
4
5
List<RadarItem> liste = new List<RadarItem>();
liste.Add(new RadarItem(new double[] { 20, 45, 38, 85, 34 },
              new Pen(Brushes.Blue), "Serie 1"));
liste.Add(new RadarItem(new double[] { 30, 18, 23, 52, 69 },
              new Pen(Brushes.Red), "Serie 2"));

Nous créons ici une liste de 2 séries : « Serie 1″ et « Serie 2″, de couleur bleu et rouge avec les valeurs passées dans le tableau de double.
Si il n’y a pas assez de valeurs qu’il n’y a de branches, alors les valeurs manquantes seront initialisées à 0. Si à l’inverse, il y a trop valeurs qu’il n’y a de branches, les valeurs en trop ne seront pas dessinées !

2ème étape : construction de l’objet RadarChart
Une fois notre liste de valeur prête, nous allons construire notre objet RadarChart ! L’objet propose plusieurs constructeurs car vous avez la possibilité de définir :

  • La taille de l’image générée
  • Le nombre de branche (qui doit être > 3)
  • Le padding : marge à gauche et marge en haut
  • Le stylo (Pen) pour dessiner la base
  • La nombre de graduation (int)
  • Un tableau de string : pour les labels placés sur les branches
  • Font et Brushes : pour définir la police et couleur des labels
  • La couleur du fond

Exemple concret :

1
2
3
4
5
6
7
RadarChart myGraph = new RadarChart(370, 350, 5,
                new Size(30, 30), new Pen(Brushes.Gray),
                5, new string[] { "Perf", "Rapidité",
                         "Communauté", "Simplicité",
                         "Portabilité" },
                new Font("Arial", 8), Brushes.Black,
                Brushes.White);

Nous construisons ici l’objet myGraph qui retournera une image de 370×350 avec 5 branches, une marge de 30px sur la gauche et le haut, une base dessinée en Gray (gris) avec 5 niveaux de graduation. Les branches auront les libellés : Perf, Rapidités, …. et seront écrit en Arial, taille 8 de couleur noir et le tout sur un fond blanc !
Graphiquement, cela donne :

3ème étape : génération du graphique
Une fois notre objet construit, il ne nous reste plus qu’a générer notre graphique par la méthode GenerateChart() qui nous retournera une Image.
Le 1er argument est notre liste de RadarItem (liste des séries). Ensuite les 3 arguments optionnels sont :

  • bool drawLegend : dessine la légende
  • bool drawValues : affiche les valeurs
  • bool drawPoint : dessine les points

J’ai donc placé une PictureBox sur une form et placé le code :

1
2
pictureBox1.Image = myGraph.GenerateChart(liste,
                true, true, true);

Ce qui nous retourne l’image :

Alors c’est compliqué de générer des graphiques ? ;) Vive les complexes ! Avec les sources trouverez un projet Winform avec une form de démo permettant de tester plusieurs graphiques à l’exécution :

Ce n’est pas une version finale, il faudrait y mettre des accesseurs aux propriétés passées dans le constructeur pour permettre de modifier le graphique sans pour autant recréer un objet. Et graphiquement il y a aussi des petites qui peuvent être revu comme la légende, placement des labels et valeurs, etc… mais là plus le temps :(

Si un jour vous avez besoin de générer des graphiques de ce type n’hésitez pas !! Les commentaires/suggestions/critiques sont les bienvenues :)

Télécharger le projet

(ps: je ne sais pas si je dois encore le dire, mais c’est codé en c# sous .NET 2.0 ^^)

Microsoft ASP.NET AJAX – VERSION 1.0

24 janvier 2007

C’est bon, c’est là officiellement, la version 1.0 du framework anciennement appelé Atlas :)

With ASP.NET AJAX, you can:

  • Create next-generation interfaces with reusable AJAX components.
  • Enhance existing Web pages using powerful AJAX controls with support for all modern browsers.
  • Continue using Visual Studio 2005 to take your ASP.NET 2.0 sites to the next level.
  • Access remote services and data directly from the browser without writing a ton of complicated script.
  • Enjoy the benefits of a free framework with 24×7 technical support provided by Microsoft.

Le lien : http://ajax.asp.net/

Vous trouverez sur ce post le HOL (basé sur la RC1) pour démarrer tout en douceur avec ce framework. Et en parcourant mon blog (catégorie Atlas), vous trouverez d’autres ressources (mais attention basé sur des versions antérieures !)..

A noter aussi, la version finale des Control Toolkit (avec notamment 2 super nouveaux contrôles : Calendar et MaskedEdit) et le ASP.NET AJAX January Futures CTP disponible sur la page de téléchargement : http://ajax.asp.net/downloads

Bon moi, j’ai du boulot pour migrer mes applications web Ajax sur mon serveur (resté encore en Beta2) vers cette nouvelle version :)

(update: n’oubliez pas de virer la balise tagMapping qui permettait d’implémenter les controls de base d’ ASP.NET v2 et d’utiliser ceux fournis par Atlas ! Ceci est obsolète, donc viré le de votre Web.config :) sinon vous allez découvrir une bonne centaine d’erreur à la compilation !)

Coup de coeur : Projet OR.net

22 janvier 2007

Ca va faire un petit mois que j’ai découvert OR.net et que j’utilise de plus en plus dans mes développements perso. Je viens de voir ce matin qu’une nouvelle version vient de sortir (version 3.1) :)

Coté news, les versions 3.x (3.0 puis 3.1 très rapidement) apportent surtout le support d’autres providers pour pouvoir fonctionner sur des bases Oracle, DB2, etc.. et quelques corrections de bugs ce qui m’a un peu déçu pour une cette nouvelle version majeure (moi qui attendais une meilleure GUI et le support des procédures stockées, j’attendrais encore un peu :) )

Enfin ça n’enlève rien que cet outil est vraiment génial sur le plan simplicité, flexibilité et surtout qualité du code produit :)

Pour le présenter rapidement, OR.net comme son nom l’indique est ORM (Object Relational Mapper) permettant à partir d’une base de donnée de générer tous les objets métiers ainsi que la DAL permettant de persister et récupérer des objets ou collections d’objets !

Ses fonctionnalité sont :

Class Definitions

  • Composite Identity Keys
  • SQL Server Identity Columns (database-managed columns)
  • Nullable Types

Composite Relationships

  • Foreign-Key Relationships
  • Many-Many Mapping Table Relationships
  • All .NET Collections (Generic and Non-Generic)
  • Lazy Loading

Transaction Management

  • Simple SQLTransaction
  • TransactionScope Distributed Transactions

Miscellaneous

  • Complete Visual Studio IntelliSense Documentation (generated with the libraries)
  • Appropriate .NET data-types suggested for DBMS columns of any type
  • Criteria objects providing for standard queries to be executed in a strictly OO manner
  • Templates to allow for easy creation of custom, advanced queries
  • Fine grained control to persist only certain, specific components of an object – minimizes DB traffic
  • Ability to save, and later re-open a project in order to make changes, and re-generate code

Coming Soon

  • Support for Stored Procedures
  • Updated Back End (will support Oracle much more easily)

Je n’irai pas très loin dans ce post, mais je vous invite a lire cet article sur Code Project qui présente bien l’outil.

Et bien sûr, la documentation officielle à lire absolument pour ceux qui voudrais allez un peu plus loin dans l’utilisation de cet outil !

Pour donner mon avis :

Les PLUS :

  • Utilisation très simple (GUI et code généré)
  • ORM complet
  • Full .NET 2.0 (utilisation des collections génériques)
  • Code propre et pur (la seule assembly à référencer est System.Transactions)
  • Gestion des transaction (SqlTransaction ou TransactionScope)
  • Classes de critères pour la recherche
  • Code documenté
  • Méthodes d’exemple (squelette) pour pouvoir rajouter nos propres méthodes très simplement
  • Gestion de la persistance de l’objet seul, complet ou des tables de relation seulement.

Les MOINS :

  • GUI bien que simple n’est top top. Il faut tout définir…
  • Pas de génération des procédures stockées
  • Beaucoup beaucoup de lignes de code générées (enfin comme c’est du beau code…. ça passe :)

Bref, je n’ai qu’un mot, développeur .NET : ESSAYEZ LE !! Ca en vaut la peine :)

Petite précision de dernière minute : l’outil est gratuit et open-source ! Enjoy :)

Visual WebGUI

21 janvier 2007

Comme inscrit sur la homepage du site officiel :

Visual WebGui is an AJAX development framework that simplifies development of enterprise IT web applications to the simplest.

En fait pour être plus précis, le framework Visual WebGui propose un modèle de développement Winform, avec un designer Winform où l’on crée nos Forms, Dialogs ou UserControls avec des contrôles de type Winform (Label, Textbox, DateTimePiker, Listbox, combobox, etc…).

En gros on développe une application Winform MAIS au lieu de compiler un EXE, nous obtenons une application Web assez jolie avec AJAX inside pour gérer les contrôles.

Bien sur il ne faut pas trop regarder le HTML/Javascript produit surtout pour les amoureux des standards (et du beau code), et même si ce produit a encore pas mal de chose à revoir, je pense qu’il a un bon avenir dans le monde du développement d’application Web enfin Web 2.0 :)

J’avais commencé la semaine dernière a créer un petit projet de test, une application de gestion de taches (gestion projets/milestones/taches). La rapidité de développement est assez impressionnante. Après avoir créé ma base SQL et DAL, il m’a fallu peu de temps pour placer mes contrôles (un tabControl, quelques listbox, textbox et button), un peu de code et créer une belle petite application Web.

A défaut d’avoir déployée l’application sur mon serveur de prod, une petite vidéo de présentation :

Bref, produit assez sympa, qui me rappelle Xamlon qui passé du Winform au Flash :)

Connaissez-vous le Micro Framework .NET 2.0 ?

9 janvier 2007

Tout le monde connait le .NET Framework 2.0 pour architecture PC (Windows) et son petit frère le Compact Framework .NET 2.0 beaucoup plus léger (« compact ») pour pouvoir profiter de le plateforme .NET sur PDA/GPS, smartphone, etc.. sous Windows CE/Mobile.

Et bien maintenant, en ligne depuis le début de l’année, le site du centre de développement du Micro Framework .NET 2.0 encore beaucoup léger (« micro ») pour processeurs ARM7/9 que l’ont retrouvent dans les téléphones portable, capteurs, robotique, etc…
Ce Micro Framework .NET est destiné là où Windows CE/Mobile est encore trop lourd. En effet le dotnetMF ne pèse que 250-500ko !!! Il aura un bel avenir dans le monde de la robotique !!

A quand une télécommande universelle .NET ?? (je me vois bien commander ma cafetière sur ma télécommande par WCF moi :) )
Plus d’infos : http://msdn.microsoft.com/embedded/netmf/