Difference between revisions of "FR/Documentation/Les formes (shapes)"

From Apache OpenOffice Wiki
Jump to: navigation, search
m
m (Couleurs d'arrière plan et des formes)
Line 118: Line 118:
 
Ce problème a déjà été abordé dans le chapitre “4.5.1 Exemple de calcul de la fonction”: nous pouvons déduire de ce fichier IDL que nos constantes dans C++ seront : FillStyle_NONE, FillStyle_SOLID,... et FillStyle_BITMAP et nous devons construire les fichiers hpp et hxx correspondants.
 
Ce problème a déjà été abordé dans le chapitre “4.5.1 Exemple de calcul de la fonction”: nous pouvons déduire de ce fichier IDL que nos constantes dans C++ seront : FillStyle_NONE, FillStyle_SOLID,... et FillStyle_BITMAP et nous devons construire les fichiers hpp et hxx correspondants.
 
Le deuxième problème est de savoir comment traduire ce bout de code OOoBasic :
 
Le deuxième problème est de savoir comment traduire ce bout de code OOoBasic :
 
+
<source lang="ooobas">
Listing 87
+
'Listing 4
 
REM  *****  BASIC  *****
 
REM  *****  BASIC  *****
 
MaForme.FillColor = RGB(255,200,255)
 
MaForme.FillColor = RGB(255,200,255)
 
MaForme.FillStyle = com.sun.star.drawing.FillStyle.NONE
 
MaForme.FillStyle = com.sun.star.drawing.FillStyle.NONE
Est-ce que le FillStyle est une propriété  et qu'en est-il du FillColor? Pour chercher une réponse nous retournons à un fichier IDL qui se  nomme FillProperties.idl :  
+
</source>
Listing 88
+
Est-ce que le FillStyle est une propriété  et qu'en est-il du FillColor? Pour chercher une réponse nous retournons à un fichier IDL qui se  nomme FillProperties.idl :
 +
<source lang="idl">
 +
//Listing 5
 
// IDL
 
// IDL
 
module com { module sun { module star { module drawing {
 
module com { module sun { module star { module drawing {
Line 153: Line 155:
 
};
 
};
 
}; }; }; };  
 
}; }; }; };  
 
+
</source>
 
Les deux premières propriétés semblent intéressantes pour nous. Nous commençons avec FillColor. Si nous ajoutons ce code nous obtenons un rectangle avec une autre couleur.
 
Les deux premières propriétés semblent intéressantes pour nous. Nous commençons avec FillColor. Si nous ajoutons ce code nous obtenons un rectangle avec une autre couleur.
 
+
<source lang="cpp">
Listing 89
+
//Listing 6
 
// C++
 
// C++
 
// N'oubliez pas d'ajouter : using namespace com::sun::star::beans;
 
// N'oubliez pas d'ajouter : using namespace com::sun::star::beans;
Line 167: Line 169:
 
color<<=(long)0xFF00;  //green
 
color<<=(long)0xFF00;  //green
 
rShapeProps->setPropertyValue(OUString::createFromAscii("FillColor"),color);
 
rShapeProps->setPropertyValue(OUString::createFromAscii("FillColor"),color);
 
+
</source>
 
La couleur est définie en RVB (Rouge Vert Bleu) : un octet pour chaque couleur : 0xff0000 est rouge, 0x00ff00 est vert et 0x0000ff est bleu.
 
La couleur est définie en RVB (Rouge Vert Bleu) : un octet pour chaque couleur : 0xff0000 est rouge, 0x00ff00 est vert et 0x0000ff est bleu.
 
Il est temps de changer la couleur de l'arrière plan avec la constante prédéfinie  FillStyle_NONE. Cela se fait simplement en ajoutant ce code :
 
Il est temps de changer la couleur de l'arrière plan avec la constante prédéfinie  FillStyle_NONE. Cela se fait simplement en ajoutant ce code :
  
 
+
<source lang="cpp">
Listing 90 Positionner la couleur  
+
//Listing 7 Positionner la couleur  
 
// C++
 
// C++
 
// N'oubliez pas d'ajouter la directive : #include <com/sun/star/drawing/FillStyle.hpp>
 
// N'oubliez pas d'ajouter la directive : #include <com/sun/star/drawing/FillStyle.hpp>
Line 180: Line 182:
 
FillStyle <<= FillStyle_NONE;
 
FillStyle <<= FillStyle_NONE;
 
rShapeProps->setPropertyValue(OUString::createFromAscii("FillStyle"),FillStyle);
 
rShapeProps->setPropertyValue(OUString::createFromAscii("FillStyle"),FillStyle);
 +
</source>
 
Nous arrêtons ici mais il y a beaucoup à faire avec les autres constantes FillStyle.
 
Nous arrêtons ici mais il y a beaucoup à faire avec les autres constantes FillStyle.
  
Forme et Ombre
+
==Forme et Ombre==
 
L'ombre est décrite par le fichier ShadowProperties.idl que nous présentons maintenant :
 
L'ombre est décrite par le fichier ShadowProperties.idl que nous présentons maintenant :
 
+
<source lang="idl">
Listing 91Fichier ShadowProperties.idl
+
//Listing 8 Fichier ShadowProperties.idl
 
// IDL
 
// IDL
 
module com {  module sun {  module star {  module drawing {
 
module com {  module sun {  module star {  module drawing {
Line 197: Line 200:
 
};
 
};
 
}; }; }; };   
 
}; }; }; };   
 
+
</source>
 
Ensuite le code correspondant en C++ pour manipuler ces propriétés peut être :
 
Ensuite le code correspondant en C++ pour manipuler ces propriétés peut être :
Listing 92 Manipuler les ombres
+
<source lang="cpp">
 +
//Listing 9 Manipuler les ombres
 
// C++
 
// C++
 
// Shadow
 
// Shadow
Line 214: Line 218:
 
rShapeProps->setPropertyValue(OUString::createFromAscii("ShadowYDistance"),
 
rShapeProps->setPropertyValue(OUString::createFromAscii("ShadowYDistance"),
 
ShadowProperties[3]);
 
ShadowProperties[3]);
 +
</source>
 
lequel dessine une ombre rouge à la forme rectangulaire.
 
lequel dessine une ombre rouge à la forme rectangulaire.
La Rotation de forme et déformation
+
==La Rotation de la forme et sa déformation==
 
Pour une rotation, le fichier IDL correspondant est :
 
Pour une rotation, le fichier IDL correspondant est :
Listing 93Fichier RotationDescriptor.idl
+
<source lang="idl">
 +
//Listing 10 Fichier RotationDescriptor.idl
 
// IDL
 
// IDL
 
module com {  module sun {  module star {  module drawing {
 
module com {  module sun {  module star {  module drawing {
Line 229: Line 235:
 
};
 
};
 
}; }; }; };
 
}; }; }; };
L'angle est donné en 1/100° commençant d'une ligne horizontale. Ainsi le code du Listing 94 ci-dessous donne une rotation de 30°.
+
</source>
Listing 94
+
L'angle est donné en 1/100° commençant d'une ligne horizontale. Ainsi le code du Listing 11 ci-dessous donne une rotation de 30°.
 +
<source lang="cpp">
 +
//Listing 11
 
// C++
 
// C++
 
Any Angle;
 
Any Angle;
 
Angle <<= (long)3000; // 30 degres
 
Angle <<= (long)3000; // 30 degres
 
rShapeProps->setPropertyValue(OUString::createFromAscii("RotateAngle"),Angle);
 
rShapeProps->setPropertyValue(OUString::createFromAscii("RotateAngle"),Angle);
 +
</source>
 
Abordons maintenant un problème différent, celui des styles de lignes.  
 
Abordons maintenant un problème différent, celui des styles de lignes.  
Style des lignes
+
==Style des lignes==
 
Les fichiers IDL correspondants sont donnés maintenant. Commençons par le fichier LineProperties.idl
 
Les fichiers IDL correspondants sont donnés maintenant. Commençons par le fichier LineProperties.idl
   
+
<source lang="idl">  
Listing 95 Le fichier LineProperties.idl
+
// Listing 12 Le fichier LineProperties.idl
 
// IDL
 
// IDL
 
module com {  module sun {  module star {  module drawing {
 
module com {  module sun {  module star {  module drawing {
Line 259: Line 268:
 
};  
 
};  
 
}; }; }; };  
 
}; }; }; };  
 
+
</source>
 
Regardons maintenant le fichier LineStyle.idl : il définit une énumération qui est maintenant présentée.
 
Regardons maintenant le fichier LineStyle.idl : il définit une énumération qui est maintenant présentée.
Listing 96L'énumération LineStyle
+
<source lang="idl">
 +
//Listing 13 L'énumération LineStyle
 
// IDL
 
// IDL
 
module com {  module sun {  module star {  module drawing {
 
module com {  module sun {  module star {  module drawing {
Line 271: Line 281:
 
};
 
};
 
}; }; }; };
 
}; }; }; };
 +
</source>
 
Nous donnons la signification de ces constantes :
 
Nous donnons la signification de ces constantes :
 
Constant
 
Constant
Line 281: Line 292:
 
Ligne en tirets; La propriété LineDash contrôle la forme du tiret
 
Ligne en tirets; La propriété LineDash contrôle la forme du tiret
 
Pour être complet, il nous faut maintenant regarder le fichier LineDash.idl qui définit une structure.   
 
Pour être complet, il nous faut maintenant regarder le fichier LineDash.idl qui définit une structure.   
Listing 97 Le fichier LineDash.idl
+
<source lang="idl">
 +
//Listing 14 Le fichier LineDash.idl
 
// IDL
 
// IDL
 
module com {  module sun {  module star {  module drawing {
 
module com {  module sun {  module star {  module drawing {
Line 293: Line 305:
 
long Distance;  
 
long Distance;  
 
};
 
};
}; }; }; };   
+
}; }; }; };
 +
</source>  
 
Regardons les significations de chacun des champs :
 
Regardons les significations de chacun des champs :
 
Proprerty
 
Proprerty
Line 310: Line 323:
 
distance entre les points en 1/100 mm
 
distance entre les points en 1/100 mm
 
Les styles en tirets sont donnés par une énumération comme le montre le fichier DashStyle.idl ci-dessous :
 
Les styles en tirets sont donnés par une énumération comme le montre le fichier DashStyle.idl ci-dessous :
 
+
<source lang="idl">
Listing 98Enumération définie par le fichier DashStyle.idl
+
//Listing 15 Enumération définie par le fichier DashStyle.idl
 
// IDL
 
// IDL
 
module com {  module sun {  module star {  module drawing {
 
module com {  module sun {  module star {  module drawing {
Line 322: Line 335:
 
};
 
};
 
}; }; }; };
 
}; }; }; };
 +
</source>
 
Voici un exemple en C++ qui utilise le style des lignes :
 
Voici un exemple en C++ qui utilise le style des lignes :
Listing 99Exemple complet d'utilisation des styles des lignes
+
<source lang="cpp">
 +
//Listing 16 Exemple complet d'utilisation des styles des lignes
 
// C++
 
// C++
 
// Line dash
 
// Line dash
Line 346: Line 361:
 
LineWidth <<= (long) 50;
 
LineWidth <<= (long) 50;
 
rShapeProps->setPropertyValue(OUString::createFromAscii("LineWidth"),LineWidth);
 
rShapeProps->setPropertyValue(OUString::createFromAscii("LineWidth"),LineWidth);
 
+
</source>
 
Ajouter ce code au précédent donne cette figure :
 
Ajouter ce code au précédent donne cette figure :
  

Revision as of 13:30, 7 July 2008

Nous décrivons en premier notre nouveau code initial. Il est identique aux codes précédents mais on ajoute quelques procédures pour simplifier le code (d'après Christian Junker ici).

//Listing 1
// C++
// Ne pas oublier la directive : #include <com/sun/star/drawing/XShapes.hpp>
// N'oubliez pas d'ajouter "com.sun.star.drawing.XShapes \" in the makefile
 
// N'oubliez pas d'ajouter : using namespace com::sun::star::beans;
// Ne pas oublier la directive : #include <com/sun/star/beans/XPropertySet.hpp>
// N'oubliez pas d'ajouter "com.sun.star.beans.XPropertySet \" in the makefile
 
// Christian Junker code
void MakePosition(sal_Int32 x, sal_Int32 y, ::com::sun::star::awt::Point *Pos) 
{ 
 
	Pos->X = x; 
	Pos->Y = y; 
} 
 
void MakeSize(sal_Int32 width, sal_Int32 height, ::com::sun::star::awt::Size *Size) 
{ 
	Size->Width = width; 
	Size->Height = height; 
} 
 
void DrawMe(Reference< XShape > &Shape, Reference< XDrawPage > &page, const char *shapename) 
{ 
	Reference< XShapes > Shapes(page, UNO_QUERY); 
	Shapes->add(Shape); 
	Reference< XPropertySet > shapeprops(Shape, UNO_QUERY); 
	shapeprops->setPropertyValue(OUString::createFromAscii("Name"),
					makeAny(OUString::createFromAscii(shapename))); 
}

Avec ces procédures nous commençons maintenant d'une forme de rectangle : notre nouveau code initial principal est alors:

//Listing 2
int main( ) {
//retrieve an instance of the remote service manager
    Reference< XMultiServiceFactory > rOfficeServiceManager;
    rOfficeServiceManager = ooConnect();
    if( rOfficeServiceManager.is() ){
        printf( "Connected sucessfully to the office\n" );
    }
 
//get the desktop service using createInstance returns an XInterface type
    Reference< XInterface  > Desktop = rOfficeServiceManager->createInstance(
    OUString::createFromAscii( "com.sun.star.frame.Desktop" ));
 
//query for the XComponentLoader interface
    Reference< XComponentLoader > rComponentLoader (Desktop, UNO_QUERY);
    if( rComponentLoader.is() ){
        	printf( "XComponentloader successfully instanciated\n" );
    	}
 
//get an instance of the OOowriter document
    Reference< XComponent > xcomponent = rComponentLoader->loadComponentFromURL(
	OUString::createFromAscii("private:factory/sdraw"),
        OUString::createFromAscii("_blank"),
        0,
        Sequence < ::com::sun::star::beans::PropertyValue >());
 
// added code here
	Reference< XDrawPagesSupplier > rDrawDoc(xcomponent, UNO_QUERY);
 
// query the XDrawPages Interface
	Reference< XDrawPages > rDrawPages = rDrawDoc->getDrawPages();
 
// query the XIndexAccess Interface
	Reference< XIndexAccess > rPageIndexAccess(rDrawPages, UNO_QUERY);
 
	Any DrawPage = rPageIndexAccess->getByIndex(0);
 
// Query the XDrawPage Interface
	Reference< XDrawPage > rDrawPage(DrawPage, UNO_QUERY);
// query for the XNamed Interface
	Reference< XNamed > rNamed(DrawPage, UNO_QUERY);
	rNamed->setName(OUString::createFromAscii("My first page"));
 
	Reference< XMultiServiceFactory > DocFactory(xcomponent, UNO_QUERY);
 
	Point *Pos = new (Point);
	Size *TheSize = new ( Size );
 
	Reference< XInterface > RectangleShape = DocFactory->createInstance(
	               OUString::createFromAscii("com.sun.star.drawing.RectangleShape") );
	Reference< XShape > rRectShape(RectangleShape, UNO_QUERY);
	MakePosition(2000, 6000, Pos);
	MakeSize(7000, 2000, TheSize);
	rRectShape->setPosition(*Pos);
	rRectShape->setSize(*TheSize);
	DrawMe(rRectShape, rDrawPage, "My TextShape");
 
// add code here 
 
    return 0;
}

Ce code dessine un rectangle coloré en bleu.

Les propriétés de la forme

Couleurs d'arrière plan et des formes

La forme est créée habituellement avec une couleur uniforme d'arrière plan par défaut. Il est naturellement possible de changer ceci. Pour comprendre comment cela fonctionne, un petit tour vers le fichier IDL <OpenOffice.org1.1_SDK>/idl/com/sun/star/drawing/fillstyle.idl nous sera nécessaire :

//Listing 3 Détail du fichier FillStyle.idl
// IDL
module com {  module sun {  module star {  module drawing {
enum FillStyle
{
	NONE,
	SOLID,
	GRADIENT, 
	HATCH, 
	BITMAP  
}; 
}; }; }; };

Ce problème a déjà été abordé dans le chapitre “4.5.1 Exemple de calcul de la fonction”: nous pouvons déduire de ce fichier IDL que nos constantes dans C++ seront : FillStyle_NONE, FillStyle_SOLID,... et FillStyle_BITMAP et nous devons construire les fichiers hpp et hxx correspondants. Le deuxième problème est de savoir comment traduire ce bout de code OOoBasic :

Invalid language.

You need to specify a language like this: <source lang="html4strict">...</source>

Supported languages for syntax highlighting:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, apt_sources, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_loadrunner, c_mac, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, cpp-qt, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, ocaml-brief, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, php-brief, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xorg_conf, xpp, yaml, z80, zxbasic


'Listing 4
REM  *****  BASIC  *****
MaForme.FillColor = RGB(255,200,255)
MaForme.FillStyle = com.sun.star.drawing.FillStyle.NONE

Est-ce que le FillStyle est une propriété et qu'en est-il du FillColor? Pour chercher une réponse nous retournons à un fichier IDL qui se nomme FillProperties.idl :

 
//Listing 5
// IDL
module com { module sun { module star { module drawing {
service FillProperties
{
	[property] com::sun::star::drawing::FillStyle FillStyle;
	[property] long FillColor;
	[property] short FillTransparence;
	[property] string FillTransparenceGradientName;
	[optional, property] com::sun::star::awt::Gradient FillTransparenceGradient;
	[property] string FillGradientName;
	[optional, property] com::sun::star::awt::Gradient FillGradient;
	[property] string FillHatchName;
	[optional, property] com::sun::star::drawing::Hatch FillHatch;
	[property] string FillBitmapName;
	[optional, property] com::sun::star::awt::XBitmap FillBitmap;
	[optional, property] string FillBitmapURL;
	[property] short FillBitmapOffsetX;
	[property] short FillBitmapOffsetY;
	[property] short FillBitmapPositionOffsetX;
	[property] short FillBitmapPositionOffsetY;
	[property] com::sun::star::drawing::RectanglePoint FillBitmapRectanglePoint;
	[property] boolean FillBitmapLogicalSize;
	[property] long FillBitmapSizeX;
	[property] long FillBitmapSizeY;
	[property] com::sun::star::drawing::BitmapMode FillBitmapMode;
	[property] boolean FillBackground;
};
}; }; }; };

Les deux premières propriétés semblent intéressantes pour nous. Nous commençons avec FillColor. Si nous ajoutons ce code nous obtenons un rectangle avec une autre couleur.

 
//Listing 6
// C++
// N'oubliez pas d'ajouter : using namespace com::sun::star::beans;
// N'oubliez pas d'ajouter la directive : #include <com/sun/star/beans/XPropertySet.hpp>
// N'oubliez pas d'ajouter "com.sun.star.beans.XPropertySet \" dans le makefile
 
// Get the property set of the rRectShape 
	Reference< XPropertySet > rShapeProps(rRectShape,UNO_QUERY);
	Any color;
	color<<=(long)0xFF00;  //green
	rShapeProps->setPropertyValue(OUString::createFromAscii("FillColor"),color);

La couleur est définie en RVB (Rouge Vert Bleu) : un octet pour chaque couleur : 0xff0000 est rouge, 0x00ff00 est vert et 0x0000ff est bleu. Il est temps de changer la couleur de l'arrière plan avec la constante prédéfinie FillStyle_NONE. Cela se fait simplement en ajoutant ce code :

 
//Listing 7 Positionner la couleur 
// C++
// N'oubliez pas d'ajouter la directive : #include <com/sun/star/drawing/FillStyle.hpp>
// N'oubliez pas d'ajouter "com.sun.star.drawing.FillStyle \" in the makefile
 
	Any FillStyle;
	FillStyle <<= FillStyle_NONE;
	rShapeProps->setPropertyValue(OUString::createFromAscii("FillStyle"),FillStyle);

Nous arrêtons ici mais il y a beaucoup à faire avec les autres constantes FillStyle.

Forme et Ombre

L'ombre est décrite par le fichier ShadowProperties.idl que nous présentons maintenant :

 
//Listing 8 Fichier ShadowProperties.idl
// IDL
module com {  module sun {  module star {  module drawing {
service ShadowProperties
{
	[property] boolean Shadow;
	[property] long ShadowColor;
	[property] short ShadowTransparence;
	[property] long ShadowXDistance;
	[property] long ShadowYDistance;
};
}; }; }; };

Ensuite le code correspondant en C++ pour manipuler ces propriétés peut être :

 
//Listing 9 Manipuler les ombres
// C++
// Shadow
	Any ShadowProperties[4];
	ShadowProperties[0] <<= (sal_Bool)true;
	ShadowProperties[1] <<= (long) 0xFF0000; // rouge
	ShadowProperties[2] <<= (long) 300;
	ShadowProperties[3] <<= (long) 300;
	rShapeProps->setPropertyValue(OUString::createFromAscii("Shadow"),ShadowProperties[0]);
	rShapeProps->setPropertyValue(OUString::createFromAscii("ShadowColor"),
																	ShadowProperties[1]);
	rShapeProps->setPropertyValue(OUString::createFromAscii("ShadowXDistance"),
																	ShadowProperties[2]);
	rShapeProps->setPropertyValue(OUString::createFromAscii("ShadowYDistance"),
																	ShadowProperties[3]);

lequel dessine une ombre rouge à la forme rectangulaire.

La Rotation de la forme et sa déformation

Pour une rotation, le fichier IDL correspondant est :

 
//Listing 10 Fichier RotationDescriptor.idl
// IDL
module com {  module sun {  module star {  module drawing {
service RotationDescriptor
{
/** This is the angle for rotation of this Shape.
	The shape is rotated counter-clockwise around the center of the bounding box. */
 
	[property] long RotateAngle;
	[optional, property] long ShearAngle;
};
}; }; }; };

L'angle est donné en 1/100° commençant d'une ligne horizontale. Ainsi le code du Listing 11 ci-dessous donne une rotation de 30°.

 
//Listing 11
// C++
	Any Angle;
	Angle <<= (long)3000; // 30 degres
	rShapeProps->setPropertyValue(OUString::createFromAscii("RotateAngle"),Angle);

Abordons maintenant un problème différent, celui des styles de lignes.

Style des lignes

Les fichiers IDL correspondants sont donnés maintenant. Commençons par le fichier LineProperties.idl

 
// Listing 12 Le fichier LineProperties.idl
// IDL
module com {  module sun {  module star {  module drawing {
service LineProperties
{
	[property] com::sun::star::drawing::LineStyle LineStyle;
	[property] com::sun::star::drawing::LineDash LineDash;
	[property] long LineColor;
	[property] short LineTransparence;
	[property] long LineWidth; 
	[property] com::sun::star::drawing::LineJoint LineJoint; 
	[optional, property] string LineStartName;
	[optional, property] com::sun::star::drawing::PolyPolygonBezierCoords LineStart; 
	[optional, property] com::sun::star::drawing::PolyPolygonBezierCoords LineEnd; 
	[optional, property] boolean LineStartCenter; 
	[optional, property] long LineStartWidth; 
	[optional, property] boolean LineEndCenter; 
	[optional, property] long LineEndWidth; 
}; 
}; }; }; };

Regardons maintenant le fichier LineStyle.idl : il définit une énumération qui est maintenant présentée.

 
//Listing 13 L'énumération LineStyle
// IDL
module com {  module sun {  module star {  module drawing {
enum LineStyle
{
	NONE,
	SOLID, 
	DASH
};
}; }; }; };

Nous donnons la signification de ces constantes : Constant Signification NONE La ligne est invisible SOLID Ligne continue (valeur par défaut) DASH Ligne en tirets; La propriété LineDash contrôle la forme du tiret Pour être complet, il nous faut maintenant regarder le fichier LineDash.idl qui définit une structure.

 
//Listing 14 Le fichier LineDash.idl
// IDL
module com {  module sun {  module star {  module drawing {
struct LineDash
{
	com::sun::star::drawing::DashStyle Style;
	short Dots; 
	long DotLen; 
	short Dashes; 
	long DashLen; 
	long Distance; 
};
}; }; }; };

Regardons les significations de chacun des champs : Proprerty Signification Style Une constante ( com.sun.star.drawing.DashStyle.xxx) qui donne le style de tirets Dots Combien de points DotLen Longueur des points en 1/100 mm Dashes Combien de tirets DashLen Longueur des tirets en 1/100 mm Distance distance entre les points en 1/100 mm Les styles en tirets sont donnés par une énumération comme le montre le fichier DashStyle.idl ci-dessous :

 
//Listing 15 Enumération définie par le fichier DashStyle.idl
// IDL
module com {  module sun {  module star {  module drawing {
enum DashStyle
{
	RECT,
	ROUND,
	RECTRELATIVE,
	ROUNDRELATIVE 
};
}; }; }; };

Voici un exemple en C++ qui utilise le style des lignes :

 
//Listing 16 Exemple complet d'utilisation des styles des lignes
// C++
// Line dash
// N'oubliez pas d'ajouter : #include <com/sun/star/drawing/LineDash.hpp>
// N'oubliez pas d'ajouter "com.sun.star.drawing.LineDash \" dans le makefile
// N'oubliez pas d'ajouter : #include <com/sun/star/drawing/LineStyle.hpp>
// N'oubliez pas d'ajouter "com.sun.star.drawing.LineStyle \" dans le makefile
	LineDash *Tirets = new (LineDash);
	Tirets->Style = DashStyle_RECT;
  	Tirets->Dots = 3;
  	Tirets->DotLen = 50;
  	Tirets->Dashes = 2;
  	Tirets->DashLen = 200;
  	Tirets->Distance = 150;
	Any LineStyle,LineDash,LineWidth;
	LineStyle <<= LineStyle_DASH;
	rShapeProps->setPropertyValue(OUString::createFromAscii("LineStyle"),LineStyle);
	LineDash <<= *Tirets;
	rShapeProps->setPropertyValue(OUString::createFromAscii("LineDash"),LineDash);
	color <<= (long)0xFF00;
	rShapeProps->setPropertyValue(OUString::createFromAscii("LineColor"),color);
	LineWidth <<= (long) 50;
	rShapeProps->setPropertyValue(OUString::createFromAscii("LineWidth"),LineWidth);

Ajouter ce code au précédent donne cette figure :





Figure 6 Dernier exemple Dessiner des formes La forme “polyligne” La première fois que nous abordons les polylignes il nous faut comprendre la notion de Sequence < Sequence < Point >> ? Pour ce faire une description à l'aide des classiques fichiers IDL s'impose. Nous en donnons deux dans les listings 100 et 101 qui suivent :

Listing 100 PointSequenceSequence IDL File // IDL module com { module sun { module star { module drawing { typedef sequence<PointSequence> PointSequenceSequence; }; }; }; };

Qu'est-ce alors qu'une PointSequence ?

Listing 101 PointSequence IDL File // IDL module com { module sun { module star { module drawing { typedef sequence<com::sun::star::awt::Point> PointSequence; }; }; }; }; We can have a look at PolyLineShape now : Listing 102 PolyLineShape IDL File // IDL

module com {  module sun {  module star {  module drawing {

service PolyLineShape { service com::sun::star::drawing::Shape; service com::sun::star::drawing::LineProperties; service com::sun::star::drawing::PolyPolygonDescriptor; service com::sun::star::drawing::Text; service com::sun::star::drawing::ShadowProperties; service com::sun::star::drawing::RotationDescriptor; }; }; }; }; };

Les autres fichiers IDL fque nous avons à inspecter sont le service PolyPolygonDescriptor  :

Listing 103 Fichier IDL du service PolyPolygonDescriptor // IDL module com { module sun { module star { module drawing { service PolyPolygonDescriptor { [readonly, property] com::sun::star::drawing::PolygonKind PolygonKind; [property] com::sun::star::drawing::PointSequenceSequence PolyPolygon; [property] com::sun::star::drawing::PointSequenceSequence Geometry; }; }; }; }; }; où nous voyons que PolyPolygon est une propriété. Ces fichiers nous permettent de tirer des règles quant à leurs utilisations. construire en premier lieu une séquence de séquence de points et mettre des valeurs dedans. En second lieu la transformer en un type any en dernier lieu utiliser l'interface XpropertySet pour donner des valeurs à la propriété PolyPolygon. Cela nous conduit au final à l'exemple suivant :

Listing 104 Using a Polyline Shape // C++ Sequence< Sequence< Point > > PointsSeqSeq(2); Sequence< Point > PointsArray(4); //Size *TheSize = new ( Size );

Reference< XInterface > PolyLineShape = DocFactory->createInstance( OUString::createFromAscii("com.sun.star.drawing.PolyLineShape") ); Reference< XShape > rPolyLineShape(PolyLineShape, UNO_QUERY); MakePosition(1100, 8000, &PointsArray[0]); MakePosition(1500, 6000, &PointsArray[1]); MakePosition(1900, 8000, &PointsArray[2]); MakePosition(2300, 6000, &PointsArray[3]);

PointsSeqSeq[0]=PointsArray;

PointsArray.realloc(5); MakePosition(1100, 9000, &PointsArray[0]); MakePosition(1500, 7000, &PointsArray[1]); MakePosition(1900, 9000, &PointsArray[2]); MakePosition(2300, 7000, &PointsArray[3]); MakePosition(2700, 9000, &PointsArray[4]); PointsSeqSeq[1]=PointsArray;

DrawMe(rPolyLineShape, rDrawPage, "");

Any PropspolyPoly; PropspolyPoly <<= PointsSeqSeq; Reference< XPropertySet > rPolyShapeProps(rPolyLineShape,UNO_QUERY); rPolyShapeProps->setPropertyValue(OUString::createFromAscii("PolyPolygon"),PropspolyPoly);

Exécuter cet exemple nous donnera la figure présentée ci-dessous.

Si vous remplacez la forme PolyLineShape par la forme PolyPolygonShape dans le code du Listing 104 vous obtiendrez la même forme mais cette fois-ci fermée (et remplie par la couleur par défaut). Les formes de Bezier Commençons maintenant par décrire la structure centrale de ce genre de forme, à savoir la structure PolyPolygonBezierCoords. Le fichier IDL correspondant est présenté :

Listing 105 PolyPolygonBezierCoords IDL File // IDL module com { module sun { module star { module drawing {

struct PolyPolygonBezierCoords { // DocMerge: empty anyway com::sun::star::drawing::PointSequenceSequence Coordinates;

// DocMerge: empty anyway com::sun::star::drawing::FlagSequenceSequence Flags;

}; }; }; }; };

PointSequenceSequence a déjà été présenté dans la section précédente. Plus de précision sur les drapeaux (flags) est maintenant attendue par le lecteur impatient. Encore une fois, c'est un fichier IDL qui vient à notre secours :

Listing 106 Fichier IDL pour l'énumération PolygonFlags // IDL

module com {  module sun {  module star {  module drawing {

enum PolygonFlags { NORMAL, SMOOTH, CONTROL, SYMMETRIC }; }; }; }; }; Le service ClosedBezierShape est lui aussi intéressant  :

Listing 107 ClosedBezierShape Service : IDL File // IDL

module com {  module sun {  module star {  module drawing {

service ClosedBezierShape { service com::sun::star::drawing::Shape; service com::sun::star::drawing::LineProperties; service com::sun::star::drawing::FillProperties; service com::sun::star::drawing::PolyPolygonBezierDescriptor; service com::sun::star::drawing::Text; service com::sun::star::drawing::ShadowProperties; service com::sun::star::drawing::RotationDescriptor; }; }; }; }; }; et encore le service PolyPolygonDescriptor :

Listing 108 PolyPolygonBezierDescriptor Service : IDL File // IDL module com { module sun { module star { module drawing { service PolyPolygonBezierDescriptor { [readonly, property] com::sun::star::drawing::PolygonKind PolygonKind; [property] com::sun::star::drawing::PolyPolygonBezierCoords PolyPolygonBezier; [property] com::sun::star::drawing::PolyPolygonBezierCoords Geometry; }; }; }; }; };

Ce service est comme au chapitre précédent caractérisé par un ensemble de propriétés. Nous n'avons pas encore rencontré la première (PolygonKind) et donc nous sommes obligés d'aller plus avant dans notre quête aux fichiers IDL :

Listing 109 PolygonKind Enumeration : IDL File // IDL module com { module sun { module star { module drawing { enum PolygonKind { /** This is the PolygonKind for a LineShape. */ LINE, /** This is the PolygonKind for a PolyPolygonShape. */ POLY, /** This is the PolygonKind for a PolyLineShape. */ PLIN, /** This is the PolygonKind for an OpenBezierShape. */ PATHLINE, /** This is the PolygonKind for a ClosedBezierShape. */ PATHFILL, /** This is the PolygonKind for an OpenFreeHandShape. */ FREELINE, /** This is the PolygonKind for a ClosedFreeHandShape. */ FREEFILL, /** This is the PolygonKind for a PolyPolygonPathShape. */ PATHPOLY, /** This is the PolygonKind for a PolyLinePathShape. */ PATHPLIN }; }; }; }; };

Notez que cette propriété est en lecture seule. Nous avons pour une fois laissé les commentaires pour comprendre les significations des valeurs pas toujours très simple à inférer à partir des seuls noms. Le code suivant est une illustration de tout cela par une courbe de Bezier fermée :

Listing 110 Forme de Bezier fermée : un exemple // C++ // Bezier // Don't forget to add : #include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp> // Don't forget to add "com.sun.star.drawing.PolyPolygonBezierCoords \" in the makefile

struct PolyPolygonBezierCoords BezierCords;

// we suppose we use the previous declarations of PointsSeqSeq and PointsArray // (previous chapter on PolyPolygonShape) : we then only realloc

PointsSeqSeq.realloc(1); PointsArray.realloc(4);

MakePosition(1000, 1000, &PointsArray[0]); MakePosition(3000, 4000, &PointsArray[1]); MakePosition(3000, 4000, &PointsArray[2]); MakePosition(5000, 1000, &PointsArray[3]); PointsSeqSeq[0]=PointsArray; BezierCords.Coordinates = PointsSeqSeq;

// Don't forget to add : #include <com/sun/star/drawing/FlagSequenceSequence.hpp> // Don't forget to add "com.sun.star.drawing.FlagSequenceSequence \" in the makefile // Don't forget to add : #include <com/sun/star/drawing/FlagSequence.hpp> // Don't forget to add "com.sun.star.drawing.FlagSequence \" in the makefile FlagSequenceSequence flagsSeqSeq(1); FlagSequence flagsSeq(4);

// Don't forget to add : #include <com/sun/star/drawing/PolygonFlags.hpp> // Don't forget to add "com.sun.star.drawing.PolygonFlags \" in the makefile flagsSeq[0] = PolygonFlags_NORMAL; flagsSeq[1] = PolygonFlags_CONTROL; flagsSeq[2] = PolygonFlags_CONTROL; flagsSeq[3] = PolygonFlags_NORMAL; flagsSeqSeq[0] = flagsSeq; BezierCords.Flags = flagsSeqSeq; // PolyPolygonBezier is a property => construct a Any type; Any ClosedBezierProperty; ClosedBezierProperty <<= BezierCords; // create the PolyPolygonBezierShape Service Reference< XInterface > closedBezierShape = DocFactory->createInstance( OUString::createFromAscii("com.sun.star.drawing.ClosedBezierShape") ); Reference< XShape > rClosedBezierShape(closedBezierShape, UNO_QUERY); if (! rClosedBezierShape.is()) printf("****Pb with Bezier\n"); DrawMe(rClosedBezierShape, rDrawPage, ""); // Adjust the properties : Reference< XPropertySet > rClosedBezierShapeProps(rClosedBezierShape,UNO_QUERY); rClosedBezierShapeProps->setPropertyValue(OUString::createFromAscii

                              ("PolyPolygonBezier"),	ClosedBezierProperty);

En lisant le fichier IDL PolyPolygonBezierShape.idl je déduis que je n'ai qu'à remplacer “ClosedBezierShape” par “PolyPolygonBezierShape pour avoir une forme de Bezier ouverte. Mais cela ne fonctionne pas et je ne sais pas pourquoi pour le moment. Andrew Pitonyak a écrit dans son livre : “toutes les combinaisons de points et de drapeaux ne sont pas valides” et je suppose avoir une mauvaise combinaison des deux.

Personal tools