<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>La Fabrick &#187; Nos projets</title>
	<atom:link href="http://www.lafabrick.com/blog/category/elearning/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lafabrick.com/blog</link>
	<description>Laboratoire d&#039;interfaces riches (Flex, Flash, Air ...)</description>
	<lastBuildDate>Mon, 28 Nov 2011 22:02:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>Fireworks + Javascript = Spark Skin Pleasure !</title>
		<link>http://www.lafabrick.com/blog/2011/06/23/2598-fireworks-javascript-spark-skin-pleasure/</link>
		<comments>http://www.lafabrick.com/blog/2011/06/23/2598-fireworks-javascript-spark-skin-pleasure/#comments</comments>
		<pubDate>Thu, 23 Jun 2011 15:02:15 +0000</pubDate>
		<dc:creator>Erick</dc:creator>
				<category><![CDATA[Expériences utilisateur]]></category>
		<category><![CDATA[Logiciels / extensions / plugins...]]></category>
		<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2598</guid>
		<description><![CDATA[J&#8217;pensais pas faire ça aujourd&#8217;hui&#8230;, mais bon&#8230; moultes skins Spark à tomber : j&#8217;ai décidé de me helper myself et de gagner de l&#8217;argent ( enfin du temps pour commencer ). Du coup est née la petite commande Fireworks copyMXMLSelectionToClipboard, qui comme son nom l&#8217;indique presque, permet de copier une sélection dans Fireworks directement en [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.lafabrick.com/blog/images/_erick/fw2mxml_cmd-1-20110623-170349.png"  alt="Copier le MXML / FXG dans le ClipBoard" /></p>
<p>J&#8217;pensais pas faire ça aujourd&#8217;hui&#8230;, mais bon&#8230; moultes skins Spark à tomber : j&#8217;ai décidé de me helper myself et de gagner de l&#8217;argent ( enfin du temps pour commencer ). Du coup est née la petite commande Fireworks <em>copyMXMLSelectionToClipboard</em>, qui comme son nom l&#8217;indique presque, permet de copier une sélection dans Fireworks directement en MXML dans le ClipBoard. Elle est pas belle la vie ?!</p>
<p><span id="more-2598"></span></p>
<p>En gros :<br />
1. tu dessines tes trucs dans Fireworks, tu fais tes jolies dégradés, tes reflets, tes subtils petits floutés&#8230;<br />
2. tu sélectionnes ce que tu veux mettre dans ta skin<br />
3. tu lances la commande &#8216;UIGFx/SelectionToMXMLClipboard&nbsp;&raquo;<br />
4. t&#8217;ouvres ta skinClass et pi t&#8217;y colle </p>
<p><img src="http://www.lafabrick.com/blog/images/_erick/fw2mxml_generatedcode-20110623-165951.png"  alt="Copier le MXML / FXG généré" /></p>
<p>5. et pi&#8230; tu souris !</p>
<p>Cette 1ère version permet d&#8217;exporter les Rect, les Path et des Groups ( de Rect et de Paths ! ),<br />
avec leur SolidColor / SolidColorStroke,  LinearGradient ou RadialGradient,<br />
et même quelques filtres : Blur / DropShadow / InnerShadow.</p>
<p>Les positions sont recalculées avec un sélection placée à l&#8217;origine xy.</p>
<p><a href="http://www.lafabrick.com/labz/uigfx/xtensions/mxmlclip.zip">Télécharger l&#8217;extension Fireworks (CS3 + )</a></p>
<p>Et c&#8217;est déjà çà de fait ! </p>
<p>Edit : et je rappelle qu&#8217;on peut mapper des raccourcis pour n&#8217;importe quel élément de menu&#8230; #jdcjdrAutres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/11/07/238-digimix-un-air-de-musique/" rel="bookmark" title="7 novembre 2007">Digimix : un Air de musique&#8230;</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/05/10/323-tuto-vido-skiner-un-composant-flex-3-avec-fireworks-cs3/" rel="bookmark" title="10 mai 2008">Skiner un composant Flex 3 avec Fireworks CS3 [Tutoriel Vidéo]</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/12/04/1453-flex4-skin-et-primitives/" rel="bookmark" title="4 décembre 2009">Flex4 : skin et primitives</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/02/09/1964-uigfx-project-flex4-primitives-library-fireworks-extension/" rel="bookmark" title="9 février 2010">uigfx project : Flex4 primitives library / Fireworks extension</a></li>
</ul>
<p><!-- Similar Posts took 11.379 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2011/06/23/2598-fireworks-javascript-spark-skin-pleasure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Make me Fluid</title>
		<link>http://www.lafabrick.com/blog/2011/05/27/2576-make-me-fluid-2/</link>
		<comments>http://www.lafabrick.com/blog/2011/05/27/2576-make-me-fluid-2/#comments</comments>
		<pubDate>Fri, 27 May 2011 08:36:48 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Expériences utilisateur]]></category>
		<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[Non classé]]></category>
		<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[Pure Style]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2576</guid>
		<description><![CDATA[Vous vous souvenez peut-être de l’ancien site web de Paul Neave ? Autour de 2004 il me semble. Une perle du Web 1.0 ou les bordures du site ce tordaient au moindre passage de la souris. C’est un de ces sites qui, à l’époque, me faisait dire que Flash c’était cool. Il y a quelques [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"></a><a href="http://www.lafabrick.com/blog/wp-content/uploads/2011/05/TheFluidGuy.png"><img class="aligncenter size-full wp-image-2651" title="TheFluidGuy" src="http://www.lafabrick.com/blog/wp-content/uploads/2011/05/TheFluidGuy.png" alt="" width="303" height="272" /><br />
Vous vous souvenez peut-être de<a href="http://web.archive.org/web/20050204015952/http://www.neave.com/games/"> l’ancien site web</a> de <a href="http://twitter.com/#!/neave">Paul Neave</a> ? Autour de 2004 il me semble. Une perle du Web 1.0 ou les bordures du site ce tordaient au moindre passage de la souris. C’est un de ces sites qui, à l’époque, me faisait dire que Flash c’était cool.</p>
<p>Il y a quelques temps, suivant les travaux de <a href="http://philippe.elsass.me/">Philippe Elsass</a> (<a href="http://twitter.com/#!/elsassph">@elsassph</a>) sur les algos de dessin, j’ai entrepris de nouveaux travaux sur le sujet. Dans une librairie de primitives pour Flex4 d’abord, avec <a href="http://code.google.com/p/uigfx/">UIGFX</a>, et puis rapidement pour rendre plus&#8230; &laquo;&nbsp;fluides&nbsp;&raquo; mes skins d’application, façon Neave.<br />
<span id="more-2576"></span></p>
<p><strong>Attention : parcequ&#8217;il y a de nombreux exemples, et parceque ce billet est un voyage dans le monde merveilleux de la gelée; votre ordinateur peu subir quelques changements et râler un peu</strong></p>
<p>Ceux qui <a href="http://twitter.com/#!/fabienbizot">me suivent sur  Twitter</a> auront peut-être vu passer quelques essais.</p>
<table width="100%">
<tbody>
<tr>
<td width="50%"><a href="http://www.lafabrick.com/labz/skins/jellySound/"><img class="aligncenter size-full wp-image-2558" title="jellySound" src="http://www.lafabrick.com/blog/wp-content/uploads/2011/05/jellySound.png" alt="" width="280" height="200" /></a></td>
<td width="50%"><a href="http://www.lafabrick.com/labz/skins/jellySkin/"><img class="aligncenter size-full wp-image-2557" title="jellySkin" src="http://www.lafabrick.com/blog/wp-content/uploads/2011/05/jellySkin.png" alt="" width="280" height="200" /></a></td>
</tr>
</tbody>
</table>
<p><em>(Clic pour ouvrir)</em><br />
Ces tests de skinning flex interactif proviennent d’une extension Fluide de la librairie UIGFX (extension que je n’ai pas encore diffusé, faute de temps&#8230;)</p>
<p>BIGA! <a href="http://en.nicoptere.net/">Nicolas Barradeau</a> (<a href="http://twitter.com/#!/nicoptere">@nicoptere</a>) nous lance une série d’articles impressionnante sur l’art génératif, qui ce termine par une lib d’outils géométrique : <a href="http://code.google.com/p/biga/">Biga</a>. J’ai pas pu me retenir, et repris mes expérimentations.</p>
<h2>Des points&#8230;</h2>
<p>L’idée de l&#8217;interaction «fluide» est basé sur les algo de répulsion. Lorsque qu’un point de souris approche d’une zone d&#8217;interaction de point de vecteur, il faut calculer une «dispersion» du point.</p>
<p>J’utilise 2 facteurs distincts :</p>
<ul>
<li><strong>La viscosité</strong>: un coefficient qui donne, comme son nom l’indique, la viscosité du point. En physique des fluides, la viscosité représente la capacité d’un liquide à s’écouler. Plus le coefficient est faible, plus l’écoulement du fluide est rapide (ex: l’eau). A l’inverse, plus le coefficient est élevé, plus le fluide à des contraintes physiques importantes qui réduisent sont écoulement (ex.: la confiture).</li>
<li><strong>le facteur de gelée</strong>: c’est mon coefficient «maison». Un indicateur qui permet de préciser le degré de déformation d’un fluide. Plus ce facteur est élevé, plus le taux de déformation, et donc le mouvement de la forme, sera important.</li>
</ul>
<p>En AS3, on peut l’écrire comme ceci :</p>
<pre class="brush: js">
public function update(owner:DisplayObject):void
{
offsetx+=(xref - x) / jelly;
offsety+=(yref - y) / jelly;

var dx:Number=0;
var dy:Number=0;
if (owner.stage)
{
dx=x - owner.stage.mouseX;
dy=y - owner.stage.mouseY;
}

if (Math.sqrt((dx * dx) + (dy * dy)) &lt;= approach * 1.1)
{
var divisor:Number=approach / 10;
var a:Number=Math.atan2(dy, dx);

offsetx+=(Math.cos(a) * approach - dx) / divisor;
offsety+=(Math.sin(a) * approach - dy) / divisor;
}

offsetx*=(1 - viscosity);
offsety*=(1 - viscosity);
if (Math.abs(offsetx) &lt; .001)
{
offsetx=0;
}

if (Math.abs(offsety) &lt; .001)
{
offsety=0;
}

x+=offsetx;
y+=offsety;
}
</pre>
<p>Visuellement :<br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_0" width="650" height="300" align="center">
      <param name="movie" value="http://fabien.lafabrick.com/labs/fluid/FluidSpritePointTest.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/fluid/FluidSpritePointTest.swf" width="650" height="300" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
</p>
<h2>&#8230;Des lignes&#8230;</h2>
<p>2 points définissent une ligne&#8230; C&#8217;est la règle.<br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_1" width="650" height="300" align="center">
      <param name="movie" value="http://fabien.lafabrick.com/labs/fluid/FluidSimpleLineTest.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/fluid/FluidSimpleLineTest.swf" width="650" height="300" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
</p>
<h3>Projection</h3>
<p>Pour obtenir une ligne «fluide», il faut avoir un point de vecteur intermédiaire sur la ligne.<br />
Une méthode simple et efficace est de projeter le point de la souris sur la ligne. Les mathématiciens on depuis longtemps résolu le problème, et l&#8217;implémentation AS3 d’un algo de projection ressemble à ça :</p>
<pre class="brush: js">
public static function projection(p:Point, a:Point, b:Point):Point
{
var len:Number = length(a, b);
var r:Number = (((a.y - p.y) * (a.y - b.y)) - ((a.x - p.x) * (b.x - a.x))) / (len * len);

var px:Number = a.x + r * (b.x - a.x);
var py:Number = a.y + r * (b.y - a.y);

return new Point(px, py);
}
</pre>
<p>Avec les outis géométriques proposés par @nicoptere dans la lib Biga, le point de projection contraint dans la ligne, peut se calculer comme suit :</p>
<pre class="brush: js">
var mousePoint : Point = new Point(mouseX, mouseY);
var projection : Point = GeomUtils.project(mousePoint, point1, point2);
var constraintProjection : Point = GeomUtils.constrain( projection, point, point2);
</pre>
<p>La projection du point de souris sur notre ligne molle nous permet d’obtenir une interaction intéressante :<br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_2" width="650" height="300" align="center">
      <param name="movie" value="http://fabien.lafabrick.com/labs/fluid/FluidLineTest.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/fluid/FluidLineTest.swf" width="650" height="300" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
<br />
Si les points d’origine sont fixes, vous obtenez une espèce de corde de guitare. Rigolo.<br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_3" width="650" height="400" align="center">
      <param name="movie" value="http://fabien.lafabrick.com/labs/fluid/FluidRopeTest.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/fluid/FluidRopeTest.swf" width="650" height="400" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
</p>
<h2>&#8230;Et des formes</h2>
<p>Avec encore plus de points on commence a avoir des formes, façon gateau anglais :<br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_4" width="650" height="400" align="center">
      <param name="movie" value="http://fabien.lafabrick.com/labs/fluid/FluidRectTest.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/fluid/FluidRectTest.swf" width="650" height="400" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
<br />
Un autre exemple intéressant qui reprend la simulation de Philippe Elsass :<br />
<em>(Clic pour ajouter un point, Ctrl/Cmd + click pour supprimer un point)</em><br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_5" width="650" height="500" align="center">
      <param name="movie" value="http://fabien.lafabrick.com/labs/fluid/FluidMouseShapeTest.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/fluid/FluidMouseShapeTest.swf" width="650" height="500" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
</p>
<h2>Encore plus de gelée</h2>
<p>Comme je le disais au début de cette article, nous travaillons depuis quelques temps sur une librairie de primitives pour Flex4 : UIGFX. L’idée est de proposer une suite de primitives bien utiles, qui n&#8217;existent en standard dans le SDK Flex4 (lignes pointillées, arc, camembert, &#8230;.).</p>
<p>Dans cette librairie, nous avons mis en place une  primitive de représentation graphique de path SVG, qui, à la différence de la primitive Path standard du SDK Flex, permet de placer les vecteurs dans le modèle de contraintes top, left, bottom, right. Cette primitive permet aussi d’importer un chemin SVG, et de le convertir au format propre à cette primitive.</p>
<p>En modifiant un peu le parseur SVG de UIGFX,  nous pouvons facilement parcourir un path SVG et extraire les points de vecteur clefs de la forme. L’idée, vous vous en doutez est de gélifier la forme <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_6" width="650" height="500" align="center">
      <param name="movie" value="http://fabien.lafabrick.com/labs/fluid/FluidSvgTest.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/fluid/FluidSvgTest.swf" width="650" height="500" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
</p>
<h2>Sources et ressources</h2>
<ul>
<li> Vous trouverez l’ensemble des sources <a href="http://fabien.lafabrick.com/labs/fluid/makeMeFluid-src.zip">dans ce zip</a></li>
<li><a href="http://code.google.com/p/biga/">Biga, geometric tools library</a></li>
<li><a href="http://en.nicoptere.net/?tag=generative-art">La série d&#8217;articles</a> de <a href="http://twitter.com/#!/nicoptere">Nicolas Barradeau</a></li>
<li><a href="http://philippe.elsass.me/2009/06/as3-parametric-path-drawing/">&laquo;&nbsp;Parametric path drawing&nbsp;&raquo;</a> de <a href="http://twitter.com/#!/elsassph">Philippe Elsass</a></li>
<li>Et bien sur <a href="http://neave.com/">le site web </a> de <a href="http://twitter.com/#!/neave">Paul Neave</a>, &#8230; et <a href="http://web.archive.org/web/20050204015952/http://www.neave.com/games/">l&#8217;ancien </a> <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<p>Have fluid&#8217;s fun !Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2006/10/22/5-dessine-moi-de-la-3d/" rel="bookmark" title="22 octobre 2006">Dessine moi Final Fantaisy&#8230;</a></li>
<li><a href="http://www.lafabrick.com/blog/2006/10/22/10-youtube-soap-how-to-make-a-mouse-work-in-mid-air/" rel="bookmark" title="22 octobre 2006">La manette Wii sur mac / pc&#8230; enfin presque <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </a></li>
<li><a href="http://www.lafabrick.com/blog/2007/12/06/277-librairie/" rel="bookmark" title="6 décembre 2007">Librairie lafabrick : parce que je le vaut bien</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/05/15/96-et-le-9me-jour-il-crerent-le-volume-20/" rel="bookmark" title="15 mai 2007">et le 9ème jour il créerent le volume &#8230; 2.0</a></li>
</ul>
<p><!-- Similar Posts took 11.458 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2011/05/27/2576-make-me-fluid-2/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>MdaME, ma résolution 2011 de génération de code AS3</title>
		<link>http://www.lafabrick.com/blog/2011/01/11/2349-mdame-generateur-code-xsd-as3-flex/</link>
		<comments>http://www.lafabrick.com/blog/2011/01/11/2349-mdame-generateur-code-xsd-as3-flex/#comments</comments>
		<pubDate>Tue, 11 Jan 2011 21:50:00 +0000</pubDate>
		<dc:creator>La Fabrick</dc:creator>
				<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[Logiciels / extensions / plugins...]]></category>
		<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[generateur de code]]></category>
		<category><![CDATA[InMarket]]></category>
		<category><![CDATA[MDA]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[xsd]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2349</guid>
		<description><![CDATA[Voilà quelques temps que nous nous activions sans donner de nouvelles&#8230;, il est temps de corriger tout ça. Aussi, pour démarrer cette nouvelle année du bon pied, La Fabrick vous propose une petite application de génération de code AS3 à partir d&#8217;un schéma XSD. Ce petit outil nous a été utile pour pas mal de [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;">
<p><a href="http://www.lafabrick.com/blog/wp-content/uploads/2011/01/MdaMe.png"><img class="size-full wp-image-2372 alignnone" title="MdaMe" src="http://www.lafabrick.com/blog/wp-content/uploads/2011/01/MdaMe.png" alt="" width="499" height="64" /></a></p>
<p>Voilà quelques temps que nous nous activions sans donner de nouvelles&#8230;, il est temps de corriger tout ça.<br />
Aussi, pour démarrer cette nouvelle année du bon pied, La Fabrick vous propose une petite application de génération de code AS3 à partir d&#8217;un schéma XSD.</p>
<p>Ce petit outil nous a été utile pour pas mal de projets développés pour nos premiers clients, alors pourquoi ne pas vous en faire profiter ? Peut-être deviendrez-vous aussi MdaME-addict ?</p>
<p>Retrouvez toutes les infos sur <a href="http://mdame.lafabrick.com">http://mdame.lafabrick.com</a>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2006/12/21/23-api-de-dessin-en-as3/" rel="bookmark" title="21 décembre 2006">API de dessin en AS3</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/03/15/39-cre-ton-navigateur-perso-avec-5-lignes-de-code/" rel="bookmark" title="15 mars 2007">Crée ton navigateur perso avec 5 lignes de code !</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/02/27/309-flex-builder-3-et-le-php/" rel="bookmark" title="27 février 2008">Flex Builder 3 et le PHP ( PDT ) : installation</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/05/10/323-tuto-vido-skiner-un-composant-flex-3-avec-fireworks-cs3/" rel="bookmark" title="10 mai 2008">Skiner un composant Flex 3 avec Fireworks CS3 [Tutoriel Vidéo]</a></li>
</ul>
<p><!-- Similar Posts took 11.339 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2011/01/11/2349-mdame-generateur-code-xsd-as3-flex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ZXPackager : application pour l’empaquetage ZXP d’extensions CS5</title>
		<link>http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/</link>
		<comments>http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 21:10:53 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Applications]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Lafabrick]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[zxp]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2092</guid>
		<description><![CDATA[Vous l&#8217;aurez peut être remarqué, nous avons ajouté une rubrique Applications au blog. Nous travaillons actuellement sur plusieurs applications AIR orientées &#171;&#160;aide au développeur&#160;&#187;. ZXPackager est la première d&#8217;entre elles. Cette application propose un moyen simple de packager vos extensions CS5 développées avec le nouveau SDK Creative Suite. Les extensions ZXP Depuis la CS5, Adobe [...]]]></description>
			<content:encoded><![CDATA[<table width="100%">
<tbody>
<tr>
<td width="125px"><img class="aligncenter size-full wp-image-2099" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/logo128.png" alt="" width="128" height="128" /></td>
<td width="100%">Vous l&#8217;aurez peut être remarqué, nous avons ajouté une rubrique <a href="http://www.lafabrick.com/blog/applications/">Applications</a> au blog. Nous travaillons actuellement sur plusieurs applications AIR orientées &laquo;&nbsp;aide au développeur&nbsp;&raquo;. ZXPackager est la première d&#8217;entre elles.</p>
<p>Cette application propose un moyen simple de packager vos extensions CS5 développées avec le nouveau SDK Creative Suite.</td>
</tr>
</tbody>
</table>
<p><span id="more-2092"></span></p>
<h2>Les extensions ZXP</h2>
<p>Depuis la CS5, Adobe propose un nouveau SDK de développement et un format d&#8217;extension commun a toute la suite logicielle.<br />
Ce SDK, <a href="http://www.adobe.com/devnet/creativesuite/sdk/eula_cs5_toolkit.html">disponible ici</a>, vous permet de développer vos propres panneaux et autres menus CS5. Le premier format de sortie est le MXP, toujours disponible, vous permettant d&#8217;exporter votre extension pour un logiciel cible.<br />
Maintenant, avec la CS5, vous disposez d&#8217;un format commun, le ZXP, qui rend compatible votre extension avec toutes la suites CS.</p>
<p>Un fichier ZXP est défini par un manifeste xml, définissant le fonctionnement de l&#8217;extension (type, portée logiciel, &#8230;), et contient le (les) SWF de l&#8217;extension (une extension est en fait une pseudo application AIR, basée sur le SDK CS). Un fichier ZXP est signé numériquement. Vous devez donc avoir un certificat (PKCS12, PKCS11, JKS). Vous pouvez bien entendu utiliser votre certificat auto-signé préalablement créé avec Flash/Flex Buider.</p>
<p>Pour plus d&#8217;informations :</p>
<ul>
<li><a href="http://www.adobe.com/devnet/creativesuite/sdk/index.html">Creative Suite SDK</a></li>
<li><a href="http://blogs.adobe.com/cssdk/">le blog CSSDK</a></li>
</ul>
<p>Un fichier ZXP doit (habituellement) être compilé en utilisant le packager Java <a href="http://www.adobe.com/devnet/creativesuite/sdk/eula_cs5_toolkit.html">UCF</a>. Et c&#8217;est là l&#8217;idée de cette petite application : ne pas avoir a redéfinir vos certificats et autres options pour chaque package, et vous proposer une interface plus &laquo;&nbsp;user friendly&nbsp;&raquo; que le terminal.</p>
<h2>Fonctionnement</h2>
<h3>Démarrage, et préférences</h3>
<p>Au premier démarrage, l&#8217;application doit obtenir vos préférences de base.</p>
<p><img class="aligncenter size-full wp-image-2100" title="Preferences" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/Preferences.png" alt="Preferences" width="500" height="450" /></p>
<ul>
<li>
<h4>Java Home</h4>
<p>Vous devez indiquer le chemin vers votre JDK/JRE java, si celui-ci ne correspond pas à celui par défaut (l&#8217;application intègre le packager jar UCF, et elle doit connaître le répertoire racine de Java pour pouvoir le lancer). Les chemins racines par défaut sont:</p>
<ul>
<li>Pour Windows : <strong>&#8216;C:\Program Files\Java\jdk1.6.0&#8242;</strong></li>
<li>Pour Mac : <strong>&#8216;/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0&#8242;</strong></li>
</ul>
</li>
<li>
<h4>Certificat</h4>
<p>Vous devez préciser l&#8217;emplacement de votre certificat (généralement un fichier de type .p12 ou .p11), ainsi que votre mot de passe. Ces informations sont nécessaires pour la signature de l&#8217;extension.</p>
<ul>
<li>
<h4>Fichier cible</h4>
<p>Vous devez indiquer le fichier de destination. L&#8217;extension .zxp est ajoutée automatiquement.</li>
<li>
<h4>Source de l&#8217;extension</h4>
</li>
<p>Les sources de l&#8217;extension, comme défini dans la nomenclature du SDK CS, doivent correspondre à ce schéma:</p>
<p><img class="aligncenter size-full wp-image-2096" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/binPackageOverview.png" alt="" width="537" height="80" /><br />
Ce répertoire est construit préalablement par la tâche ant de compilation, dans votre projet (cf. en fin d&#8217;article, le téléchargement du projet test d&#8217;extension)<br />
Vous devez pointer sur le répertoire &laquo;&nbsp;bin&nbsp;&raquo;.</ul>
<ul>
<li>Démarrer un nouveau package;</li>
<li>Ouvrir et installer l&#8217;extension via Extension Manager (vous devez bien entendu avoir préalablement installé Extension Manager CS5)</li>
</ul>
<ul>
<li><a href="http://lafabrick.com/applications/zxpackager/extensionTest.fxp">Projet fxp</a></li>
<li><a href="http://lafabrick.com/applications/zxpackager/bin.zip">Archive zip du bin de test</a></li>
</ul>
</li>
<h3>Définition de votre extension</h3>
<p>Un package ZXP a besoin de 2 informations : le nom et l&#8217;emplacement de votre extension cible, et l&#8217;endroit où se trouve le répertoire &laquo;&nbsp;bin&nbsp;&raquo; de votre extension.</p>
<p><img class="aligncenter size-full wp-image-2102" title="StartProject" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/StartProject.png" alt="start package" width="500" height="450" /></p>
<p>Une fois le packaging démarré, un message d&#8217;attente s&#8217;affiche.</p>
<p><img class="aligncenter size-full wp-image-2103" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/waiting-mini.png" alt="" width="467" height="48" /></p>
<h3>Finalisation</h3>
<p>Une fois le package créé, l&#8217;application vous propose de :</p>
<p><img class="aligncenter size-full wp-image-2097" title="completed" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/completed.png" alt="" width="500" height="450" /></p>
<h2>Téléchargements</h2>
<h3>ZXPackager</h3>
<table>
<tbody>
<tr>
<td width="128"><a href="http://www.lafabrick.com/applications/zxpackager/ZXPackager-MAC.zip"><img class="aligncenter size-full wp-image-2137" title="macPackageExport" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/macPackageExport.png" alt="" width="128" height="128" /></a></td>
<td width="128"><a href="http://www.lafabrick.com/applications/zxpackager/ZXPackager-WIN.zip"><img class="aligncenter size-full wp-image-2137" title="winPackageExport" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/winPackageExport.png" alt="" width="128" height="128" /></a></td>
</tr>
</tbody>
</table>
<h3>Extension de test</h3>
</ul>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/09/04/206-flex-3-beta-rsolution-de-bug-comment-placer-fichier-d-application/" rel="bookmark" title="4 septembre 2007">[Flex 3 Beta] bug : Application File doesn&#8217;t exist</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/02/04/299-un-projet-java-flex-avec-maven-2/" rel="bookmark" title="4 février 2008">Un projet Java / Flex avec Maven 2</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/08/20/2167-air-2-appeler-un-jar-executable-via-un-nativeprocess/" rel="bookmark" title="20 août 2010">AIR 2 : appeler un JAR exécutable via un NativeProcess</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/10/21/2272-rollingfiletarget-pour-air-2-0-lets-roll/" rel="bookmark" title="21 octobre 2010">RollingFileTarget pour AIR 2.0 : let&#8217;s roll !</a></li>
</ul>
<p><!-- Similar Posts took 11.901 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Primitive DashedLine : une petite ligne bien utile</title>
		<link>http://www.lafabrick.com/blog/2010/07/23/1989-primitive-dashedline-une-petite-ligne-bien-utile/</link>
		<comments>http://www.lafabrick.com/blog/2010/07/23/1989-primitive-dashedline-une-petite-ligne-bien-utile/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 09:07:22 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[flex4]]></category>
		<category><![CDATA[primitives]]></category>
		<category><![CDATA[Spark]]></category>
		<category><![CDATA[uigfx]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1989</guid>
		<description><![CDATA[Je viens de rajouter une petite primitive bien utile dans la librairie UIGFX : DashedLine, qui, comme son nom l&#8217;indique (ou pas), permet d&#8217;avoir une ligne pointillée. Basé sur Line, cette primitive propose une propriété dashes, qui vous permet de paramètrer l&#8217;apparence des pointillées. dashes contient un tableau (Array) de nombres. Les emplacements impaires du [...]]]></description>
			<content:encoded><![CDATA[<p><center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/dashedLine530.png" alt="" title="dashedLine530" width="532" height="59" class="aligncenter size-full wp-image-1997" /></center><br />
Je viens de rajouter une petite primitive bien utile dans <a href="http://uigfx.googlecode.com">la librairie UIGFX</a> : <a href="http://code.google.com/p/uigfx/source/browse/trunk/uigfx/src/com/lafabrick/uigfx/primitives/DashedLine.as">DashedLine</a>, qui, comme son nom l&#8217;indique (ou pas), permet d&#8217;avoir une ligne pointillée.<br />
<span id="more-1989"></span><br />
Basé sur <b>Line</b>, cette primitive propose une propriété dashes, qui vous permet de paramètrer l&#8217;apparence des pointillées.</p>
<p>dashes contient un tableau (Array) de nombres. Les emplacements impaires du tableau définissent la taille (en pixel) des tirets. Les emplacements pair définissent la taille des espacement.</p>
<p>Dans le code : </p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;s:Application xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot;
    xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot;
    xmlns:mx=&quot;library://ns.adobe.com/flex/mx&quot;
    minWidth=&quot;200&quot; minHeight=&quot;200&quot;
    xmlns:uigfx=&quot;http://uigfx.lafabrick.com&quot;&gt;

    &lt;uigfx:DashedLine
        dashes=&quot;[80, 10, 10, 20, 40, 30]&quot;
        left=&quot;100&quot; verticalCenter=&quot;0&quot; right=&quot;100&quot;&gt;

        &lt;uigfx:stroke&gt;
            &lt;s:SolidColorStroke color=&quot;#FFFFFF&quot; weight=&quot;4&quot; caps=&quot;round&quot; /&gt;
        &lt;/uigfx:stroke&gt;

        &lt;uigfx:filters&gt;
            &lt;s:GlowFilter blurX=&quot;4&quot; blurY=&quot;4&quot; alpha=&quot;.8&quot; color=&quot;#333333&quot; /&gt;
        &lt;/uigfx:filters&gt;

    &lt;/uigfx:DashedLine&gt;

    &lt;uigfx:DashedLine
        dashes=&quot;[80, 10, 10, 20, 40, 30]&quot;
        left=&quot;101&quot; verticalCenter=&quot;0&quot; right=&quot;100&quot;&gt;

        &lt;uigfx:stroke&gt;
            &lt;s:LinearGradientStroke weight=&quot;2&quot; pixelHinting=&quot;true&quot; caps=&quot;square&quot;&gt;
                &lt;s:GradientEntry color=&quot;#009EE0&quot; /&gt;
                &lt;s:GradientEntry color=&quot;#FF9900&quot; /&gt;
                &lt;s:GradientEntry color=&quot;#009EE0&quot; /&gt;
            &lt;/s:LinearGradientStroke&gt;
        &lt;/uigfx:stroke&gt;

    &lt;/uigfx:DashedLine&gt;

&lt;/s:Application&gt;
</pre>
<p>Résultat :<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/dashedLine650.png" alt="" title="dashedLine630" width="650" height="54" class="aligncenter size-full wp-image-1998" /></center><br />
C&#8217;est beau!!</p>
<p>Disponible bien entendu sur <a href="http://uigfx.googlecode.com">le google code UIGFX</a>.<br />
Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2010/02/09/1964-uigfx-project-flex4-primitives-library-fireworks-extension/" rel="bookmark" title="9 février 2010">uigfx project : Flex4 primitives library / Fireworks extension</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/" rel="bookmark" title="14 juillet 2010">Flex 4 et les layouts &#8211; Faire une ViewStack &laquo;&nbsp;pure&nbsp;&raquo; Spark</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/" rel="bookmark" title="4 mai 2010">UIGFX practice : a CircularSlider component</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/03/05/1675-proches-de-lohio-les-etats-esthetes-de-flex4/" rel="bookmark" title="5 mars 2010">Proches de l&#8217;Ohio??? Les états esthètes de Flex4</a></li>
</ul>
<p><!-- Similar Posts took 11.647 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/07/23/1989-primitive-dashedline-une-petite-ligne-bien-utile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UIGFX practice : a CircularSlider component</title>
		<link>http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/</link>
		<comments>http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/#comments</comments>
		<pubDate>Tue, 04 May 2010 21:18:39 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[component]]></category>
		<category><![CDATA[FlashBuilder]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[flex4]]></category>
		<category><![CDATA[Spark]]></category>
		<category><![CDATA[uigfx]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1962</guid>
		<description><![CDATA[If you were luck enough to use a multitouch application, did you ever have the idea that it would be interesting to use some circular interface components? As interface space management is easier to achieve on large multitouch tables, I had the idea to develop a CircularSlider component, using my primitive UIGFX library, including the [...]]]></description>
			<content:encoded><![CDATA[<p>If you were luck enough to use a multitouch application, did you ever have the idea that it would be interesting to use some circular interface components?<br />
As interface space management is easier to achieve on large multitouch tables, I had the idea to develop a CircularSlider component, using my primitive <a href="http://code.google.com/p/uigfx/">UIGFX library</a>, including the <a href="http://code.google.com/p/uigfx/source/browse/trunk/uigfx/src/com/lafabrick/uigfx/primitives/Pie.as">Pie primitive</a>.<br />
Let see how it works&#8230;<br />
<span id="more-1962"></span><br />
<H2>The component</H2></p>
<h3>PieButton</h3>
<p>I needed a button with 2 properties <code>startAngle</code> and <code>angle</code>, to be able to transmit these values to the skin: </p>
<pre class="brush: js">
package com.lafabrick.components
{
    import spark.components.Button;

    public class PieButton extends Button
    {
        public function PieButton()
        {
            super();
        }

        private var _angle : Number;
        private var _startAngle : Number;

        public function get angle():Number
        {
            return _angle;
        }
        [Bindable]public function set angle(value:Number):void
        {
            _angle = value;
            invalidateDisplayList();
        }

        public function get startAngle():Number
        {
            return _startAngle;
        }
        [Bindable]public function set startAngle(value:Number):void
        {
            _startAngle = value;
            invalidateDisplayList();
        }

    }
}
</pre>
<h3>CircularSlider</h3>
<p>This component could not extend directly SliderBase or TrackBase because the SkinPart thumb and track, as Button, are extending the TrackBase class.<br />
I thus used the Range class, inserted the Slider architecture, and added specific geometric codes.<br />
<a href="http://fabien.lafabrick.com/labs/components/circularslider/srcview/source/fxComponentKit/src/com/lafabrick/components/CircularSlider.as.html">Check the component&#8217;s source code</a></p>
<h2>Skin implementation</h2>
<p>The design of the Skin is similar to a skin Slider standard, except that it uses a PieButton instead of a Button: </p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;s:SparkSkin xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot;
        xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot;
        xmlns:mx=&quot;library://ns.adobe.com/flex/mx&quot;
        width=&quot;100%&quot; height=&quot;100%&quot;
        xmlns:components=&quot;com.lafabrick.components.*&quot;
        &gt;
    &lt;!-- host component --&gt;
    &lt;fx:Metadata&gt;
        [HostComponent(&quot;com.lafabrick.components.CircularSlider&quot;)]
    &lt;/fx:Metadata&gt;

    &lt;!-- states --&gt;
    &lt;s:states&gt;
        &lt;s:State name=&quot;normal&quot; /&gt;
        &lt;s:State name=&quot;disabled&quot; /&gt;
        &lt;s:State name=&quot;inactive&quot; /&gt;
    &lt;/s:states&gt;

    &lt;!-- SkinParts
    name=track, type=com.lafabrick.uigfx.components.CircularButton
    name=thumb, type=com.lafabrick.uigfx.components.CircularButton
    --&gt;

    &lt;components:PieButton
        id=&quot;track&quot;
        width=&quot;100%&quot; height=&quot;100%&quot;
        top=&quot;0&quot; bottom=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot;
        skinClass=&quot;skins.CircularTrackButtonSkin&quot;/&gt;

    &lt;components:PieButton
        id=&quot;thumb&quot;
        angle=&quot;20&quot;
        width=&quot;100%&quot; height=&quot;100%&quot;
        top=&quot;0&quot; bottom=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot;
        skinClass=&quot;skins.CircularThumbButtonSkin&quot;/&gt;

&lt;/s:SparkSkin&gt;
</pre>
<p>Under &laquo;&nbsp;thumb&nbsp;&raquo; and &laquo;&nbsp;track&nbsp;&raquo; Skin, the angular values are a mapped with the PieButton HostComponent. StartAngle and angle properties of the Pie primitive are directly extended from the host component.<br />
Here follows a sample with Track Skin:</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;s:SparkSkin xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot;
             xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot; 

             minWidth=&quot;21&quot; minHeight=&quot;21&quot;
             alpha.disabled=&quot;0.5&quot;
             xmlns:uigfx=&quot;http://uigfx.lafabrick.com&quot;
             xmlns:primitives=&quot;com.lafabrick.uigfx.primitives.*&quot;&gt;

    &lt;fx:Metadata&gt;
        [HostComponent(&quot;com.lafabrick.components.PieButton&quot;)]
    &lt;/fx:Metadata&gt;

    &lt;s:states&gt;
        &lt;s:State name=&quot;up&quot; /&gt;
        &lt;s:State name=&quot;over&quot; /&gt;
        &lt;s:State name=&quot;down&quot; /&gt;
        &lt;s:State name=&quot;disabled&quot; /&gt;
    &lt;/s:states&gt;

    &lt;primitives:Pie
        top=&quot;0&quot; bottom=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot;
        gap=&quot;2&quot;
        innerOffset=&quot;-2&quot;
        offset=&quot;-2&quot;

        innerRadius=&quot;0.7&quot;
        angle=&quot;{hostComponent.angle}&quot;
        startAngle=&quot;{hostComponent.startAngle}&quot;
        &gt;

        &lt;primitives:fill&gt;
            &lt;s:RadialGradient&gt;
                &lt;s:GradientEntry color=&quot;#006699&quot; /&gt;
                &lt;s:GradientEntry color=&quot;#009EE0&quot; /&gt;
            &lt;/s:RadialGradient&gt;
        &lt;/primitives:fill&gt;

        &lt;primitives:filters&gt;
            &lt;s:GlowFilter inner=&quot;true&quot; color=&quot;#000000&quot;
                blurX=&quot;10&quot; blurY=&quot;10&quot; alpha=&quot;0.4&quot; /&gt;
        &lt;/primitives:filters&gt;

    &lt;/primitives:Pie&gt;

&lt;/s:SparkSkin&gt;
</pre>
<p><H2>Result</H2><br />
Let see:<br />
<object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/components/circularslider/circularSlider.swf" width="640" height="500"><param name="movie" value="http://fabien.lafabrick.com/labs/components/circularslider/circularSlider.swf" /><param name="bgcolor" value="#ffffff" /><param name="allowScriptAccess" value="sameDomain" /><param name="allowFullScreen" value="true" /></object><br />
Nice huh?</p>
<p>You can check these for more info: <a href="http://fabien.lafabrick.com/labs/components/circularslider/">Link</a>, and <a href="http://fabien.lafabrick.com/labs/components/circularslider/srcview/index.html">source code</a>.</p>
<p>PS: Thanks to Hervé for review and corrections!Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2009/11/27/1373-flex4-custom-component-skinnig/" rel="bookmark" title="27 novembre 2009">Flex4 : composant personnalisé et skinning</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/02/09/1964-uigfx-project-flex4-primitives-library-fireworks-extension/" rel="bookmark" title="9 février 2010">uigfx project : Flex4 primitives library / Fireworks extension</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/" rel="bookmark" title="14 juillet 2010">Flex 4 et les layouts &#8211; Faire une ViewStack &laquo;&nbsp;pure&nbsp;&raquo; Spark</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/23/1989-primitive-dashedline-une-petite-ligne-bien-utile/" rel="bookmark" title="23 juillet 2010">Primitive DashedLine : une petite ligne bien utile</a></li>
</ul>
<p><!-- Similar Posts took 12.142 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arduino #2 : Flash, socket et Processing</title>
		<link>http://www.lafabrick.com/blog/2010/04/06/1754-arduino-2-flash-socket-et-processing/</link>
		<comments>http://www.lafabrick.com/blog/2010/04/06/1754-arduino-2-flash-socket-et-processing/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 20:11:14 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Processing]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1754</guid>
		<description><![CDATA[Suite de nos expérimentations! Cette fois on va parler de Flash. Nous allons voir comment faire un petit serveur qui écoute le port série, et qui renvoie les infos sur un socket que nous écouterons avec Flash. C&#8217;est parti! Un serveur série avec Processing Nous allons reprendre le code Processing précédent, et faire quelques modifications. [...]]]></description>
			<content:encoded><![CDATA[<p><center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/04/header.jpg" alt="arduino_header" title="arduino_header" width="520" height="130" class="aligncenter size-full wp-image-1793" /></center><br />
Suite de nos expérimentations! Cette fois on va parler de Flash. Nous allons voir comment faire un petit serveur qui écoute le port série, et qui renvoie les infos sur un socket que nous écouterons avec Flash. C&#8217;est parti!<br />
<span id="more-1754"></span><br />
<H2>Un serveur série avec Processing</H2><br />
Nous allons reprendre le code <a href="http://www.lafabrick.com/blog/2010/04/06/1752-arduino-1-fabrique-ta-presque-wiimote">Processing précédent</a>, et faire quelques modifications. Le principe est d&#8217;utiliser la librairie processing.net pour créer et gérer notre serveur. Nous devons modifier légèrement les fonctions setup() et draw() de notre code.<br />
<H3>setup</H3><br />
Dans l&#8217;initialisation, nous devons créer notre serveur. Il suffit tout simplement de définir un port (ici le 10001) :</p>
<pre class="brush: js">
import processing.net.*;
import processing.serial.*;

Serial port;
Server socket;
void setup() {

  println( Serial.list() );

  String usbPort = Serial.list()[0];
  port = new Serial(this, usbPort, 9600);

  socket = new Server( this, 10001 );

  port.bufferUntil(&#039;\n&#039;);

  port.write(65);
}
</pre>
<p><H3>dessine moi un serveur</H3><br />
Nous allons enlevé le code concernant la scène 3D. C&#8217;est une applet serveur que l&#8217;on veut tout de même! Enfin moi je l&#8217;enlève.<br />
Donc, nous allons nous servir de la fonction draw pour pousser les valeurs de l&#8217;accéléromètre au travers du socket. Je n&#8217;envoie que les valeur en X et Y, vue que l&#8217;on n&#8217;a pas (encore) de gyroscope associé à l&#8217;axe Z. On termine l&#8217;écriture sur le serveur par un byte de valeur 0. Histoire de préciser que, oui, c&#8217;est fini et qu&#8217;il peut transmettre. Je conserve le delay de 100 millisecondes, pour ne pas saturer Flash Player par des tonnes de valeurs.</p>
<pre class="brush: js">
void draw() {

  socket.write( xvalue+&quot;,&quot;+yvalue );
  socket.write( zero );

  delay(100);
}
</pre>
<p>Aller hop ! Le code du serveur complet :</p>
<pre class="brush: js">
import processing.net.*;
import processing.serial.*;

Serial port;
Server socket;

byte zero = 0;

float xvalue = 0;
float yvalue = 0;
float zvalue = 0;

void setup() {

  println( Serial.list() );

  String usbPort = Serial.list()[0];
  port = new Serial(this, usbPort, 9600);

  socket = new Server( this, 10001 );

  port.bufferUntil(&#039;\n&#039;);

  port.write(65);
}

void draw() {

  socket.write( xvalue+&quot;,&quot;+yvalue );
  socket.write( zero );

  delay(100);
}

void serialEvent(Serial port) {

  String serialStr = port.readStringUntil(&#039;\n&#039;);
  serialStr = trim(serialStr);

  int values[] = int(split(serialStr, &#039;,&#039;));

  if( values.length == 3 ) { 

    xvalue =calculate( values[0], 512 );
    yvalue = -calculate( values[1], 500 );

  }
}

float calculate( float returnValue, int baseValue ) {

  float diff = returnValue - baseValue;
  returnValue = (diff*90) / 115; 

  // to radian
  returnValue = PI*returnValue/180;

  // trunc value
  returnValue = round( returnValue*100 );
  returnValue = returnValue /100;

  return returnValue;
}
</pre>
<p><H2>Flaaaaaaaaash</H2><br />
Côté Flash, finalement c&#8217;est super simple. Un socket XML, connecté sur le port 10001, avec l&#8217;adresse local (127.0.0.1). A chaque réception de données, nous découpons la valeur reçue pour extraire les valeurs X et Y provenant du serveur Processing :</p>
<pre class="brush: js">
package
{
    import flash.events.DataEvent;
    import flash.events.Event;
    import flash.events.SecurityErrorEvent;
    import flash.net.XMLSocket;

    public class ArduinoSocket
    {
        private var _socket : XMLSocket;

        public function connect() : void
        {
            _socket = new XMLSocket();

            _socket.connect(&quot;127.0.0.1&quot;, 10001);
            _socket.addEventListener(Event.CONNECT, onConnect );
            _socket.addEventListener(DataEvent.DATA, onData);
            _socket.addEventListener(
                        SecurityErrorEvent.SECURITY_ERROR, onSecurityError);

        }

        protected function onConnect( event : Event ) : void
        {
            //connecté;
        }

        protected function onData( event : DataEvent ) : void
        {
            var str : String = event.data;
            var dataAr : Array = str.split(&quot;,&quot;);
            var pitch : Number = Number( dataAr[0] );
            var yaw : Number = Number( dataAr[1] );

            // faites ce que vous voulez ici
        }

        protected function onSecurityError( event : SecurityErrorEvent ) : void
        {
            //y&#039;a une erreur
        }
    }
}
</pre>
<p><H2>Et pour AIR(2)</H2><br />
Processing vous permet de compiler votre code en applet Java, mais aussi en .EXE, .DMG, .RPM. Comme ça on est bien. Le truc cool, c&#8217;est qu&#8217;avec AIR2, vous pouvez, via un packaging natif de votre application, embarquer, et lancer votre serveur directement depuis AIR (via native process, tout çà). Et c&#8217;est bien! du coup vous pouvez avoir un petit serveur qui écoute le port série, directement intégrable dans vos applications. Par extension, vous pouvez prévoir plein de choses avec cette base de petit serveur (un point d&#8217;écoute de vos périphériques bluetooth par exemple?)<br />
<H2>Bonus track</H2><br />
Aller hop ! Je me jette à l&#8217;eau. Une petite séquence pour vous montrer que ce n&#8217;est pas du flan!<br />
<center><br />
<object width="640" height="395"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=10727217&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=10727217&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="395"></embed></object><br />
</center><br />
(Ouai bon j&#8217;aurais pu faire un gif animé&#8230; Mais la méthode old school marche pas si mal)<br />
<H2>Pour finir</H2><br />
Voilà la fin de cette mise en jambe dans l&#8217;univers Arduino. J&#8217;aurais pu avoir un exemple plus &laquo;&nbsp;graphique&nbsp;&raquo; que le simple cube&#8230; Mais je laisse libre court à votre imagination! Pour la suite, et en fonction de vos retours, je pense aller plus loin dans ce montage analogique : dans un premier temps en ajoutant un gyroscope électronique, et puis j&#8217;aimerai bien vous proposer un tuto sur Arduino et les communications sans fil, notamment via <a href="http://www.arduino.cc/playground/Shields/Xbee01">une interface XBee</a>. A vous!<br />
Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/01/24/26-flash-et-le-streaming-vido/" rel="bookmark" title="24 janvier 2007">Flash et le streaming vidéo</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/03/01/31-une-anne-charge-pour-adobe-et-pour-nous/" rel="bookmark" title="1 mars 2007">Apollo, Blaze, Moxie&#8230; une année chargée pour adobe&#8230; et pour nous !</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/06/06/327-google-language-api-flex/" rel="bookmark" title="6 juin 2008">Google AJAX Language API&#8230; et ton Flex devient polyglotte !</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/04/06/1752-arduino-1-fabrique-ta-presque-wiimote/" rel="bookmark" title="6 avril 2010">Arduino #1 : fabrique ta (presque) wiimote!</a></li>
</ul>
<p><!-- Similar Posts took 12.179 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/04/06/1754-arduino-2-flash-socket-et-processing/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Arduino #1 : fabrique ta (presque) wiimote!</title>
		<link>http://www.lafabrick.com/blog/2010/04/06/1752-arduino-1-fabrique-ta-presque-wiimote/</link>
		<comments>http://www.lafabrick.com/blog/2010/04/06/1752-arduino-1-fabrique-ta-presque-wiimote/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 20:10:28 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Processing]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1752</guid>
		<description><![CDATA[Je vous propose un petit retour sur mes expérimentations autour de Arduino. On va créer une mini wiimote maison. Si si ! (Bon sans les boutons hein !) Pour ce petit tuto nous aurons besoin de : Un microcontrôleur Arduino Un accéléromètre (le &#171;&#160;3 axes&#160;&#187; de Sparkfun est très bien) Un jeu de connecteur mâle. [...]]]></description>
			<content:encoded><![CDATA[<p><center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/04/header.jpg" alt="arduino_header" title="arduino_header" width="520" height="130" class="aligncenter size-full wp-image-1793" /></center><br />
Je vous propose un petit retour sur mes expérimentations autour de Arduino. On va créer une mini wiimote maison. Si si ! (Bon sans les boutons hein !)</p>
<p>Pour ce petit tuto  nous aurons besoin de :</p>
<ul>
<li>Un microcontrôleur <a href="http://www.lextronic.fr/P4133-platine-arduino-usb-board.html">Arduino</a></li>
<li><a href="http://www.lextronic.fr/P5722-module-accelerometre-3-axes.html">Un accéléromètre</a> (le &laquo;&nbsp;3 axes&nbsp;&raquo; de Sparkfun est très bien)</li>
<li>Un jeu de <a href="http://www.lextronic.fr/P1321-connecteur-male-simple-rangee-1x20-pour-ci.html">connecteur mâle</a>.</li>
<li>Un peu d&#8217;étain</li>
<li>Un fer a souder pas pourri (ca vous évitera de transpirer pour souder, comme j&#8217;ai pu le faire&#8230;)</li>
</ul>
<p>Compter 26euros pour la platine Arduino USB de base, une 20euros pour l&#8217;accéléromètre, et 35 centimes les 20 connecteurs. L&#8217;étain et le fer à souder ce trouvent chez votre papa/oncle/pote/voisin (sinon chez votre pépé).<br />
<span id="more-1752"></span><br />
Si vous êtes guerrier, des platines Bluetooth existent, et des extensions super fun pour votre board (un <a href="http://www.liquidware.com/shop/show/TSL/TouchShield+Slide">mini écran tactile</a>, <a href="http://www.liquidware.com/shop/show/BP/Lithium+Backpack">un pack batterie lithium</a>,&#8230;.) Mais là on va faire simple pour cette article. Pour le reste, on verra plus tard.</p>
<h2>Un peu d&#8217;électronique</h2>
<p>En premier, nous devons souder les broches sur l&#8217;accéléromètre, histoire de pouvoir le fixer sur le microcontrôleur.<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/04/adxl.jpg" alt="arduino_adxl" title="arduino_adxl" width="400" height="400" class="aligncenter size-full wp-image-1794" /></center><br />
Noter la qualité incroyable de la soudure.</p>
<p>Ensuite, il faut fixer l&#8217;accéléromètre sur la platine. Arduino a 5 &laquo;&nbsp;pins&nbsp;&raquo; de connexion analogique. Il suffit de placer l&#8217;accéléromètre dessus. Le plus dur est de ne pas se tromper de sens.<br />
<center></p>
<table>
<tr>
<td><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/04/bien.jpg" alt="arduino_bien" title="arduino_bien" width="250" height="194" class="aligncenter size-full wp-image-1791" /></td>
<td><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/04/pas_bien.jpg" alt="arduino_pas_bien" title="arduino_pas_bien" width="250" height="194" class="aligncenter size-full wp-image-1792" /></td>
</tr>
<tr>
<td><center>Bien !</center></td>
<td><center>Pas Bien !</center></td>
</tr>
</table>
<p></center></p>
<p>Vous pouvez prendre un café.</p>
<h2>Ardu, I know</h2>
<p>Nous avons donc une magnifique platine, qui ne sait pas encore qu&#8217;elle a plein de talents pour se mouvoir gracieusement. Nous allons y remédier.</p>
<h3>Note préliminaire</h3>
<p>Nous avons fait les bricoleurs du Dimanche, mais je n&#8217;ai pas parlé de ce qu&#8217;est Arduino. C&#8217;est une plateforme de prototypage open source. C&#8217;est à dire un bidule électronique, qui vous sert de base pour tester un assemblage d&#8217;autres bidules électronique, plus ou moins complexe. C&#8217;est utilisé pour tout et n&#8217;importe quoi: la mise au point de carte électronique, la création de robot, l&#8217;utilisation dans l&#8217;univers artistique ou du modélisme (rien a voir, mais c&#8217;est ce que je fait). Donc une platine électronique. Avec une EEPROM que l&#8217;on peut programmer facilement, grâce à un jeu de libraire fourni.</p>
<p>La Programmation Arduino est basé sur Processing. C&#8217;est en fait du Java, version pas chiant, ou tout ce dont vous avez besoin est déjà là. Exit donc les Maven, Nexus et autre repository. On est là pour coder rigolo. (Ce qui ne vous empêche pas d&#8217;utiliser une librairie Java dans Processing, en la collant dans le répertoire des librairies: ça marche) </p>
<p>Les liens qui vont bien : </p>
<ul>
<li>Le site officiel : <a href="http://www.arduino.cc/">http://www.arduino.cc/</a></li>
<li>Getting Started, à lire de préférence, et surtout pour <b>l&#8217;installation du driver pour la Board</b> :
<ul>
<li><a href="http://arduino.cc/en/Guide/MacOSX">Mac</a></li>
<li><a href="http://arduino.cc/en/Guide/Windows">Windows</a></li>
<li><a href="http://www.arduino.cc/playground/Learning/Linux">Linux</a></li>
</ul>
<p></il>
</li>
<li><a href="http://arduino.cc/en/Tutorial/HomePage">Tutos et description des API standards</a></li>
</ul>
<p>Un programme Arduino s&#8217;articule autour de 2 fonctions principales : setup() qui va initialiser des trucs, et loop() qui va exécuter du code en boucle.</p>
<h3>setup</h3>
<p>Comme nous ne voulons pas que la platine fasse l&#8217;autiste, et qu&#8217;elle nous parle, nous allons lui demander d&#8217;envoyer des infos sur le port série.</p>
<pre class="brush: js">
void setup()
{
    // initialize the serial communications:
    Serial.begin(9600);
}
</pre>
<p>9600 est <del datetime="2010-09-23T18:32:17+00:00">le port sur lequel la platine va balancer ces infos</del> le débit, en bit/seconde (baud) de la transmission sur le port série. Vous pouvez choisir n&#8217;importe quelle autre port, ça ne me fait rien.<br />
Il faut ensuite lui indiquer quelle sont les &laquo;&nbsp;pins&nbsp;&raquo; qui vont l&#8217;alimenter (ouai, elle est un peu con con, mais c&#8217;est comme çà).</p>
<pre class="brush: js">
const int groundpin = 18;
const int powerpin = 19;
void setup()
{
    // initialize the serial communications:
    Serial.begin(9600);

    // initialize pins on the board
    pinMode(groundpin, OUTPUT);
    pinMode(powerpin, OUTPUT);
    digitalWrite(groundpin, LOW);
    digitalWrite(powerpin, HIGH);
}
</pre>
<h3>loop</h3>
<p>Dans cette boucle, nous allons lui demander de lire les infos analogiques via la méthode analogRead( pinNumber );<br />
Nous allons aussi &laquo;&nbsp;lisser&nbsp;&raquo; ces valeurs. Les valeurs analogiques sont exprimées en millivolts: c&#8217;est la variation électrique du circuit qui nous est restituée. Comme le circuit est très précis, les variations sont importantes. Il est donc utile de lisser les nouvelles valeurs par rapport aux anciennes. J&#8217;utilise un algorithme très simple. Pour plus de précision, il serait intéressant d&#8217;intégrer des formules de lissage plus complexes. Si vous avez des électroniciens autour de vous, ils pourront vous en parler.<br />
Enfin, nous envoyons ces valeurs sur le port série.</p>
<p>Le code complet :</p>
<pre class="brush: js">
const int groundpin = 18;                  // analog ground pin
const int powerpin = 19;                   //

const int xpin = 3;                        // x-axis of the accelerometer
const int ypin = 2;                        // y-axis
const int zpin = 1;                        // z-axis (only on 3-axis models)

int sensorx, sensory, sensorz = 0;         // store the values

int smoothedx, smoothedy, smoothedz = 0;  // smoothed results
int precision = 5;                        // amount of precision

void setup()
{
    // initialize the serial communications:
    Serial.begin(9600);

    // initialize pins on the board
    pinMode(groundpin, OUTPUT);
    pinMode(powerpin, OUTPUT);
    digitalWrite(groundpin, LOW);
    digitalWrite(powerpin, HIGH);

}

void loop()
{
    // read analogic data from input pin
    sensorx = analogRead(xpin);
    sensory = analogRead(ypin);
    sensorz = analogRead(zpin);

    // smothing values
    smoothedx = smoothedx + ((sensorx - smoothedx)/precision);
    smoothedy = smoothedy + ((sensory - smoothedy)/precision);
    smoothedz = smoothedz + ((sensorz - smoothedz)/precision);

    // send values on the Serial port
    Serial.print(smoothedx);
    Serial.print(&quot;,&quot;);
    Serial.print(smoothedy);
    Serial.print(&quot;,&quot;);
    Serial.print(smoothedz);
    Serial.println();

     delay(10);
}
</pre>
<p>On ajoute à la fin le delay(10); qui lui indique de cadencer la boucle loop toute les 10 millisecondes.<br />
Il ne vous reste plus qu&#8217;a uploader ce code dans votre platine. <a href="http://arduino.cc/en/Guide/Environment">Toutes les infos sous ce lien.</a></p>
<h2>Un peu de Processing</h2>
<p>Ce qu&#8217;il y a de bien avec Processing, c&#8217;est qu&#8217;on peut faire ce que l&#8217;on veut avec. Du joli graphisme,  à la reprogrammation de votre Micro-Onde pour qu&#8217;il congèle plus vite, vous avez de quoi faire. Là nous allons écouter le port série de notre platine Arduino pour lire les informations analogiques envoyées, et en faire quelque chose.<br />
L&#8217;IDE Processing se <a href=" http://processing.org/">télécharge ici</a>.<br />
Les étapes :</p>
<ul>
<li>Lister les ports série ouverts;</li>
<li>Se connecter sur celui qu&#8217;on veut;</li>
<li>Ecouter les événements provenant du port série;</li>
<li>Faire des trucs avec les données reçues.</li>
</ul>
<p>Processing c&#8217;est comme pour Arduino (normal c&#8217;est la même chose). Vous avez 2 fonctions principales : setup() et draw() (équivalent à loop() chez Arduino).</p>
<h3>RE:setup</h3>
<p>Pour le truc, nous allons initialiser une scène OpenGL (pour au final afficher un cube, et le faire bouger). Super!</p>
<pre class="brush: js">
void setup() {
    size( 800, 800, OPENGL );
}
</pre>
<p>Pour se connecter au port série, c&#8217;est extrêmement simple, Processing dispose d&#8217;une lib faite pour ça : processing.serial. Pour trouver le bon port, nous allons lister les ports série ouverts. Dans mon cas, la platine se connecte sur le port 0. Il suffit de récupérer le nom du port, créer une connexion série, et l&#8217;initialiser :</p>
<pre class="brush: js">
void setup() {
    size( 800, 800, OPENGL );

    println( Serial.list() );

    String usbPort = Serial.list()[0];
    port = new Serial(this, usbPort, 9600);

    port.bufferUntil(&#039;\n&#039;);

    port.write(65);
}
</pre>
<h3>Et je l&#8217;écoute comment le port série?</h3>
<p>Très bonne question ! En fait Processing et la librairie serial expose le port série entrant via la fonction serialEvent(Serial port). Vous n&#8217;avez pas de point d&#8217;écoute à monter. C&#8217;est magique, c&#8217;est pas chiant.<br />
Arduino nous envoie les valeurs sous forme de texte comme ceci : &laquo;&nbsp;valeurX,valeurY,valeurZ&nbsp;&raquo;. Nous devons donc lire le port série, et découper le texte, comme ci-dessous :</p>
<pre class="brush: js">
void serialEvent(Serial port) {

    String serialStr = port.readStringUntil(&#039;\n&#039;);
    serialStr = trim(serialStr);

    int values[] = int(split(serialStr, &#039;,&#039;));
    ...
</pre>
<p>Plus qu&#8217;a lire les infos contenu dans le tableau values[]<br />
(voir plus bas pour le code complet)</p>
<h3>draw (comme loop en fait)</h3>
<p>Pour le cube 3D, il faut placer un point de vue virtuel au centre de la scène, placer une lumière, créer le cube, rotationner le point de vue en fonction des valeurs de l&#8217;accéléromètre, et lui dire de recommencer toutes les 100 millisecondes. Ouf ! ça c&#8217;est de la phrase ! Heureusement en terme de code c&#8217;est moins long :</p>
<pre class="brush: js">
void draw() {

    background(0);
    stroke(255);
    translate(800/2,800/2,0);
    lights();

    rotateX(xvalue);
    rotateY(yvalue);
    box(300,300,300);

    delay(100);
}
</pre>
<h3>super total</h3>
<p>Le code complet pour la partie processing :</p>
<pre class="brush: js">
import processing.net.*;
import processing.opengl.*;
import processing.serial.*;

Serial port;

byte zero = 0;

float xvalue = 0;
float yvalue = 0;
float zvalue = 0;

void setup() {
    size( 800, 800, OPENGL );

    println( Serial.list() );

    String usbPort = Serial.list()[0];
    port = new Serial(this, usbPort, 9600);

    port.bufferUntil(&#039;\n&#039;);

    port.write(65);
}

void draw() {

    background(0);
    stroke(255);
    translate(800/2,800/2,0);
    lights();

    rotateX(xvalue);
    rotateY(yvalue);
    box(300,300,300);

    delay(100);
}

void serialEvent(Serial port) {

    String serialStr = port.readStringUntil(&#039;\n&#039;);
    serialStr = trim(serialStr);

    int values[] = int(split(serialStr, &#039;,&#039;));

    if( values.length == 3 ) {

        xvalue =calculate( values[0], 512 );
        yvalue = -calculate( values[1], 500 );

    }
}

float calculate( float returnValue, int baseValue ) {

    float diff = returnValue - baseValue;
    returnValue = (diff*90) / 115;

    // to radian
    returnValue = PI*returnValue/180;

    // trunc value
    returnValue = round( returnValue*100 );
    returnValue = returnValue /100;

    return returnValue;
}
</pre>
<p>Dans la fonction calculate, qui transforme les valeurs en volt vers des valeurs angulaires, vous verrez un truc bizarre. Je divise par 115 un nombre. Ce n&#8217;est pas du pifomètre ! En fait cette valeur correspond à la moitié de la variation en volt des valeurs. Plus clairement : Les valeurs analogiques varient entre un minimum et un maximum. Sur mon accéléromètre (un ADXL 335), les valeurs X et Y on une variation de 330 millivolts, avec comme valeur médiane 512 millivolts (soit une valeurs comprise entre 397 et 627 millivolts). Tout ceci est fonction de votre accéléromètre. Il vous faudra donc farfouiller dans les spécifications du circuit, qui doivent être disponibles là où vous l&#8217;achetez, pour connaître ces variations.</p>
<h2>Jouons !</h2>
<p>Voilà !<br />
Connectez votre platine, lancez votre programme Processing, et faites bouger le cube avec &laquo;&nbsp;rythm&nbsp;&raquo;.</p>
<p>Vous l&#8217;aurez peut être remarqué : je n&#8217;utilise que 2 axes de l&#8217;accéléromètre (x et y). Pour obtenir une information correcte sur l&#8217;axe z, il s&#8217;avère nécessaire d&#8217;avoir un gyroscope électronique : un DOF (Degree Of Liberty) comme on les appelle. Il en existe plein : 3DOF, 5DOF, &#8230; ils peuvent s&#8217;utiliser couplés à un accéléromètre, en connectant les axes du DOF et ceux de l&#8217;accéléromètre sur les mêmes &laquo;&nbsp;pins&nbsp;&raquo; analogiques de la board Arduino. Les calculateurs des 2 circuits, travaillant ensemble, vous retourneront les bonnes valeurs spatiales de la platine. Je vous ferais un p&#8217;tit article sur le sujet si cela vous intéresse.</p>
<p>2ème remarque, que vous avez forcement remarqué : je n&#8217;ai JAMAIS mis les mots FLASH ou FLEX dans cet article. &laquo;&nbsp;Ouaaa ! Quel exploit!&nbsp;&raquo;, &laquo;&nbsp;merci, merci! Cela m&#8217;a demandé beaucoup d&#8217;entraînement&nbsp;&raquo;. Rassurez vous : le prochain article va vous expliquer comment utiliser tout ce biniou électronique avec votre actionscript préféré, et surtout comment faire VOTRE serveur de port série. Classe ! (et finalement j&#8217;aurais quand même placer ces mots&#8230; Je suis faible)</p>
<p>Je vous invite fortement à lire (et écouter) <a href="http://www.electrofrog.com/">Vincent Maitray</a> dans ces <a href="http://www.flashxpress.net/tag/arduino/">UNBELIEVABLE articles</a> (featuring <a href="http://twitter.com/nicolasgans">Nicolas Gans</a>) concernant Arduino. Ca va loin, et vous aurez absolument toutes les cartes en main pour ajouter des p&#8217;tits boutons et avoir au final une VRAI wiimote &laquo;&nbsp;made by me&nbsp;&raquo;.<br />
Sinon vous avez un autre montage, version poilu, de &laquo;&nbsp;la Grotte du Barbu&nbsp;&raquo; <a href="http://www.lagrottedubarbu.com/2009/12/30/lagrottedubarbu-saison-02-episode-06-horlogeultrabinaire/">sous ce lien</a>.</p>
<p><center><b><a href="http://www.lafabrick.com/blog/2010/04/06/1754-arduino-2-flash-socket-et-processing">Aller! On continue!</a></b></center>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2006/10/22/10-youtube-soap-how-to-make-a-mouse-work-in-mid-air/" rel="bookmark" title="22 octobre 2006">La manette Wii sur mac / pc&#8230; enfin presque <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </a></li>
<li><a href="http://www.lafabrick.com/blog/2010/04/06/1754-arduino-2-flash-socket-et-processing/" rel="bookmark" title="6 avril 2010">Arduino #2 : Flash, socket et Processing</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/02/09/1964-uigfx-project-flex4-primitives-library-fireworks-extension/" rel="bookmark" title="9 février 2010">uigfx project : Flex4 primitives library / Fireworks extension</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/" rel="bookmark" title="4 mai 2010">UIGFX practice : a CircularSlider component</a></li>
</ul>
<p><!-- Similar Posts took 13.044 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/04/06/1752-arduino-1-fabrique-ta-presque-wiimote/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>uigfx project : Flex4 primitives library / Fireworks extension</title>
		<link>http://www.lafabrick.com/blog/2010/02/09/1964-uigfx-project-flex4-primitives-library-fireworks-extension/</link>
		<comments>http://www.lafabrick.com/blog/2010/02/09/1964-uigfx-project-flex4-primitives-library-fireworks-extension/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 10:40:17 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[graphics]]></category>
		<category><![CDATA[primitives]]></category>
		<category><![CDATA[skin]]></category>
		<category><![CDATA[Spark]]></category>
		<category><![CDATA[uigfx]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1964</guid>
		<description><![CDATA[I just released a new project, called by Erick uigfx, that I have introduced in my previous post (in french). So : it&#8217;s a Flex4 primitives&#8217;s library, which allows you to extend standard graphics primitives. It&#8217;s also one (and more soon) Fireworks extension to accelerate and improve the workflow between designer and developer. The existence [...]]]></description>
			<content:encoded><![CDATA[<p>I just released a<a href="http://code.google.com/p/uigfx/"> new project</a>, called by <a href="http://twitter.com/rick_lafabrick">Erick</a> <b>uigfx</b>, that I have introduced in my previous post (in french).<br />
So : it&#8217;s a Flex4 primitives&#8217;s library, which allows you to extend standard graphics primitives. It&#8217;s also one (and more soon) Fireworks extension to accelerate and improve the workflow between designer and developer.<br />
The existence of this library have just this idea: improve the work processes between teams around a Flex4 project.<br />
<span id="more-1964"></span></p>
<h2>uigfx library</h2>
<h3>ExclusionRect</h3>
<p>Draw a rectangle with rounded corners (&laquo;&nbsp;radius&nbsp;&raquo; property), with a rounded rectangular punch optional.<br />
The roundness of the inner rectangle is defined by &laquo;&nbsp;innerRadius&nbsp;&raquo; property.<br />
Constraints of the inner rectangle are defined with &laquo;&nbsp;innerTop&nbsp;&raquo;, &laquo;&nbsp;innerBottom, &laquo;&nbsp;innerLeft&nbsp;&raquo; and &laquo;&nbsp;innerRight&nbsp;&raquo; properties.<br />
Sample :</p>
<pre class="brush: xml">
&lt;uigfx:ExclusionRect
    radius=&quot;10&quot;
    innerRadius=&quot;30&quot;
    top=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot; bottom=&quot;0&quot;
    innerTop=&quot;0&quot; innerBottom=&quot;20&quot; innerLeft=&quot;0&quot; innerRight=&quot;20&quot;&gt;

    &lt;uigfx:fill&gt;
        &lt;s:LinearGradient rotation=&quot;90&quot;&gt;
            &lt;s:GradientEntry color=&quot;#212121&quot; ratio=&quot;0&quot; /&gt;
            &lt;s:GradientEntry color=&quot;#313131&quot; ratio=&quot;1&quot;/&gt;
        &lt;/s:LinearGradient&gt;
    &lt;/uigfx:fill&gt;

    &lt;uigfx:filters&gt;
        &lt;s:DropShadowFilter color=&quot;#000000&quot; inner=&quot;true&quot;
            distance=&quot;1&quot; blurX=&quot;4&quot; blurY=&quot;4&quot;
            quality=&quot;3&quot; alpha=&quot;0.8&quot; /&gt;
    &lt;/uigfx:filters&gt;

&lt;/uigfx:ExclusionRect&gt;
</pre>
<p>Result :<br />
<center><img alt="excluded rectangle" src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/excludedrect.png" title="excludedRect" class="aligncenter" width="239" height="238" /></center></p>
<h3>PointsPath</h3>
<p>This primitive allows you to draw a path, based on a list of points(ConstraintPoint). <br />Additionally, you can set a roundness to your primitive using the &laquo;&nbsp;radius&nbsp;&raquo; property</p>
<p>A PointsPath can be defined as &laquo;&nbsp;not closed&nbsp;&raquo; : in this case you can use the &laquo;&nbsp;closedPath&nbsp;&raquo; property and set it to false :</p>
<pre class="brush: xml">
&lt;uigfx:PointsPath radius=&quot;60&quot; closedPath=&quot;false&quot;&gt;
   ...
&lt;/uigfx:PointsPath&gt;
</pre>
<h4>Using constraint point</h4>
<p>The ConstraintPoint class defines a point with constraints values (left, horizontalCenter, right; and top, verticalCenter, bottom) </p>
<pre class="brush: xml">
&lt;uigfx:ConstraintPoint top=&quot;0&quot; horizontalCenter=&quot;0&quot; /&gt;
</pre>
<p>Every single value can be expressed as a percentage, setting &laquo;&nbsp;valuesInPercent&nbsp;&raquo; property to &laquo;&nbsp;true&nbsp;&raquo; (by default, all values are expressed in pixel) :</p>
<pre class="brush: xml">
&lt;uigfx:ConstraintPoint valuesInPercent=&quot;true&quot; top=&quot;10&quot; horizontalCenter=&quot;-25&quot; /&gt;
</pre>
<h4>Sample</h4>
<p>Draw a five branch star, with a rounded contour (&laquo;&nbsp;radius&nbsp;&raquo; property), and constraints points vector :</p>
<pre class="brush: xml">
&lt;uigfx:PointsPath
    radius=&quot;60&quot; width=&quot;100%&quot; height=&quot;100%&quot;
    horizontalCenter=&quot;0&quot; verticalCenter=&quot;0&quot;&gt;

    &lt;uigfx:points&gt;
        &lt;uigfx:ConstraintPoint top=&quot;0&quot; horizontalCenter=&quot;0&quot; /&gt;
        &lt;uigfx:ConstraintPoint horizontalCenter=&quot;25&quot; verticalCenter=&quot;-25&quot;/&gt;
        &lt;uigfx:ConstraintPoint right=&quot;0&quot; verticalCenter=&quot;-25&quot; /&gt;
        &lt;uigfx:ConstraintPoint horizontalCenter=&quot;40&quot; verticalCenter=&quot;25&quot; /&gt;
        &lt;uigfx:ConstraintPoint right=&quot;40&quot; bottom=&quot;0&quot; /&gt;
        &lt;uigfx:ConstraintPoint horizontalCenter=&quot;0&quot; verticalCenter=&quot;40&quot; /&gt;
        &lt;uigfx:ConstraintPoint left=&quot;40&quot; bottom=&quot;0&quot; /&gt;
        &lt;uigfx:ConstraintPoint horizontalCenter=&quot;-40&quot; verticalCenter=&quot;25&quot; /&gt;
        &lt;uigfx:ConstraintPoint left=&quot;0&quot; verticalCenter=&quot;-25&quot; /&gt;
        &lt;uigfx:ConstraintPoint horizontalCenter=&quot;-25&quot; verticalCenter=&quot;-25&quot; /&gt;
    &lt;/uigfx:points&gt;

    &lt;uigfx:fill&gt;
        &lt;s:SolidColor color=&quot;#353535&quot; /&gt;
    &lt;/uigfx:fill&gt;

    &lt;uigfx:filters&gt;
        &lt;s:DropShadowFilter color=&quot;#000000&quot; inner=&quot;true&quot; distance=&quot;1&quot;
            blurX=&quot;4&quot; blurY=&quot;4&quot;
            quality=&quot;3&quot; alpha=&quot;0.8&quot; /&gt;
    &lt;/uigfx:filters&gt;

&lt;/uigfx:PointsPath&gt;
</pre>
<p>Result :<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/02/fivestar.png" alt="fivestar" title="fivestar" width="291" height="324" class="aligncenter size-full wp-image-1557" /></center></p>
<h3>ComplexPointsPath</h3>
<p>This primitive allows you to draw a path with one or more contours, defined by ComplexConstraintPoint points. </p>
<h4>Define a complex point</h4>
<p>The ComplexConstraintPoint class defines a vector with a constraint position, and the position of its bezier curves list.<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/02/vectoranchor.png" alt="vectoranchor" title="vectoranchor" width="291" height="191" class="aligncenter size-full wp-image-1553" /></center><br />
The position of bezier curves is defined by vertical and horizontal offsets as below :<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/02/vectoranchoroffset.png" alt="vectoranchoroffset" title="vectoranchoroffset" width="229" height="263" class="aligncenter size-full wp-image-1554" /></center><br />
In mxml : </p>
<pre class="brush: xml">
&lt;uigfx:ComplexConstraintPoint
    horizontalCenter=&quot;-48&quot; verticalCenter=&quot;-59&quot;
    nextAnchorOffsetX=&quot;-2&quot; nextAnchorOffsetY=&quot;4&quot;
    prevAnchorOffsetX=&quot;7&quot; prevAnchorOffsetY=&quot;-6&quot; /&gt;
</pre>
<p>Just like the ConstraintPoint, all values can be expressed in percentage :</p>
<pre class="brush: xml">
&lt;uigfx:ComplexConstraintPoint
    valuesInPercent=&quot;true&quot;
    top=&quot;10&quot; horizontalCenter=&quot;-25&quot;
    nextAnchorOffsetX=&quot;-2&quot; nextAnchorOffsetY=&quot;4&quot;
    prevAnchorOffsetX=&quot;7&quot; prevAnchorOffsetY=&quot;-6&quot; /&gt;
</pre>
<h4>Single contour</h4>
<p>Draw a path with a complex contour :</p>
<pre class="brush: xml">
&lt;uigfx:ComplexPointsPath top=&quot;0&quot; bottom=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot; &gt;
    &lt;uigfx:points&gt;
        &lt;uigfx:ComplexConstraintPoint left=&quot;0&quot; prevAnchorOffsetX=&quot;4.59&quot; top=&quot;36&quot; prevAnchorOffsetY=&quot;5.36&quot; /&gt;
        &lt;uigfx:ComplexConstraintPoint left=&quot;0&quot; bottom=&quot;0&quot; /&gt;
        &lt;uigfx:ComplexConstraintPoint horizontalCenter=&quot;-35&quot; bottom=&quot;0&quot; /&gt;
        &lt;uigfx:ComplexConstraintPoint horizontalCenter=&quot;-23&quot; bottom=&quot;18&quot; /&gt;
        &lt;uigfx:ComplexConstraintPoint horizontalCenter=&quot;3&quot; bottom=&quot;2&quot; /&gt;
        &lt;uigfx:ComplexConstraintPoint horizontalCenter=&quot;2&quot; bottom=&quot;0&quot; /&gt;
        &lt;uigfx:ComplexConstraintPoint right=&quot;0&quot; bottom=&quot;0&quot; /&gt;
        &lt;uigfx:ComplexConstraintPoint right=&quot;0&quot; top=&quot;0&quot; /&gt;
        &lt;uigfx:ComplexConstraintPoint left=&quot;34&quot; nextAnchorOffsetX=&quot;6.07&quot; top=&quot;0&quot; nextAnchorOffsetY=&quot;4.56&quot; /&gt;
        &lt;uigfx:ComplexConstraintPoint left=&quot;44&quot; top=&quot;20&quot; nextAnchorOffsetY=&quot;13.81&quot; prevAnchorOffsetY=&quot;-8.18&quot; /&gt;
        &lt;uigfx:ComplexConstraintPoint left=&quot;19&quot; nextAnchorOffsetX=&quot;-7.6&quot; prevAnchorOffsetX=&quot;13.81&quot; top=&quot;45&quot; /&gt;
    &lt;/uigfx:points&gt;

    &lt;uigfx:stroke&gt;
        &lt;s:SolidColorStroke color=&quot;#ffffff&quot; weight=&quot;1&quot; /&gt;
    &lt;/uigfx:stroke&gt;

    &lt;uigfx:fill&gt;
        &lt;s:LinearGradient rotation=&quot;90&quot;&gt;
            &lt;s:GradientEntry color=&quot;#333333&quot; ratio=&quot;0&quot; alpha=&quot;1&quot;/&gt;
            &lt;s:GradientEntry color=&quot;#212121&quot; ratio=&quot;1&quot; alpha=&quot;1&quot;/&gt;
        &lt;/s:LinearGradient&gt;
    &lt;/uigfx:fill&gt;

    &lt;uigfx:filters&gt;
        &lt;s:GlowFilter color=&quot;#000000&quot; blurX=&quot;12&quot; blurY=&quot;12&quot; alpha=&quot;0.65&quot;/&gt;
    &lt;/uigfx:filters&gt;
&lt;/uigfx:ComplexPointsPath&gt;
</pre>
<p>result :<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/02/complexpath.png" alt="complexpath" title="complexpath" width="316" height="115" class="aligncenter size-full wp-image-1556" /></center></p>
<h4>Multiples contours</h4>
<p>Draw a path with multiples contours.<br />
Each Contour object defines a part of the path. Basically, it&#8217;s used to process pathfinding, such as union or exclusion.<br />
Each contour is defined on a Contour object, through the &laquo;&nbsp;contours&nbsp;&raquo; collection property. Like PointsPath, a Contour can be defined as unclosed, using &laquo;&nbsp;closedContour&nbsp;&raquo; property :</p>
<pre class="brush: xml">
&lt;uigfx:ComplexPointsPath top=&quot;0&quot; bottom=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot; &gt;
    &lt;uigfx:contours&gt;
        &lt;uigfx:Contour closedContour=&quot;false&quot;&gt;
            &lt;uigfx:points&gt;
            ...
</pre>
<p>Below a complete sample code : </p>
<pre class="brush: xml">
&lt;uigfx:ComplexPointsPath top=&quot;0&quot; bottom=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot; &gt;
    &lt;uigfx:contours&gt;
        &lt;uigfx:Contour&gt;
            &lt;uigfx:points&gt;
                &lt;uigfx:ComplexConstraintPoint left=&quot;0&quot; prevAnchorOffsetX=&quot;4.59&quot; top=&quot;36&quot; prevAnchorOffsetY=&quot;5.36&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint left=&quot;0&quot; bottom=&quot;0&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint horizontalCenter=&quot;-35&quot; bottom=&quot;0&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint horizontalCenter=&quot;-23&quot; bottom=&quot;18&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint horizontalCenter=&quot;3&quot; bottom=&quot;2&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint horizontalCenter=&quot;2&quot; bottom=&quot;0&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint right=&quot;0&quot; bottom=&quot;0&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint right=&quot;0&quot; top=&quot;0&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint left=&quot;34&quot; nextAnchorOffsetX=&quot;6.07&quot; top=&quot;0&quot; nextAnchorOffsetY=&quot;4.56&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint left=&quot;44&quot; top=&quot;20&quot; nextAnchorOffsetY=&quot;13.81&quot; prevAnchorOffsetY=&quot;-8.18&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint left=&quot;19&quot; nextAnchorOffsetX=&quot;-7.6&quot; prevAnchorOffsetX=&quot;13.81&quot; top=&quot;45&quot; /&gt;
            &lt;/uigfx:points&gt;
        &lt;/uigfx:Contour&gt;
        &lt;uigfx:Contour&gt;
            &lt;uigfx:points&gt;
                &lt;uigfx:ComplexConstraintPoint right=&quot;96&quot; top=&quot;18&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint right=&quot;68&quot; top=&quot;9&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint right=&quot;59&quot; top=&quot;37&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint right=&quot;87&quot; top=&quot;46&quot; /&gt;
            &lt;/uigfx:points&gt;
        &lt;/uigfx:Contour&gt;
        &lt;uigfx:Contour&gt;
            &lt;uigfx:points&gt;
                &lt;uigfx:ComplexConstraintPoint right=&quot;49&quot; bottom=&quot;28&quot; nextAnchorOffsetY=&quot;-11.87&quot; prevAnchorOffsetY=&quot;11.87&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint right=&quot;28&quot; nextAnchorOffsetX=&quot;11.87&quot; prevAnchorOffsetX=&quot;-11.87&quot; bottom=&quot;49&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint right=&quot;6&quot; bottom=&quot;28&quot; nextAnchorOffsetY=&quot;11.87&quot; prevAnchorOffsetY=&quot;-11.87&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint right=&quot;28&quot; nextAnchorOffsetX=&quot;-11.87&quot; prevAnchorOffsetX=&quot;11.87&quot; bottom=&quot;6&quot; /&gt;
            &lt;/uigfx:points&gt;
        &lt;/uigfx:Contour&gt;
    &lt;/uigfx:contours&gt;

    &lt;uigfx:stroke&gt;
        &lt;s:SolidColorStroke color=&quot;#ffffff&quot; weight=&quot;2&quot; /&gt;
    &lt;/uigfx:stroke&gt;

    &lt;uigfx:fill&gt;
        &lt;s:LinearGradient rotation=&quot;90&quot;&gt;
            &lt;s:GradientEntry color=&quot;#333333&quot; ratio=&quot;0&quot; alpha=&quot;1&quot;/&gt;
            &lt;s:GradientEntry color=&quot;#212121&quot; ratio=&quot;1&quot; alpha=&quot;1&quot;/&gt;
        &lt;/s:LinearGradient&gt;
    &lt;/uigfx:fill&gt;

    &lt;uigfx:filters&gt;
       &lt;s:GlowFilter color=&quot;#000000&quot; blurX=&quot;12&quot; blurY=&quot;12&quot; alpha=&quot;0.65&quot;/&gt;
    &lt;/uigfx:filters&gt;
&lt;/uigfx:ComplexPointsPath&gt;
</pre>
<p>Result :<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/02/complexpathmultiples.png" alt="complexpathmultiples" title="complexpathmultiples" width="309" height="222" class="aligncenter size-full wp-image-1555" /></center></p>
<h2>An Extension for Fireworks</h2>
<p>This library would not be complete without an export tools for Fireworks. Have a complex primitive is good, but how to find all the points and bezier curves without a headache? It&#8217;s the goal of this extension!</p>
<p>At this moment the exporter is able to : </p>
<ul>
<li>exports all paths and rectangles</li>
<li>exports strokes</li>
<li>exports fills (solid color and gradient)</li>
<li>exports filters (gaussian blur, glow, drop shadow) </li>
</ul>
<p>But for now, this exporter can&#8217;t :</p>
<ul>
<li>exports text </li>
</ul>
<h3>Installation</h3>
<p>Simply <a href="https://code.google.com/p/uigfx/downloads/list">download the extension</a> (uigfx.mxp), and double click on it to launch the Extension Manager. The installation is automatic. Now, open Fireworks, and open the primitives exporter panel in  &laquo;&nbsp;<b>Window > uigfx</b>&laquo;&nbsp;.</p>
<h3>How to use this extension</h3>
<ul>
<li><b>Make your design</b></li>
<li><b>Generate and place rules</b><br />
You&#8217;ill need 4 vertical rules and 4 horizontal rules to determine all constraints positions of each vector point. You can click on the &laquo;&nbsp;generate rules button&nbsp;&raquo;, to put the rules around your selection (you need to select one or more objects). Move the rules, in order to have all vectors in the good area, like below : <br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/02/constraintsposition.jpg" alt="constraintsposition" title="constraintsposition" width="567" height="401" class="aligncenter size-full wp-image-1558" /></center></li>
<li><b>Export</b><br />
Click on the export button to export all selections. The exporter follows rules placement to determine vectors positions. If there&#8217;s no selection, all layers are exported. Of course, you will have to provide a name for the output file and a directory to save it in.<br />
Finally, an mxml file, containing a Spark Skin with all uigfx primitives, will be created. And voila !</li>
</ul>
<p><b>This project is <a href="http://code.google.com/p/uigfx/">hosted on google code</a>.</b>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2009/12/04/1453-flex4-skin-et-primitives/" rel="bookmark" title="4 décembre 2009">Flex4 : skin et primitives</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/23/1989-primitive-dashedline-une-petite-ligne-bien-utile/" rel="bookmark" title="23 juillet 2010">Primitive DashedLine : une petite ligne bien utile</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/" rel="bookmark" title="4 mai 2010">UIGFX practice : a CircularSlider component</a></li>
<li><a href="http://www.lafabrick.com/blog/2011/06/23/2598-fireworks-javascript-spark-skin-pleasure/" rel="bookmark" title="23 juin 2011">Fireworks + Javascript = Spark Skin Pleasure !</a></li>
</ul>
<p><!-- Similar Posts took 12.348 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/02/09/1964-uigfx-project-flex4-primitives-library-fireworks-extension/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex4 : skin et primitives</title>
		<link>http://www.lafabrick.com/blog/2009/12/04/1453-flex4-skin-et-primitives/</link>
		<comments>http://www.lafabrick.com/blog/2009/12/04/1453-flex4-skin-et-primitives/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 16:52:36 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[FlashBuilder]]></category>
		<category><![CDATA[flex4]]></category>
		<category><![CDATA[skinning]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[UI Design]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1453</guid>
		<description><![CDATA[Dans le dernier article, nous avons fait un petit tour d’horizon du nouveau système de skin de Flex4. J’ai brièvement présenté EazeElement que j’utilise dans l’article. Nous allons maintenant rentrer un peu plus profondément dans les primitives, qui vous permettent de créer vos propres formes et autres éléments graphiques personnalisés. Retour sur les primitives Dans [...]]]></description>
			<content:encoded><![CDATA[<p><center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/bandeauskinprimitive.jpg" alt="bandeauskinprimitive" title="bandeauskinprimitive" width="520" height="132" class="aligncenter size-full wp-image-1480" /></center><br />
Dans le dernier article, nous avons fait un petit tour d’horizon du nouveau système de skin de Flex4. J’ai brièvement présenté EazeElement que j’utilise dans l’article. Nous allons maintenant rentrer un peu plus profondément dans les primitives, qui vous permettent de créer vos propres formes et autres éléments graphiques personnalisés.<br />
<span id="more-1453"></span></p>
<h2>Retour sur les primitives</h2>
<p>Dans Flex4, une Skin est une agglomération d’éléments graphiques, définis avec un type de ligne, de fond, et des filtres. L&#8217;objet graphique final est une superposition de rectangles, de lignes, d&#8217;ellipses, d’images, de formes complexes.</p>
<p>Intéressons nous à celles qui utilisent directement l’API de dessin : Rect, Ellipse, Line, Path</p>
<h3>Comment ça marche?</h3>
<p>L’architecture des primitives utilisant l’API de dessin est la suivante :<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/organigrammeprimitives.png" alt="organigrammeprimitives" title="organigrammeprimitives" width="652" height="379" class="aligncenter size-full wp-image-1464" /></center></p>
<h4>Les classes de bases : </h4>
<ul>
<li><strong>GraphicElement</strong> : la base des primitives. Cette classe définit les tailles et positionnement de l’objet dans l’espace, avec ses contraintes de position. Les getters protégés drawX et drawY, utilisés par toutes les primitives, renvoient la position réelle en x et y de l’objet.</li>
<li><strong>StrokedElement</strong> : définit le Stroke (interface mx.graphics.IStroke), l’apparence de la ligne, de la primitive. La base des méthodes de dessin est présente : beginDraw, draw, endDraw. La méthode beginDraw applique le style du Stroke dans l’élément graphique Graphics de la primitive.</li>
<li><strong>FilledElement</strong> : définit le Fill (interface mx.graphics.IFill), l’apparence du fond, de la primitives. La méthode beginDraw prépare l’objet graphique en appliquant la ligne Stroke et le fond Fill. A ce niveau, la méthode draw n’effectue aucun tracé.</li>
</ul>
<p>Les primitives :</p>
<ul>
<li><strong>Line</strong> : (extension de StrokedElement) dessine une ligne, passant par 2 points (xFrom/yFrom et xTo/yTo). Si votre ligne est encadrée dans des contraintes top, bottom, left, right; la ligne dessinée sera une diagonale, respectant les contraintes top/left et bottom/right;</li>
<li><strong>Ellipse</strong> : (extension de FilledElement) dessine une ellipse définie par ses contraintes de positionnement;</li>
<li><strong>Rect</strong> : (extension de FilledElement) dessine un rectangle défini par ses contraintes de positionnement. Sa particularité est de pouvoir définir des rayons de courbure globaux (radiusX/radiusY), ou localisés aux angles du rectangle (topLeftRadiusX/topLeftRadiusY, bottomLeftRadiusX/bottomLeftRadiusY, &#8230;).</li>
<li><strong>Path</strong> : (extension de FilledElement) dessine une forme complexe, définie dans une propriété data. Cette source utilise la syntaxe SVG.</li>
</ul>
<h2>Digression : Définition et obtention d’un “data Path”</h2>
<p>Le “data source” d’une primitive Path est définit par un code, identique à celui utilisé dans le format vectoriel SVG. Ce code ressemble a celui-ci :<br />
 <strong>M 8 4 C 8 4 15 4 15 4 L 15 0 L 27 8 L 15 15 L 15 11 L 8 11 L 8 11 L 8 11 L 0 11 C 0 11 0 11 0 11 C 0 7 3 4 8 4 Z </strong></p>
<p>Il représente une flèche avec un bord arrondi, d’une largeur de 27 pixels, et une hauteur de 15 pixels. </p>
<h3>Fonctionnement du code</h3>
<p>c’est une succession de commandes (définies par des lettres), et de positions de points (les chiffres) en pixels utilisées par la commande.</p>
<p>Les différentes commandes sont :</p>
<ul>
<li><strong>M</strong> : <em>Move</em>, déplacement de la ligne vers le point définit par le couple de chiffres suivant. Exemple : “M 8 4” déplace le point courant de la ligne à la position x=8 et y=4. C’est toujours la première commande du code.</li>
<li><strong>L</strong> : <em>Line</em>, création d’une ligne, avec comme point de destination le couple de chiffres suivant. Exemple “ L 15 11” crée la ligne depuis le point précédent, vers le point x=15 et y 11.</li>
<li><strong>H</strong> : <em>Horizontal Line</em>, identique à la commande L, à la différence que seul le point de destination x est nécessaire. Exemple : “H 15” construit une ligne horizontale depuis le point précédent, vers le point x=15.</li>
<li><strong>V</strong> : <em>Vertical Line</em>, identique à la commande H, en vertical.</li>
<li><strong>Q</strong> : <em>Quadratic Bezier</em>, création d’une ligne courbe, a partir du précédent point, à destination du point définit par le dernier couple x/y, et passant par le point de contrôle définit par le premier couple x/y. exemple : “Q 15 11 20 22” la ligne est créée entre le point précédent et le point x=20, y=22, en passant par le point de contrôle x=15, y=11;</li>
<li><strong>C</strong> : <em>Cubic Bezier</em>, identique à la commande Q, à la différence que la ligne passe par un point de contrôle supplémentaire. Exemple : “ C 0 7 3 4 8 4” la ligne est créée entre le point précédent et le point x=8 / y=4, en passant par un premier point de contrôle x=0, y=7, et un second x=3, y=4;</li>
<li><strong>Z</strong> : <em>Close</em>, définit la fermeture de la forme. C’est aussi le dernier code du data.</li>
</ul>
<h3>Obtenir un code à partir d’une forme</h3>
<p>La meilleur méthode pour obtenir le code de votre forme vectorielle est de passer par Fireworks. Je vous recommande fortement d’utiliser ce logiciel pour vos créations d’interface, car très complet, performant, et beaucoup plus adapté à la création graphique web que Photoshop ou Illustrator. </p>
<p>Fireworks, depuis la CS4, dispose d’une commande d’exportation FXG. Vous pouvez la trouver sous “<strong>Commandes</strong>” > “<strong>Exporter au format FXG</strong>”.</p>
<p>Il vous suffit de sélectionner votre forme, (si rien n’est sélectionné, c’est la totalité du document, y compris les calques masqué, qui sera exporté), et de lancer la commande d’exportation.<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/flechefireworks.png" alt="flechefireworks" title="flechefireworks" width="520" height="269" class="aligncenter size-full wp-image-1461" /></center><br />
Vous obtenez un document de ce type : </p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;Graphic version=&quot;1.0&quot;
    xmlns=&quot;http://ns.adobe.com/fxg/2008&quot;
    xmlns:d=&quot;http://ns.adobe.com/fxg/2008/dt&quot;
    xmlns:fc=&quot;http://ns.adobe.com/flashcatalyst/2009&quot;
    viewHeight= &quot;40&quot; viewWidth= &quot;150&quot;&gt;
    &lt;Library&gt;

        &lt;Definition name=&quot;Selection&quot;&gt;
            &lt;Group d:userLabel=&quot;Symbol&quot;&gt;
                &lt;Group d:userLabel=&quot;Group_0&quot;&gt;
                    &lt;Path winding=&quot;evenOdd&quot;
                    data=&quot;M 8 4 C 8 4 15 4 15 4 L 15 0 L 27 8 L 15 15 L 15 11 L 8 11 L 8 11 L 8 11 L 0 11 C 0 11 0 11 0 11 C 0 7 3 4 8 4 Z &quot;
                    blendMode=&quot;normal&quot; alpha=&quot;1&quot;&gt;
                        &lt;fill&gt;
                            &lt;SolidColor color=&quot;#b8b3af&quot;/&gt;
                        &lt;/fill&gt;
                    &lt;/Path&gt;
                &lt;/Group&gt;
            &lt;/Group&gt;
        &lt;/Definition&gt;
    &lt;/Library&gt;
    &lt;Selection x=&quot;0&quot; y=&quot;0&quot; /&gt;
&lt;/Graphic&gt;
</pre>
<p>Copiez le data du noeud &lt;Path /&gt;, et utilisez le dans votre skin comme dans cette exemple : </p>
<pre class="brush: xml">
&lt;s:Path
    top=&quot;0&quot; left=&quot;0&quot;
    data=&quot;M 8 4 C 8 4 15 4 15 4 L 15 0 L 27 8 L 15 15 L 15 11 L 8 11 L 8 11 L 8 11 L 0 11 C 0 11 0 11 0 11 C 0 7 3 4 8 4 Z &quot;&gt;

    &lt;s:fill&gt;
        &lt;s:LinearGradient rotation=&quot;90&quot;&gt;
            &lt;s:GradientEntry color.selected=&quot;#FCD301&quot; color=&quot;#F7F7F7&quot; ratio=&quot;0&quot; /&gt;
            &lt;s:GradientEntry color.selected=&quot;#F19000&quot; color=&quot;#C2C6C7&quot; ratio=&quot;1&quot; /&gt;
        &lt;/s:LinearGradient&gt;
    &lt;/s:fill&gt;
    &lt;s:filters&gt;
        &lt;s:DropShadowFilter color=&quot;#000000&quot;
            distance=&quot;1&quot;
            blurX=&quot;4&quot; blurY=&quot;4&quot; quality=&quot;3&quot;
            alpha=&quot;0.8&quot; /&gt;
    &lt;/s:filters&gt;

&lt;/s:Path&gt;
</pre>
<h3>Et maintenant?</h3>
<p>L’idée serait de pouvoir créer des primitives, spécialisées ou non, utilisables dans un contexte de composants très précis, comme la primitive EazeElement du dernier article; ou dans une perspective plus globale, type librairie&#8230; Allons-y <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Un trou dans mon Rectangle</h2>
<p>Il peut être intéressant dans certains cas d’avoir un “trou” dans un rectangle. Pour créer par exemple une bordure qui pourrait avoir un Stroke ET un Fill. C’est ce que j’ai fais ici.</p>
<p>Pour obtenir un rectangle “troué” avec l’api de dessin, c’est extrêmement simple : il suffit de dessiner 2 rectangles l’un dans l’autre, à la suite : les points de vecteurs faisant partie du même chemin, cela génère l’exclusion du rectangle 2 dans le rectangle 1.<br />
<center></p>
<table>
<tr>
<td><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/forme1-150x150.png" alt="forme1" title="forme1" width="150" height="150" class="aligncenter size-thumbnail wp-image-1462" /></td>
<td><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/forme2-150x150.png" alt="forme2" title="forme2" width="150" height="150" class="aligncenter size-thumbnail wp-image-1463" /></td>
</tr>
</table>
<p></center><br />
Bon c’est une méthode rapide, mais qui est suffisante pour nos besoin&#8230; Nous ne sommes pas en train de coder un outil de Pathfinding !</p>
<h3>Dessin de rectangle</h3>
<p>Au lieu d’utiliser les méthodes de dessin de rectangle fournies par Flex, j’utilise celle proposée par <a href="http://twitter.com/elsassph">Philippe Elsass</a>. Performante, elle m’évite de recourir au méthode de base, qui lance des contrôles de positions évitable.<br />
Pour plus d’information sur son fonctionnement, je vous invite à vous rendre <a href="http://philippe.elsass.me/2009/05/as3-rounding-corners/">sur cette explication</a>.</p>
<p>La méthode utlisée dans la librairie, que j&#8217;expose ci-après, <a href="http://www.lafabrick.com/projects/uigfx-lib/sample/srcview/source/uigfx/src/com/lafabrick/uigfx/utils/UigfxUtils.as.html">derrière ce lien</a>.</p>
<h3>La primitive ExclusionRect</h3>
<p>Donc nous avons besoin de 2 rectangles. Le premier est celui qui correspond aux contraintes de positionnement de base de la primitive. J’utilise une petite méthode getOutterVectorPoint qui me renvoie le vecteur définissant les points de ce rectangle. Le second rectangle, celui définissant la zone à exclure, à lui besoin de contraintes spécifiques, que j’ai ajouté dans la classe (innerTop, innerRight, innerLeft, innerBottom). la méthode getInnerVectorPoint remplit la même fonction que getOutterVectorPoint. Dans l’override de la méthode draw, celle qui “dessine”, les 2 rectangles sont créés l’un après l‘autre. Cela donne : </p>
<pre class="brush: js">
/**
 * Return the Vector of Point for the rectangle
 */
protected function getOutterVectorPoint() : Vector.&lt;Point&gt;
{
    var vector : Vector.&lt;Point&gt; = new Vector.&lt;Point&gt;();
    vector.push( new Point( drawX, drawY ) );
    vector.push( new Point( drawX+width, drawY ) );
    vector.push( new Point( drawX+width, drawY+height ) );
    vector.push( new Point( drawX, drawY+height ) );
    return vector;
}
/**
 * Return the Vector of Point for the inner rectangle
 */
protected function getInnerVectorPoint() : Vector.&lt;Point&gt;
{
    var vector : Vector.&lt;Point&gt; = new Vector.&lt;Point&gt;();
    vector.push( new Point( drawX+innerLeft, drawY+innerTop ) );
    vector.push( new Point( drawX+width-innerRight, drawY+innerTop ) );
    vector.push( new Point( drawX+width-innerRight, drawY+height-innerBottom) );
    vector.push( new Point( drawX+innerLeft, drawY+height-innerBottom ) );
    return vector;
}

/**
 * Draw the rectangle
 * @see com.lafabrick.uigfx.utils.UigfxUtils
 */
override protected function draw(g:Graphics) : void
{
    UigfxUtils.drawRoundPath( g, getOutterVectorPoint(), radius, true );

    if( enableExclusion ) {
        UigfxUtils.drawRoundPath( g, getInnerVectorPoint(), innerRadius, true );
    }
}
</pre>
<h3>Utilisation</h3>
<p>L’utilisation est très proche de celle de Rect, avec les contraintes et radius intérieur : </p>
<pre class="brush: xml">
&lt;primitives:ExclusionRect id=&quot;excl&quot;
    radius=&quot;10&quot;
    innerRadius=&quot;30&quot;
    top=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot; bottom=&quot;0&quot;
    innerTop=&quot;0&quot; innerBottom=&quot;20&quot; innerLeft=&quot;0&quot; innerRight=&quot;20&quot;&gt;

    &lt;primitives:fill&gt;
        &lt;s:SolidColor color=&quot;#353535&quot; /&gt;

    &lt;/primitives:fill&gt;
    &lt;primitives:filters&gt;
        &lt;s:DropShadowFilter color=&quot;#000000&quot; inner=&quot;false&quot; distance=&quot;1&quot;
            blurX=&quot;4&quot; blurY=&quot;4&quot;
            quality=&quot;3&quot; alpha=&quot;0.8&quot; /&gt;
    &lt;/primitives:filters&gt;

&lt;/primitives:ExclusionRect&gt;
</pre>
<p><a href="http://www.lafabrick.com/projects/uigfx-lib/sample/srcview/source/uigfx/src/com/lafabrick/uigfx/primitives/ExclusionRect.as.html">La classe complète de la primitive</a></p>
<p><center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/excludedrect.png" alt="excludedrect" title="excludedrect" width="239" height="238" class="aligncenter size-full wp-image-1458" /></center></p>
<h2>Dessine moi une forme !</h2>
<p>Une primitive qui me manque est celle permettant de dessiner une forme, à la manière de Path, mais en définissant un tableau de points. Quelque chose qui ressemble à ça : </p>
<pre class="brush: xml">
&lt;primitives:PointsPath
    radius=&quot;60&quot; width=&quot;100%&quot; height=&quot;100%&quot;
    horizontalCenter=&quot;0&quot; verticalCenter=&quot;0&quot;&gt;

    &lt;primitives:points&gt;
        &lt;mx:Point x=&quot;100&quot; y=&quot;0&quot; /&gt;
        &lt;mx:Point x=&quot;125&quot; y=&quot;75&quot; /&gt;
        &lt;mx:Point x=&quot;200&quot; y=&quot;75&quot; /&gt;
        &lt;mx:Point x=&quot;140&quot; y=&quot;125&quot; /&gt;
        &lt;mx:Point x=&quot;160&quot; y=&quot;200&quot; /&gt;
        &lt;mx:Point x=&quot;100&quot; y=&quot;155&quot; /&gt;
        &lt;mx:Point x=&quot;40&quot; y=&quot;200&quot; /&gt;
        &lt;mx:Point x=&quot;60&quot; y=&quot;125&quot; /&gt;
        &lt;mx:Point x=&quot;0&quot; y=&quot;75&quot; /&gt;
        &lt;mx:Point x=&quot;75&quot; y=&quot;75&quot; /&gt;
    &lt;/primitives:points&gt;

    &lt;primitives:fill&gt;
        &lt;s:SolidColor color=&quot;#222222&quot; /&gt;
    &lt;/primitives:fill&gt;

    &lt;primitives:filters&gt;
        &lt;s:DropShadowFilter color=&quot;#000000&quot; inner=&quot;true&quot; distance=&quot;1&quot;
            blurX=&quot;4&quot; blurY=&quot;4&quot;
            quality=&quot;3&quot; alpha=&quot;0.8&quot; /&gt;
    &lt;/primitives:filters&gt;

&lt;/primitives:PointsPath&gt;
</pre>
<p>Bien, mais pas suffisant.<br />
Dans ce premier essai, les points sont définis “statiquement”. Une utilisation parfaite pour moi d’une telle primitive serait de pouvoir définir des contraintes de placement sur les points (top, verticalCenter, bottom et left, horizontalCenter, right), par rapport à la primitive.</p>
<p>J’ai donc fait une classe ConstraintPoint.</p>
<h3>ConstraintPoint : un point “contraint”</h3>
<p>Cette classe toute simple, extension de Point, dispose de propriétés de placement, en getter/setter : top, left, bottom, right, horizontalCenter, verticalCenter. Une méthode getConstraintPoint() renvoie un point x/y, calculer par rapport à une cible GraphicElement, en tenant compte des contraintes de placement. J’ai préféré avoir ce type de fonctionnement, plutôt que d’avoir le couple x/y directement modifié lors du set des différentes propriétés de contraintes. </p>
<p>Une primitive se dessine par rapport à son positionnement global. GraphicElement fournit les propriétés protégés drawX et drawY, qui donne les positions x/y de la primitive de manière global, par rapport à l’application. </p>
<p>La méthode getConstraintPoint() doit donc renvoyer le point par rapport à l’application. GraphicElement fournit tout la mécanique de calcul nécessaire, notamment l’objet postLayoutTransformOffsets, qui contient la position globale de la primitive.</p>
<p>La méthode en question :</p>
<pre class="brush: js">
public function getConstraintPoint( graphicElement : GraphicElement ) : Point
{
    var px : Number = 0;
    var py : Number = 0;

    var xOffset : Number;
    var yOffset : Number;

    if (graphicElement.displayObjectSharingMode ==
                        DisplayObjectSharingMode.OWNS_UNSHARED_OBJECT) {
        xOffset = 0;
        yOffset = 0;
    }
    else {
        xOffset = graphicElement.postLayoutTransformOffsets ?
                        graphicElement.x + graphicElement.postLayoutTransformOffsets.x : graphicElement.x;
        yOffset = graphicElement.postLayoutTransformOffsets ?
                        graphicElement.y + graphicElement.postLayoutTransformOffsets.y : graphicElement.y;
    }

    // Calcutates y position
    if( !isNaN( top ) ) {
        py = yOffset + top;
    }
    else if( !isNaN( bottom ) ) {
        py = yOffset + graphicElement.height - bottom;
    }
    else if( !isNaN( verticalCenter ) ) {
        py = ( yOffset + graphicElement.height ) / 2 + verticalCenter;
    }
    else {
        py = yOffset + y;
    }

    // Calcutates x position
    if( !isNaN( left ) ) {
        px = xOffset + left;
    }
    else if( !isNaN( right ) ) {
        px = xOffset + graphicElement.width - right;
    }
    else if( !isNaN( horizontalCenter ) ) {
        px = ( xOffset + graphicElement.width ) / 2 + horizontalCenter;
    }
    else {
        px = xOffset + x;
    }

    return new Point( px, py );
}
</pre>
<p>La classe complète ce trouve <a href="http://www.lafabrick.com/projects/uigfx-lib/sample/srcview/source/uigfx/src/com/lafabrick/uigfx/geom/ConstraintPoint.as.html">derrière ce lien.</a></p>
<p>Intéressons nous maintenant à la primitive.</p>
<h3>Primitive PointsPath</h3>
<p>J’utilise toujours la méthode de dessin drawRoundPath, contenu dans ma classe static UigfxUtils.</p>
<p>Ici, la classe étend FilledElement. Une propriété points, définit les différents points de type ConstraintPoint de la primitive. J’utilise ici un vecteur comme conteneur des points : Vector.&lt;ConstraintPoint&gt;. Le “set” de cette propriété appelle invalidateDisplayList(), afin de lancer le processus de dessin de la forme.</p>
<p>La méthode draw parcour le vecteur de points ConstraintPoint, appelle pour chacun sa méthode getConstraintPoint, et pousse le point dans un vecteur. C’est ce vecteur qui est utilisé par drawRoundPath.</p>
<p>Le code de cette mécanique : </p>
<pre class="brush: js">
public function get points():Vector.&lt;ConstraintPoint&gt;
{
    return _points;
}

/**
 * @private
 */
public function set points(value:Vector.&lt;ConstraintPoint&gt;):void
{
    _points = value;
    invalidateDisplayList();
}

/**
 * Draw the path
 * &lt;p&gt;Drawing method is static, in UiGfxUtils&lt;/p&gt;
 * @see com.lafabrick.uigfx.utils.UiGfxUtils
 */
override protected function draw(g:Graphics) : void
{
    // replace points from local to global position
    var vectorPoint : Vector.&lt;Point&gt; = new Vector.&lt;Point&gt;();
    for each( var point : ConstraintPoint in points ) {
        vectorPoint.push( point.getConstraintPoint( this ) );
    }
    // launch drawing method
    UigfxUtils.drawRoundPath( g, vectorPoint, radius, true );
}
</pre>
<p><a href="http://www.lafabrick.com/projects/uigfx-lib/sample/srcview/source/uigfx/src/com/lafabrick/uigfx/primitives/PointsPath.as.html">La classe PointsPath en entier</a></p>
<h3>Utilisation</h3>
<p>Reprenons l’exemple, avec cette primitive et les contraintes de placement : </p>
<pre class="brush: xml">
&lt;primitives:PointsPath
    radius=&quot;60&quot; width=&quot;100%&quot; height=&quot;100%&quot;
    horizontalCenter=&quot;0&quot; verticalCenter=&quot;0&quot;&gt;

    &lt;primitives:points&gt;
        &lt;geom:ConstraintPoint top=&quot;0&quot; horizontalCenter=&quot;0&quot; /&gt;
        &lt;geom:ConstraintPoint horizontalCenter=&quot;25&quot; verticalCenter=&quot;-25&quot;/&gt;
        &lt;geom:ConstraintPoint right=&quot;0&quot; verticalCenter=&quot;-25&quot; /&gt;
        &lt;geom:ConstraintPoint horizontalCenter=&quot;40&quot; verticalCenter=&quot;25&quot; /&gt;
        &lt;geom:ConstraintPoint right=&quot;40&quot; bottom=&quot;0&quot; /&gt;
        &lt;geom:ConstraintPoint horizontalCenter=&quot;0&quot; verticalCenter=&quot;40&quot; /&gt;
        &lt;geom:ConstraintPoint left=&quot;40&quot; bottom=&quot;0&quot; /&gt;
        &lt;geom:ConstraintPoint horizontalCenter=&quot;-40&quot; verticalCenter=&quot;25&quot; /&gt;
        &lt;geom:ConstraintPoint left=&quot;0&quot; verticalCenter=&quot;-25&quot; /&gt;
        &lt;geom:ConstraintPoint horizontalCenter=&quot;-25&quot; verticalCenter=&quot;-25&quot; /&gt;
    &lt;/primitives:points&gt;

    &lt;primitives:fill&gt;
        &lt;s:SolidColor color=&quot;#222222&quot; /&gt;
    &lt;/primitives:fill&gt;

    &lt;primitives:filters&gt;
        &lt;s:DropShadowFilter color=&quot;#000000&quot; inner=&quot;true&quot; distance=&quot;1&quot;
            blurX=&quot;4&quot; blurY=&quot;4&quot;
            quality=&quot;3&quot; alpha=&quot;0.8&quot; /&gt;
    &lt;/primitives:filters&gt;

&lt;/primitives:PointsPath&gt;
</pre>
<p><center> </p>
<table>
<tr>
<td><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/starstd-150x150.png" alt="starstd" title="starstd" width="150" height="150" class="aligncenter size-thumbnail wp-image-1459" /></td>
<td><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/startextended-150x150.png" alt="startextended" title="startextended" width="150" height="150" class="aligncenter size-thumbnail wp-image-1460" /></td>
</tr>
</table>
<p></center></p>
<p>La forme respecte les contraintes de placement, en fonction de l’évolution de la taille de la primitive. Amazing ! <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
L&#8217;exemple complet (les sources au clic droit), <a href="http://www.lafabrick.com/projects/uigfx-lib/sample/">ce cache sous ce lien</a>.</p>
<h2>Librairie Uigfx</h2>
<p>Tout ce que je viens d’exposer fait partie d’une librairie nommée par <a href="http://twitter.com/rick_lafabrick">Erick</a> &laquo;&nbsp;uigfx&nbsp;&raquo;.<br />
Cette petite librairie, sera bientôt disponible publiquement sur le svn lafabrick. Vous pouvez d’ores et déjà <a href="http://www.lafabrick.com/projects/uigfx-lib/project/uigfx.fxpl">télécharger le projet</a> (format .fxpl), dans la version proposée dans cette article. La documentation ( en anglais&#8230; pas parfait ! ) <a href="http://www.lafabrick.com/projects/uigfx-lib/apidoc/">est disponible là</a>.</p>
<p>[UPDATE]<br />
Le projet uigfx a maintenant sa page sur <a href="http://code.google.com/p/uigfx/">google code</a>. Pour plus d&#8217;information, <a href="http://www.lafabrick.com/blog/2010/02/09/1559-uigfx-project-flex4-primitives-fireworks-extension/">la présentation de ce projet</a>.<br />
[/UPDATE]</p>
<p>Je vous laisse la place sur le fil de commentaire !</p>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2006/11/16/19-petit-cour-sur-lapi-de-dessin/" rel="bookmark" title="16 novembre 2006">Petit cours sur l’API de dessin</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/11/27/1373-flex4-custom-component-skinnig/" rel="bookmark" title="27 novembre 2009">Flex4 : composant personnalisé et skinning</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/02/09/1964-uigfx-project-flex4-primitives-library-fireworks-extension/" rel="bookmark" title="9 février 2010">uigfx project : Flex4 primitives library / Fireworks extension</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/" rel="bookmark" title="14 juillet 2010">Flex 4 et les layouts &#8211; Faire une ViewStack &laquo;&nbsp;pure&nbsp;&raquo; Spark</a></li>
</ul>
<p><!-- Similar Posts took 13.399 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2009/12/04/1453-flex4-skin-et-primitives/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

