<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>http://wiki.archi-cadlink.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Simon</id>
	<title>Wiki-Cadlink - Contributions de l’utilisateur [fr]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.archi-cadlink.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Simon"/>
	<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Sp%C3%A9cial:Contributions/Simon"/>
	<updated>2026-05-27T20:30:19Z</updated>
	<subtitle>Contributions de l’utilisateur</subtitle>
	<generator>MediaWiki 1.32.0</generator>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=80</id>
		<title>Code snippet</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=80"/>
		<updated>2024-01-22T13:27:54Z</updated>

		<summary type="html">&lt;p&gt;Simon : /* Script interface */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== HOTSPOT ==&lt;br /&gt;
=== 2D ===&lt;br /&gt;
==== Boite englobante ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0, 0&lt;br /&gt;
HOTSPOT2 a, 0&lt;br /&gt;
HOTSPOT2 0, b&lt;br /&gt;
HOTSPOT2 a, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 -a/2, -b/2&lt;br /&gt;
HOTSPOT2 a/2, -b/2&lt;br /&gt;
HOTSPOT2 -a/2, b/2&lt;br /&gt;
HOTSPOT2 a/2, b/2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 -1, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0,  0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,	-1, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,  b, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur les deux axes en même temps =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0,  b, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 -1,  b, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a,  b, unID, a, 2		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a,  0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2  a, -1, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a,  b, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Rotation =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, angle, 6							: unID=unID+1&lt;br /&gt;
HOTSPOT2  A, 0, unID, angle, 4+128						: unID=unID+1&lt;br /&gt;
HOTSPOT2  A*COS(angle), A*SIN(angle), unID, angle, 5	: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D===&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT  0, 0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT -1, 0, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT  a, 0, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0,  0,	0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0,	-1,	0, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0,  b,	0, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Z =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0, 0,  0, unID, ZZYZX, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,	-1, unID, ZZYZX, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,  ZZYZX, unID, ZZYZX, 2	: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HOTLINE ==&lt;br /&gt;
=== Boite englobante ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTLINE2 0, 0, a, 0&lt;br /&gt;
HOTLINE2 a, 0, a, b&lt;br /&gt;
HOTLINE2 0, b, a, b&lt;br /&gt;
HOTLINE2 0, 0, 0, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gestion de l'affichage ==&lt;br /&gt;
=== Affichage différent en fonction de l'étage d'implantation ===&lt;br /&gt;
* L'objet placé doit être paramétré en &amp;quot;Visible sur tous les étages&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zz = REQUEST (&amp;quot;Story&amp;quot;, &amp;quot;&amp;quot;, index1, story_name) ! Étage affiché&lt;br /&gt;
zz = REQUEST (&amp;quot;Home_story&amp;quot;, &amp;quot;&amp;quot;, index2, home_story_name) ! Étage d'implantation de l'objet&lt;br /&gt;
&lt;br /&gt;
IF index1 &amp;gt; index2 THEN&lt;br /&gt;
	!Symbole 2D affiché au dessus de l'étage d'implantation&lt;br /&gt;
ENDIF&lt;br /&gt;
IF index1 = index2 THEN&lt;br /&gt;
	!Symbole 2D affiché sur l'étage d'implantation&lt;br /&gt;
ENDIF&lt;br /&gt;
IF index1 &amp;lt; index2 THEN&lt;br /&gt;
	!Symbole 2D affiché en dessous de l'étage d'implantation&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Orientation 2D ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MUL2 1 - 2 * SYMB_MIRRORED, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
r = request (&amp;quot;View_Rotangle&amp;quot;, &amp;quot;&amp;quot;, _angleViewRot)&lt;br /&gt;
&lt;br /&gt;
! Actual rotation of the 2D symbol:	&lt;br /&gt;
_totalRotate	= (SYMB_ROTANGLE + _angleViewRot) MOD 360&lt;br /&gt;
&lt;br /&gt;
! Count the number of transformations of the &lt;br /&gt;
! coordinate system in different cases&lt;br /&gt;
_nTrans = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Toujours horizontal ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rot2 _totalRotate * (SYMB_MIRRORED - not(SYMB_MIRRORED))&lt;br /&gt;
_nTrans = _nTrans + 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Lisible ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
IF (_totalRotate &amp;gt; (90 + 90*SYMB_MIRRORED + EPS) &amp;amp; _totalRotate &amp;lt; (270 + 90*SYMB_MIRRORED + EPS)) THEN&lt;br /&gt;
    ROT2 180&lt;br /&gt;
    _nTrans = _nTrans + 1&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Script interface ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_dialog `Paramètres personnalisés`,444,266&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Checkbox (texte cliquable) ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_infield{3} &amp;quot;bool-parameter&amp;quot;, 240, 30, 110, 15,&lt;br /&gt;
7, &amp;quot;&amp;quot;,&lt;br /&gt;
2,&lt;br /&gt;
1, 20, 20, 20, 20,&lt;br /&gt;
0, &amp;quot;Texte&amp;quot;, 0,&lt;br /&gt;
1, &amp;quot;Texte&amp;quot;, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Liste de polices ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dim fontnames[]&lt;br /&gt;
n = REQUEST (&amp;quot;FONTNAMES_LIST&amp;quot;, &amp;quot;&amp;quot;, fontnames)&lt;br /&gt;
ui_outfield `Police`,		10, 14, 100, 15 &lt;br /&gt;
ui_custom_popup_infield &amp;quot;sampleName&amp;quot;, 	115, 10, 150, 20,&lt;br /&gt;
	0, 0, 1, &amp;quot;&amp;quot;, fontnames&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On peut aussi récupérer la liste directement en utilisant ces noms de paramètres (type texte) :&lt;br /&gt;
* fontType&lt;br /&gt;
* fontType2&lt;br /&gt;
* fontType3&lt;br /&gt;
=== Liste des images chargées en bibliothèques ===&lt;br /&gt;
En utilisant ces noms de paramètres (type texte) :&lt;br /&gt;
* gs_picture_name&lt;br /&gt;
* gs_picture_name_2D&lt;br /&gt;
=== Icones mise en forme de texte ===&lt;br /&gt;
Pour avoir les icônes Gras, Italique, Souligné et Barré qui gère automatiquement la valeur du code pour mettre en forme un texte dans un style :&lt;br /&gt;
&amp;lt;pre&amp;gt;ui_textstyle_infield &amp;quot;styleTexte&amp;quot;, 1+2+4+128, x, y, buttonWidth, buttonHeight, buttonOffsetX&amp;lt;/pre&amp;gt;&lt;br /&gt;
(&amp;quot;styleTexte&amp;quot; est un paramètre de type entier)&lt;br /&gt;
&amp;lt;pre&amp;gt;define style name fontType, size, anchor, styleTexte&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Macros ==&lt;br /&gt;
=== Suis-je une macro ? ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nameM=&amp;quot;&amp;quot;&lt;br /&gt;
sts=REQUEST(&amp;quot;name_of_main&amp;quot;,&amp;quot;&amp;quot;,nameM)&lt;br /&gt;
IF NOT(nameM=&amp;quot;&amp;quot;) THEN&lt;br /&gt;
  PRINT nameM+&amp;quot; is CALLing me!&amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  PRINT &amp;quot;I am free!&amp;quot;&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Mathématiques ==&lt;br /&gt;
=== Comparaisons ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABS( A - B )&amp;gt;EPS   ! A&amp;lt;&amp;gt;B&lt;br /&gt;
ABS( A - B )&amp;lt;EPS   ! A=B&lt;br /&gt;
A - B &amp;lt; EPS        ! A&amp;lt;=B&lt;br /&gt;
A - B &amp;lt; -EPS       ! A&amp;lt;B&lt;br /&gt;
B - A &amp;gt; EPS        ! A&amp;lt;B&lt;br /&gt;
B - A &amp;lt; EPS        ! A&amp;gt;=B&lt;br /&gt;
B - A &amp;lt; -EPS       ! A&amp;gt;B&lt;br /&gt;
A - B &amp;gt; EPS        ! A&amp;gt;B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Trucs &amp;amp; astuces divers ==&lt;br /&gt;
=== Transformer POLY_B{5} en PRISM_ à l'aide d'une recherche REGEX ===&lt;br /&gt;
Dans un éditeur de texte supportant les recherches REGEX (Regular Expression) :&lt;br /&gt;
&lt;br /&gt;
Chercher : &amp;lt;code&amp;gt;(?-s)^\t*poly2_b\{5\} *([0-9]+),(?s).*? 0, $&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer par : &amp;lt;code&amp;gt;PRISM_ \1, b,&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=79</id>
		<title>Code snippet</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=79"/>
		<updated>2024-01-22T13:24:25Z</updated>

		<summary type="html">&lt;p&gt;Simon : /* Script interface */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== HOTSPOT ==&lt;br /&gt;
=== 2D ===&lt;br /&gt;
==== Boite englobante ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0, 0&lt;br /&gt;
HOTSPOT2 a, 0&lt;br /&gt;
HOTSPOT2 0, b&lt;br /&gt;
HOTSPOT2 a, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 -a/2, -b/2&lt;br /&gt;
HOTSPOT2 a/2, -b/2&lt;br /&gt;
HOTSPOT2 -a/2, b/2&lt;br /&gt;
HOTSPOT2 a/2, b/2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 -1, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0,  0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,	-1, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,  b, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur les deux axes en même temps =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0,  b, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 -1,  b, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a,  b, unID, a, 2		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a,  0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2  a, -1, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a,  b, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Rotation =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, angle, 6							: unID=unID+1&lt;br /&gt;
HOTSPOT2  A, 0, unID, angle, 4+128						: unID=unID+1&lt;br /&gt;
HOTSPOT2  A*COS(angle), A*SIN(angle), unID, angle, 5	: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D===&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT  0, 0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT -1, 0, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT  a, 0, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0,  0,	0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0,	-1,	0, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0,  b,	0, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Z =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0, 0,  0, unID, ZZYZX, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,	-1, unID, ZZYZX, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,  ZZYZX, unID, ZZYZX, 2	: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HOTLINE ==&lt;br /&gt;
=== Boite englobante ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTLINE2 0, 0, a, 0&lt;br /&gt;
HOTLINE2 a, 0, a, b&lt;br /&gt;
HOTLINE2 0, b, a, b&lt;br /&gt;
HOTLINE2 0, 0, 0, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gestion de l'affichage ==&lt;br /&gt;
=== Affichage différent en fonction de l'étage d'implantation ===&lt;br /&gt;
* L'objet placé doit être paramétré en &amp;quot;Visible sur tous les étages&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zz = REQUEST (&amp;quot;Story&amp;quot;, &amp;quot;&amp;quot;, index1, story_name) ! Étage affiché&lt;br /&gt;
zz = REQUEST (&amp;quot;Home_story&amp;quot;, &amp;quot;&amp;quot;, index2, home_story_name) ! Étage d'implantation de l'objet&lt;br /&gt;
&lt;br /&gt;
IF index1 &amp;gt; index2 THEN&lt;br /&gt;
	!Symbole 2D affiché au dessus de l'étage d'implantation&lt;br /&gt;
ENDIF&lt;br /&gt;
IF index1 = index2 THEN&lt;br /&gt;
	!Symbole 2D affiché sur l'étage d'implantation&lt;br /&gt;
ENDIF&lt;br /&gt;
IF index1 &amp;lt; index2 THEN&lt;br /&gt;
	!Symbole 2D affiché en dessous de l'étage d'implantation&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Orientation 2D ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MUL2 1 - 2 * SYMB_MIRRORED, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
r = request (&amp;quot;View_Rotangle&amp;quot;, &amp;quot;&amp;quot;, _angleViewRot)&lt;br /&gt;
&lt;br /&gt;
! Actual rotation of the 2D symbol:	&lt;br /&gt;
_totalRotate	= (SYMB_ROTANGLE + _angleViewRot) MOD 360&lt;br /&gt;
&lt;br /&gt;
! Count the number of transformations of the &lt;br /&gt;
! coordinate system in different cases&lt;br /&gt;
_nTrans = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Toujours horizontal ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rot2 _totalRotate * (SYMB_MIRRORED - not(SYMB_MIRRORED))&lt;br /&gt;
_nTrans = _nTrans + 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Lisible ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
IF (_totalRotate &amp;gt; (90 + 90*SYMB_MIRRORED + EPS) &amp;amp; _totalRotate &amp;lt; (270 + 90*SYMB_MIRRORED + EPS)) THEN&lt;br /&gt;
    ROT2 180&lt;br /&gt;
    _nTrans = _nTrans + 1&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Script interface ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_dialog `Paramètres personnalisés`,444,266&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Checkbox (texte cliquable) ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_infield{3} &amp;quot;bool-parameter&amp;quot;, 240, 30, 110, 15,&lt;br /&gt;
7, &amp;quot;&amp;quot;,&lt;br /&gt;
2,&lt;br /&gt;
1, 20, 20, 20, 20,&lt;br /&gt;
0, &amp;quot;Texte&amp;quot;, 0,&lt;br /&gt;
1, &amp;quot;Texte&amp;quot;, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Liste de polices ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dim fontnames[]&lt;br /&gt;
n = REQUEST (&amp;quot;FONTNAMES_LIST&amp;quot;, &amp;quot;&amp;quot;, fontnames)&lt;br /&gt;
ui_outfield `Police`,		10, 14, 100, 15 &lt;br /&gt;
ui_custom_popup_infield &amp;quot;sampleName&amp;quot;, 	115, 10, 150, 20,&lt;br /&gt;
	0, 0, 1, &amp;quot;&amp;quot;, fontnames&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On peut aussi récupérer la liste directement en utilisant ces noms de paramètres (type texte) :&lt;br /&gt;
* fontType&lt;br /&gt;
* fontType2&lt;br /&gt;
* fontType3&lt;br /&gt;
=== Liste des images chargées en bibliothèques ===&lt;br /&gt;
En utilisant ces noms de paramètres (type texte) :&lt;br /&gt;
* gs_picture_name&lt;br /&gt;
* gs_picture_name_2D&lt;br /&gt;
&lt;br /&gt;
== Macros ==&lt;br /&gt;
=== Suis-je une macro ? ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nameM=&amp;quot;&amp;quot;&lt;br /&gt;
sts=REQUEST(&amp;quot;name_of_main&amp;quot;,&amp;quot;&amp;quot;,nameM)&lt;br /&gt;
IF NOT(nameM=&amp;quot;&amp;quot;) THEN&lt;br /&gt;
  PRINT nameM+&amp;quot; is CALLing me!&amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  PRINT &amp;quot;I am free!&amp;quot;&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Mathématiques ==&lt;br /&gt;
=== Comparaisons ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABS( A - B )&amp;gt;EPS   ! A&amp;lt;&amp;gt;B&lt;br /&gt;
ABS( A - B )&amp;lt;EPS   ! A=B&lt;br /&gt;
A - B &amp;lt; EPS        ! A&amp;lt;=B&lt;br /&gt;
A - B &amp;lt; -EPS       ! A&amp;lt;B&lt;br /&gt;
B - A &amp;gt; EPS        ! A&amp;lt;B&lt;br /&gt;
B - A &amp;lt; EPS        ! A&amp;gt;=B&lt;br /&gt;
B - A &amp;lt; -EPS       ! A&amp;gt;B&lt;br /&gt;
A - B &amp;gt; EPS        ! A&amp;gt;B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Trucs &amp;amp; astuces divers ==&lt;br /&gt;
=== Transformer POLY_B{5} en PRISM_ à l'aide d'une recherche REGEX ===&lt;br /&gt;
Dans un éditeur de texte supportant les recherches REGEX (Regular Expression) :&lt;br /&gt;
&lt;br /&gt;
Chercher : &amp;lt;code&amp;gt;(?-s)^\t*poly2_b\{5\} *([0-9]+),(?s).*? 0, $&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer par : &amp;lt;code&amp;gt;PRISM_ \1, b,&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=78</id>
		<title>Code snippet</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=78"/>
		<updated>2024-01-22T13:22:53Z</updated>

		<summary type="html">&lt;p&gt;Simon : /* Script interface */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== HOTSPOT ==&lt;br /&gt;
=== 2D ===&lt;br /&gt;
==== Boite englobante ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0, 0&lt;br /&gt;
HOTSPOT2 a, 0&lt;br /&gt;
HOTSPOT2 0, b&lt;br /&gt;
HOTSPOT2 a, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 -a/2, -b/2&lt;br /&gt;
HOTSPOT2 a/2, -b/2&lt;br /&gt;
HOTSPOT2 -a/2, b/2&lt;br /&gt;
HOTSPOT2 a/2, b/2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 -1, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0,  0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,	-1, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,  b, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur les deux axes en même temps =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0,  b, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 -1,  b, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a,  b, unID, a, 2		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a,  0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2  a, -1, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a,  b, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Rotation =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, angle, 6							: unID=unID+1&lt;br /&gt;
HOTSPOT2  A, 0, unID, angle, 4+128						: unID=unID+1&lt;br /&gt;
HOTSPOT2  A*COS(angle), A*SIN(angle), unID, angle, 5	: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D===&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT  0, 0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT -1, 0, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT  a, 0, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0,  0,	0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0,	-1,	0, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0,  b,	0, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Z =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0, 0,  0, unID, ZZYZX, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,	-1, unID, ZZYZX, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,  ZZYZX, unID, ZZYZX, 2	: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HOTLINE ==&lt;br /&gt;
=== Boite englobante ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTLINE2 0, 0, a, 0&lt;br /&gt;
HOTLINE2 a, 0, a, b&lt;br /&gt;
HOTLINE2 0, b, a, b&lt;br /&gt;
HOTLINE2 0, 0, 0, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gestion de l'affichage ==&lt;br /&gt;
=== Affichage différent en fonction de l'étage d'implantation ===&lt;br /&gt;
* L'objet placé doit être paramétré en &amp;quot;Visible sur tous les étages&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zz = REQUEST (&amp;quot;Story&amp;quot;, &amp;quot;&amp;quot;, index1, story_name) ! Étage affiché&lt;br /&gt;
zz = REQUEST (&amp;quot;Home_story&amp;quot;, &amp;quot;&amp;quot;, index2, home_story_name) ! Étage d'implantation de l'objet&lt;br /&gt;
&lt;br /&gt;
IF index1 &amp;gt; index2 THEN&lt;br /&gt;
	!Symbole 2D affiché au dessus de l'étage d'implantation&lt;br /&gt;
ENDIF&lt;br /&gt;
IF index1 = index2 THEN&lt;br /&gt;
	!Symbole 2D affiché sur l'étage d'implantation&lt;br /&gt;
ENDIF&lt;br /&gt;
IF index1 &amp;lt; index2 THEN&lt;br /&gt;
	!Symbole 2D affiché en dessous de l'étage d'implantation&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Orientation 2D ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MUL2 1 - 2 * SYMB_MIRRORED, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
r = request (&amp;quot;View_Rotangle&amp;quot;, &amp;quot;&amp;quot;, _angleViewRot)&lt;br /&gt;
&lt;br /&gt;
! Actual rotation of the 2D symbol:	&lt;br /&gt;
_totalRotate	= (SYMB_ROTANGLE + _angleViewRot) MOD 360&lt;br /&gt;
&lt;br /&gt;
! Count the number of transformations of the &lt;br /&gt;
! coordinate system in different cases&lt;br /&gt;
_nTrans = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Toujours horizontal ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rot2 _totalRotate * (SYMB_MIRRORED - not(SYMB_MIRRORED))&lt;br /&gt;
_nTrans = _nTrans + 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Lisible ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
IF (_totalRotate &amp;gt; (90 + 90*SYMB_MIRRORED + EPS) &amp;amp; _totalRotate &amp;lt; (270 + 90*SYMB_MIRRORED + EPS)) THEN&lt;br /&gt;
    ROT2 180&lt;br /&gt;
    _nTrans = _nTrans + 1&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Script interface ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_dialog `Paramètres personnalisés`,444,266&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Checkbox (texte cliquable) ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_infield{3} &amp;quot;bool-parameter&amp;quot;, 240, 30, 110, 15,&lt;br /&gt;
7, &amp;quot;&amp;quot;,&lt;br /&gt;
2,&lt;br /&gt;
1, 20, 20, 20, 20,&lt;br /&gt;
0, &amp;quot;Texte&amp;quot;, 0,&lt;br /&gt;
1, &amp;quot;Texte&amp;quot;, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Liste de polices ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dim fontnames[]&lt;br /&gt;
n = REQUEST (&amp;quot;FONTNAMES_LIST&amp;quot;, &amp;quot;&amp;quot;, fontnames)&lt;br /&gt;
ui_outfield `Police`,		10, 14, 100, 15 &lt;br /&gt;
ui_custom_popup_infield &amp;quot;sampleName&amp;quot;, 	115, 10, 150, 20,&lt;br /&gt;
	0, 0, 1, &amp;quot;&amp;quot;, fontnames&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On peut aussi récupérer la liste directement en utilisant ces noms de paramètres (type texte) :&lt;br /&gt;
* fontType&lt;br /&gt;
* fontType2&lt;br /&gt;
* fontType3&lt;br /&gt;
&lt;br /&gt;
== Macros ==&lt;br /&gt;
=== Suis-je une macro ? ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nameM=&amp;quot;&amp;quot;&lt;br /&gt;
sts=REQUEST(&amp;quot;name_of_main&amp;quot;,&amp;quot;&amp;quot;,nameM)&lt;br /&gt;
IF NOT(nameM=&amp;quot;&amp;quot;) THEN&lt;br /&gt;
  PRINT nameM+&amp;quot; is CALLing me!&amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  PRINT &amp;quot;I am free!&amp;quot;&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Mathématiques ==&lt;br /&gt;
=== Comparaisons ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABS( A - B )&amp;gt;EPS   ! A&amp;lt;&amp;gt;B&lt;br /&gt;
ABS( A - B )&amp;lt;EPS   ! A=B&lt;br /&gt;
A - B &amp;lt; EPS        ! A&amp;lt;=B&lt;br /&gt;
A - B &amp;lt; -EPS       ! A&amp;lt;B&lt;br /&gt;
B - A &amp;gt; EPS        ! A&amp;lt;B&lt;br /&gt;
B - A &amp;lt; EPS        ! A&amp;gt;=B&lt;br /&gt;
B - A &amp;lt; -EPS       ! A&amp;gt;B&lt;br /&gt;
A - B &amp;gt; EPS        ! A&amp;gt;B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Trucs &amp;amp; astuces divers ==&lt;br /&gt;
=== Transformer POLY_B{5} en PRISM_ à l'aide d'une recherche REGEX ===&lt;br /&gt;
Dans un éditeur de texte supportant les recherches REGEX (Regular Expression) :&lt;br /&gt;
&lt;br /&gt;
Chercher : &amp;lt;code&amp;gt;(?-s)^\t*poly2_b\{5\} *([0-9]+),(?s).*? 0, $&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer par : &amp;lt;code&amp;gt;PRISM_ \1, b,&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=77</id>
		<title>Code snippet</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=77"/>
		<updated>2023-11-10T13:47:56Z</updated>

		<summary type="html">&lt;p&gt;Simon : /* Lisible */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== HOTSPOT ==&lt;br /&gt;
=== 2D ===&lt;br /&gt;
==== Boite englobante ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0, 0&lt;br /&gt;
HOTSPOT2 a, 0&lt;br /&gt;
HOTSPOT2 0, b&lt;br /&gt;
HOTSPOT2 a, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 -a/2, -b/2&lt;br /&gt;
HOTSPOT2 a/2, -b/2&lt;br /&gt;
HOTSPOT2 -a/2, b/2&lt;br /&gt;
HOTSPOT2 a/2, b/2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 -1, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0,  0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,	-1, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,  b, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur les deux axes en même temps =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0,  b, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 -1,  b, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a,  b, unID, a, 2		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a,  0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2  a, -1, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a,  b, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Rotation =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, angle, 6							: unID=unID+1&lt;br /&gt;
HOTSPOT2  A, 0, unID, angle, 4+128						: unID=unID+1&lt;br /&gt;
HOTSPOT2  A*COS(angle), A*SIN(angle), unID, angle, 5	: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D===&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT  0, 0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT -1, 0, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT  a, 0, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0,  0,	0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0,	-1,	0, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0,  b,	0, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Z =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0, 0,  0, unID, ZZYZX, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,	-1, unID, ZZYZX, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,  ZZYZX, unID, ZZYZX, 2	: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HOTLINE ==&lt;br /&gt;
=== Boite englobante ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTLINE2 0, 0, a, 0&lt;br /&gt;
HOTLINE2 a, 0, a, b&lt;br /&gt;
HOTLINE2 0, b, a, b&lt;br /&gt;
HOTLINE2 0, 0, 0, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gestion de l'affichage ==&lt;br /&gt;
=== Affichage différent en fonction de l'étage d'implantation ===&lt;br /&gt;
* L'objet placé doit être paramétré en &amp;quot;Visible sur tous les étages&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zz = REQUEST (&amp;quot;Story&amp;quot;, &amp;quot;&amp;quot;, index1, story_name) ! Étage affiché&lt;br /&gt;
zz = REQUEST (&amp;quot;Home_story&amp;quot;, &amp;quot;&amp;quot;, index2, home_story_name) ! Étage d'implantation de l'objet&lt;br /&gt;
&lt;br /&gt;
IF index1 &amp;gt; index2 THEN&lt;br /&gt;
	!Symbole 2D affiché au dessus de l'étage d'implantation&lt;br /&gt;
ENDIF&lt;br /&gt;
IF index1 = index2 THEN&lt;br /&gt;
	!Symbole 2D affiché sur l'étage d'implantation&lt;br /&gt;
ENDIF&lt;br /&gt;
IF index1 &amp;lt; index2 THEN&lt;br /&gt;
	!Symbole 2D affiché en dessous de l'étage d'implantation&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Orientation 2D ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MUL2 1 - 2 * SYMB_MIRRORED, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
r = request (&amp;quot;View_Rotangle&amp;quot;, &amp;quot;&amp;quot;, _angleViewRot)&lt;br /&gt;
&lt;br /&gt;
! Actual rotation of the 2D symbol:	&lt;br /&gt;
_totalRotate	= (SYMB_ROTANGLE + _angleViewRot) MOD 360&lt;br /&gt;
&lt;br /&gt;
! Count the number of transformations of the &lt;br /&gt;
! coordinate system in different cases&lt;br /&gt;
_nTrans = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Toujours horizontal ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rot2 _totalRotate * (SYMB_MIRRORED - not(SYMB_MIRRORED))&lt;br /&gt;
_nTrans = _nTrans + 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Lisible ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
IF (_totalRotate &amp;gt; (90 + 90*SYMB_MIRRORED + EPS) &amp;amp; _totalRotate &amp;lt; (270 + 90*SYMB_MIRRORED + EPS)) THEN&lt;br /&gt;
    ROT2 180&lt;br /&gt;
    _nTrans = _nTrans + 1&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Script interface ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_dialog `Paramètres personnalisés`,444,266&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Checkbox (texte cliquable) ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_infield{3} &amp;quot;bool-parameter&amp;quot;, 240, 30, 110, 15,&lt;br /&gt;
7, &amp;quot;&amp;quot;,&lt;br /&gt;
2,&lt;br /&gt;
1, 20, 20, 20, 20,&lt;br /&gt;
0, &amp;quot;Texte&amp;quot;, 0,&lt;br /&gt;
1, &amp;quot;Texte&amp;quot;, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Liste de polices ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dim fontnames[]&lt;br /&gt;
n = REQUEST (&amp;quot;FONTNAMES_LIST&amp;quot;, &amp;quot;&amp;quot;, fontnames)&lt;br /&gt;
ui_outfield `Police`,		10, 14, 100, 15 &lt;br /&gt;
ui_custom_popup_infield &amp;quot;sampleName&amp;quot;, 	115, 10, 150, 20,&lt;br /&gt;
	0, 0, 1, &amp;quot;&amp;quot;, fontnames&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Macros ==&lt;br /&gt;
=== Suis-je une macro ? ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nameM=&amp;quot;&amp;quot;&lt;br /&gt;
sts=REQUEST(&amp;quot;name_of_main&amp;quot;,&amp;quot;&amp;quot;,nameM)&lt;br /&gt;
IF NOT(nameM=&amp;quot;&amp;quot;) THEN&lt;br /&gt;
  PRINT nameM+&amp;quot; is CALLing me!&amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  PRINT &amp;quot;I am free!&amp;quot;&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Mathématiques ==&lt;br /&gt;
=== Comparaisons ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABS( A - B )&amp;gt;EPS   ! A&amp;lt;&amp;gt;B&lt;br /&gt;
ABS( A - B )&amp;lt;EPS   ! A=B&lt;br /&gt;
A - B &amp;lt; EPS        ! A&amp;lt;=B&lt;br /&gt;
A - B &amp;lt; -EPS       ! A&amp;lt;B&lt;br /&gt;
B - A &amp;gt; EPS        ! A&amp;lt;B&lt;br /&gt;
B - A &amp;lt; EPS        ! A&amp;gt;=B&lt;br /&gt;
B - A &amp;lt; -EPS       ! A&amp;gt;B&lt;br /&gt;
A - B &amp;gt; EPS        ! A&amp;gt;B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Trucs &amp;amp; astuces divers ==&lt;br /&gt;
=== Transformer POLY_B{5} en PRISM_ à l'aide d'une recherche REGEX ===&lt;br /&gt;
Dans un éditeur de texte supportant les recherches REGEX (Regular Expression) :&lt;br /&gt;
&lt;br /&gt;
Chercher : &amp;lt;code&amp;gt;(?-s)^\t*poly2_b\{5\} *([0-9]+),(?s).*? 0, $&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer par : &amp;lt;code&amp;gt;PRISM_ \1, b,&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Premier_script_en_python,_un_exemple_expliqu%C3%A9_de_A_%C3%A0_Z&amp;diff=54</id>
		<title>Premier script en python, un exemple expliqué de A à Z</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Premier_script_en_python,_un_exemple_expliqu%C3%A9_de_A_%C3%A0_Z&amp;diff=54"/>
		<updated>2023-02-01T10:46:07Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Cet article fait suite à l'[[Introduction à l'utilisation de la connexion Archicad-Python]].&lt;br /&gt;
&lt;br /&gt;
Ce premier script est directement récupéré du tutoriel de Tibor Lorántfy, un ancien développeur de chez graphisoft :&lt;br /&gt;
&lt;br /&gt;
https://archicadapi.graphisoft.com/getting-started-with-archicad-python-connection&lt;br /&gt;
&lt;br /&gt;
Ce premier script va permettre d'afficher dans la console d'archicad le nombre de murs présents dans le projet.&lt;br /&gt;
&lt;br /&gt;
Je vais vous présenter dans un premier temps une version &amp;quot;brute&amp;quot; de ce script, ensuite la version optimale telle que proposée par Tibor, et enfin proposer une interface graphique (très light) avec Tkinter.&lt;br /&gt;
&lt;br /&gt;
Commencons!&lt;br /&gt;
&lt;br /&gt;
== La version &amp;quot;Brute&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Cette version est proposée pour mieux expliquer la méthodologie, mais elle n'est pas du tout recommandée. C'est le script écrit avec le minimum de ligne possible.&lt;br /&gt;
&lt;br /&gt;
Ça se fait... en 3 lignes !&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from archicad import ACConnection&lt;br /&gt;
walls = ACConnection.connect().commands.GetElementsByType('Wall')&lt;br /&gt;
print('Nombre de murs: ' + str(len(walls)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Analyse de la 1ere Ligne ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from archicad import ACConnection&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De manière générale, un script python ne charge pas toutes les fonctionnalité permises par python, et il faut au début du script indiquer les modules supplémentaires que l'on souhaites intégrer.&lt;br /&gt;
&lt;br /&gt;
Il peut s'agir d'un module permettant de travailler avec des fichiers excel (par exemple openpyxl) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from openpyxl import Workbook&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il peut aussi s'agir d'un module permettant de créer une interface graphique (par exemple Tkinter) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from tkinter import *&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il peut s'agir de modules permettant d'utiliser des images, créer de l'aléatoire, etc, etc.&lt;br /&gt;
&lt;br /&gt;
Ces modules sont parfois déjà intégré à l'installation de base de python et ne nécessitent pas d'installation supplémentaires, mais doivent tout de même être appelés (c'est le cas de l'interface graphique Tkinter), et parfois, il faut avoir préalablement installé ce module supplémentaire.&lt;br /&gt;
&lt;br /&gt;
Dans notre cas, '''cette première ligne est absolument nécessaire à tout les script python pour archicad''': Il indique à python de charger le module python/archicad installé sur l'ordinateur ce qui permettra d'accéder à toutes les commandes dédiées à archicad.&lt;br /&gt;
&lt;br /&gt;
=== Analyse de la 2eme Ligne ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
walls = ACConnection.connect().commands.GetElementsByType('Wall')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans cette deuxième ligne, on créé une variable nommée &amp;quot;walls&amp;quot; et on utilise la commande permettant de récupérer tout les éléments créé avec l'outil mur. J'ai dessiné dans mon fichier archicad 4 murs sur l'étage RDC.&lt;br /&gt;
&lt;br /&gt;
==== La commande pour Récupérer les éléments selon leur type ====&lt;br /&gt;
&lt;br /&gt;
Pour récupérer l'ensemble des murs du projet on va utiliser la commande GetElementsByType(), ce qui donne en français &amp;quot;Récupérer les éléments selon leur type&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour avoir des infos sur cette fonction on peut soit aller sur le site python pour archicad:&lt;br /&gt;
https://archicadapi.graphisoft.com/archicadPythonPackage/archicad.releases.ac24.html#archicad.releases.ac24.b2310commands.Commands.GetElementsByType&lt;br /&gt;
&lt;br /&gt;
soit aller dans Visual Studio code:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python11.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans Visual Studio Code, on a donc:&lt;br /&gt;
# le nom de la commande (1),&lt;br /&gt;
# ce qu'elle fait (2)&lt;br /&gt;
# le type de fonction (3) : une commande,&lt;br /&gt;
# le type d'argument qu'il faudra mettre entre les () et sous quelle forme (4): ici une chaîne indiquant le type de l’élément. Il faudra donc écrire en anglais le type entre deux guillemets &amp;quot; &amp;quot;&lt;br /&gt;
# le résultat qui nous sera renvoyé (5): une liste de type &amp;quot;ElementIdArrayItem&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Comment lancer la commande ? ====&lt;br /&gt;
Si on suit la partie précédente on doit donc écrire:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GetElementsByType(&amp;quot;Wall&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour lancer cette fonction, il faut toutefois rajouter quelques informations:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python12.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On indique à python qu'on veut utiliser le module python pour archicad (1), puis qu'on veut se connecter à archicad (2), qu'on veut utiliser une commande (3) et enfin quelle commande on veut utiliser (4).&lt;br /&gt;
&lt;br /&gt;
==== Le résultat obtenu avec la 2eme ligne ====&lt;br /&gt;
&lt;br /&gt;
On a créé une variable walls qui récupère le résultat de la commande GetElementsByType()&lt;br /&gt;
&lt;br /&gt;
SI on utilisait la fonction &amp;quot;print&amp;quot; pour voir ce que récupère la variable &amp;quot;walls&amp;quot;, cela donnerait ça:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ElementIdArrayItem {'elementId': {'guid': '86E4F938-8783-4E1C-881E-91C60E902526'}}, ElementIdArrayItem {'elementId': {'guid': 'E794D806-E94C-49D1-9854-A238F49D4AE3'}}, ElementIdArrayItem {'elementId': {'guid': 'B848DBB3-E432-4AEE-8AD1-A8FB0F559BBE'}}, ElementIdArrayItem {'elementId': {'guid': 'FF09403B-BA6D-43D3-B936-6C44AD229F85'}}]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C'est &amp;quot;presque&amp;quot; du JSON. SI on &amp;quot;nettoie&amp;quot; un peu cette réponse pour la transformer en JSON on obtient ça:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;elements&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;elementId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;86E4F938-8783-4E1C-881E-91C60E902526&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;elementId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;E794D806-E94C-49D1-9854-A238F49D4AE3&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;elementId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;B848DBB3-E432-4AEE-8AD1-A8FB0F559BBE&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;elementId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;FF09403B-BA6D-43D3-B936-6C44AD229F85&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schématiquement cela donne çà:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python13.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C'est à dire qu'on a une liste de 4 valeurs (nos 4 murs), allant de l'index 0 à l'index 3 (ce qui corresponds aux 4 murs: mur index 0, mur index 1, mur index 2, mur index 3 )&lt;br /&gt;
&lt;br /&gt;
Cette notion d'index (en 1) sur le schéma n'est pas explicitement indiquée dans le format JSON, c'est une attribution automatique: la première valeur se voit attribuée l'index 0, la seconde l'index 1, etc... Comme une liste python.&lt;br /&gt;
&lt;br /&gt;
A chacun de ces éléments est associé un GUID: c'est un identifiant unique généré par le logiciel qui permet de retrouver cet élément. Cet identifiant reste constant et ne changera pas.&lt;br /&gt;
&lt;br /&gt;
On obtient donc une liste de 4 identifiants uniques (GUID) correspondant aux 4 murs du projet.&lt;br /&gt;
&lt;br /&gt;
=== Analyse de la 3eme Ligne ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print('Nombre de murs: ' + str(len(walls)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette troisième ligne est la plus simple, il s'agit de pur python, et du très basique.&lt;br /&gt;
&lt;br /&gt;
==== La fonction len() qui permet de compter le nombre d'éléments ====&lt;br /&gt;
&lt;br /&gt;
Si on utilise len sur la variable walls, cela s'écrira:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
len(walls)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et donnera comme résultat le nombre d'éléments dans la liste, soit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La fonction print() et une concaténation ==== &lt;br /&gt;
&lt;br /&gt;
On utilise la fonction print() et on fait une concaténation entre le texte Nombre de Murs: et le nombre de mur (en utilisant la fonction len() donc)&lt;br /&gt;
&lt;br /&gt;
Pour concaténer les valeurs, il faut qu'elles soient de même type. Le nombre obtenu par la fonction len() étant de type entier, nous utiliserons la fonction str() pour la transformer en chaine (string en anglais).&lt;br /&gt;
&lt;br /&gt;
Cela donne:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
str(len(walls))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On concatène en utilisant le symbole + entre les deux parties du même type, soit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'Nombre de murs: ' + str(len(walls)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on entre cette concaténation dans la fonction print().&lt;br /&gt;
&lt;br /&gt;
Voila le résultat:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:python14.jpg|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La &amp;quot;bonne méthode&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Le script tel que présenté par le développeur de Python pour archicad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from archicad import ACConnection&lt;br /&gt;
&lt;br /&gt;
conn = ACConnection.connect()&lt;br /&gt;
assert conn&lt;br /&gt;
&lt;br /&gt;
acc = conn.commands&lt;br /&gt;
act = conn.types&lt;br /&gt;
acu = conn.utilities&lt;br /&gt;
&lt;br /&gt;
walls = acc.GetElementsByType('Wall')&lt;br /&gt;
&lt;br /&gt;
print(f'Number of Walls: {len(walls)}')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En comparaison de la méthode Brute que je vous ai présentée juste avant:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from archicad import ACConnection&lt;br /&gt;
walls = ACConnection.connect().commands.GetElementsByType('Wall')&lt;br /&gt;
print('Nombre de murs: ' + str(len(walls)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C'est plus long dans la manière officielle, mais c'est pour le bien du script!&lt;br /&gt;
&lt;br /&gt;
=== La partie à conserver pour tout script ===&lt;br /&gt;
&lt;br /&gt;
De manière générale, tout vos script python pour archicad doivent comporter ces premières lignes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from archicad import ACConnection&lt;br /&gt;
&lt;br /&gt;
conn = ACConnection.connect()&lt;br /&gt;
assert conn&lt;br /&gt;
&lt;br /&gt;
acc = conn.commands&lt;br /&gt;
act = conn.types&lt;br /&gt;
acu = conn.utilities&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pourquoi? Tout simplement pour éviter d'écrire des commandes à rallonge, comme vu précédemment.&lt;br /&gt;
Cela permet d'utiliser ''acc'' plutôt que ''ACConnection.connect().commands''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:python15.jpeg|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cela permet pour l'ensemble du script d'utiliser seulement ''acc.NomDeLaCommande'', ''acu.NomDeLaFonctionUlitaire'' ou ''act.NomDuType''.&lt;br /&gt;
&lt;br /&gt;
L'instruction &amp;quot;''assert''&amp;quot; est une aide de code: si la connexion avec archicad ne se fait pas, le script donnera une erreur de type &amp;quot;''AssertionError''&amp;quot; ce qui permettra de comprendre d'où vient l'erreur plus facilement.&lt;br /&gt;
&lt;br /&gt;
Pour la partie du texte, la concaténation n'est pas recommandée en python, il est recommandé d’utiliser la méthode dites du &amp;quot;''f-Strings''&amp;quot;&lt;br /&gt;
Elle commence par un ''f'' suivi du texte entre deux guillemets (''&amp;lt;nowiki&amp;gt;'&amp;lt;/nowiki&amp;gt;''). Le texte fixe est écrit tel quel et les variables sont écrites entre accolades (''{}'').&lt;br /&gt;
&lt;br /&gt;
== Ajouter des fonctions à notre script ==&lt;br /&gt;
&lt;br /&gt;
Voici quelques exemples d'améliorations de script possibles.&lt;br /&gt;
&lt;br /&gt;
=== Un message pop-up pour afficher le résultat ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:python16.jpeg|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le code correspondant:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from archicad import ACConnection&lt;br /&gt;
from tkinter import *&lt;br /&gt;
from tkinter import messagebox&lt;br /&gt;
&lt;br /&gt;
conn = ACConnection.connect()&lt;br /&gt;
assert conn&lt;br /&gt;
&lt;br /&gt;
acc = conn.commands&lt;br /&gt;
act = conn.types&lt;br /&gt;
acu = conn.utilities&lt;br /&gt;
&lt;br /&gt;
walls = acc.GetElementsByType('Wall')&lt;br /&gt;
&lt;br /&gt;
messagebox.showinfo(&amp;quot;Informations&amp;quot;,f'Nombre de murs: {len(walls)}')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Quels sont les changements? ====&lt;br /&gt;
&lt;br /&gt;
===== Importer un nouveau module =====&lt;br /&gt;
On importe le module tkinter au début, ainsi que message box. Cela s'ecrit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from tkinter import *&lt;br /&gt;
from tkinter import messagebox&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Utiliser messagebox =====&lt;br /&gt;
&lt;br /&gt;
Pour afficher un message pop up, on va utiliser la fonction messagebox précédemment importée.et sa fonction showinfo (d'autres type de fonction existent: https://docs.python.org/3/library/tkinter.messagebox.html).&lt;br /&gt;
&lt;br /&gt;
Cette fonction demande au minimum 1 information; le texte qui sera indiqué dans le titre du Pop-Up. Le second texte sera affiché dans le corps du texte. Ces deux textes doivent être séparés par une virgule.&lt;br /&gt;
&lt;br /&gt;
Cela donne dans notre cas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
messagebox.showinfo(&amp;quot;Informations&amp;quot;,f'Nombre de murs: {len(walls)}')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copier le résultat dans le presse-papier ===&lt;br /&gt;
&lt;br /&gt;
Dans cette version, le résultat est affiché dans la console et copié dans le presse papier. Vous n'avez qu'à faire cmd+v ou ctrl+v pour coller le résultat où vous voulez.&lt;br /&gt;
&lt;br /&gt;
Pour trouver cette partie de code, j'ai du faire quelques recherches google pour trouver une méthodologie ne nécessitant pas l'installation d'un module complémentaire (Pyperclip) sur mon ordi. Il semblerait que ce soit très lourd d'utiliser tkinter pour cela, mais ça marche!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from archicad import ACConnection&lt;br /&gt;
from tkinter import *&lt;br /&gt;
&lt;br /&gt;
conn = ACConnection.connect()&lt;br /&gt;
assert conn&lt;br /&gt;
&lt;br /&gt;
acc = conn.commands&lt;br /&gt;
act = conn.types&lt;br /&gt;
acu = conn.utilities&lt;br /&gt;
&lt;br /&gt;
walls = acc.GetElementsByType('Wall')&lt;br /&gt;
text = f'Nombre de murs: {len(walls)}'&lt;br /&gt;
&lt;br /&gt;
print(text)&lt;br /&gt;
&lt;br /&gt;
r = Tk()&lt;br /&gt;
r.clipboard_clear()&lt;br /&gt;
r.clipboard_append(text)&lt;br /&gt;
r.after(300, r.destroy)&lt;br /&gt;
r.mainloop()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Accueil&amp;diff=53</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Accueil&amp;diff=53"/>
		<updated>2023-02-01T10:05:59Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GDL ==&lt;br /&gt;
* [[Le GDL pour les nuls]]&lt;br /&gt;
** [[Objet &amp;quot;Test&amp;quot;]]&lt;br /&gt;
** [[Symbole de trémie]]&lt;br /&gt;
** [[Premier objet en 3D]]&lt;br /&gt;
** [[Table]]&lt;br /&gt;
** [[Gradin]]&lt;br /&gt;
* [[Code snippet]]&lt;br /&gt;
&lt;br /&gt;
== Python ==&lt;br /&gt;
* [[Introduction à l'utilisation de la connexion Archicad-Python]]&lt;br /&gt;
* [[Premier script en python, un exemple expliqué de A à Z]]&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Utilisateur:Simon&amp;diff=52</id>
		<title>Utilisateur:Simon</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Utilisateur:Simon&amp;diff=52"/>
		<updated>2023-02-01T10:05:36Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Consultez le [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wiki.&lt;br /&gt;
&lt;br /&gt;
== Pour démarrer ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste des paramètres de configuration]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/fr Questions courantes sur MediaWiki]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Apprendre comment lutter contre le pourriel dans votre wiki]&lt;br /&gt;
&lt;br /&gt;
== Tests ==&lt;br /&gt;
* [[Introduction à l'utilisation de la connexion Archicad-Python]]&lt;br /&gt;
* [[Premier script en python, un exemple expliqué de A à Z]]&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Premier_script_en_python,_un_exemple_expliqu%C3%A9_de_A_%C3%A0_Z&amp;diff=51</id>
		<title>Premier script en python, un exemple expliqué de A à Z</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Premier_script_en_python,_un_exemple_expliqu%C3%A9_de_A_%C3%A0_Z&amp;diff=51"/>
		<updated>2023-02-01T10:04:29Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ce premier script est directement récupéré du tutoriel de Tibor Lorántfy, un ancien développeur de chez graphisoft :&lt;br /&gt;
&lt;br /&gt;
https://archicadapi.graphisoft.com/getting-started-with-archicad-python-connection&lt;br /&gt;
&lt;br /&gt;
Ce premier script va permettre d'afficher dans la console d'archicad le nombre de murs présents dans le projet.&lt;br /&gt;
&lt;br /&gt;
Je vais vous présenter dans un premier temps une version &amp;quot;brute&amp;quot; de ce script, ensuite la version optimale telle que proposée par Tibor, et enfin proposer une interface graphique (très light) avec Tkinter.&lt;br /&gt;
&lt;br /&gt;
Commencons!&lt;br /&gt;
&lt;br /&gt;
== La version &amp;quot;Brute&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Cette version est proposée pour mieux expliquer la méthodologie, mais elle n'est pas du tout recommandée. C'est le script écrit avec le minimum de ligne possible.&lt;br /&gt;
&lt;br /&gt;
Ça se fait... en 3 lignes !&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from archicad import ACConnection&lt;br /&gt;
walls = ACConnection.connect().commands.GetElementsByType('Wall')&lt;br /&gt;
print('Nombre de murs: ' + str(len(walls)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Analyse de la 1ere Ligne ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from archicad import ACConnection&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De manière générale, un script python ne charge pas toutes les fonctionnalité permises par python, et il faut au début du script indiquer les modules supplémentaires que l'on souhaites intégrer.&lt;br /&gt;
&lt;br /&gt;
Il peut s'agir d'un module permettant de travailler avec des fichiers excel (par exemple openpyxl) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from openpyxl import Workbook&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il peut aussi s'agir d'un module permettant de créer une interface graphique (par exemple Tkinter) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from tkinter import *&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il peut s'agir de modules permettant d'utiliser des images, créer de l'aléatoire, etc, etc.&lt;br /&gt;
&lt;br /&gt;
Ces modules sont parfois déjà intégré à l'installation de base de python et ne nécessitent pas d'installation supplémentaires, mais doivent tout de même être appelés (c'est le cas de l'interface graphique Tkinter), et parfois, il faut avoir préalablement installé ce module supplémentaire.&lt;br /&gt;
&lt;br /&gt;
Dans notre cas, '''cette première ligne est absolument nécessaire à tout les script python pour archicad''': Il indique à python de charger le module python/archicad installé sur l'ordinateur ce qui permettra d'accéder à toutes les commandes dédiées à archicad.&lt;br /&gt;
&lt;br /&gt;
=== Analyse de la 2eme Ligne ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
walls = ACConnection.connect().commands.GetElementsByType('Wall')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans cette deuxième ligne, on créé une variable nommée &amp;quot;walls&amp;quot; et on utilise la commande permettant de récupérer tout les éléments créé avec l'outil mur. J'ai dessiné dans mon fichier archicad 4 murs sur l'étage RDC.&lt;br /&gt;
&lt;br /&gt;
==== La commande pour Récupérer les éléments selon leur type ====&lt;br /&gt;
&lt;br /&gt;
Pour récupérer l'ensemble des murs du projet on va utiliser la commande GetElementsByType(), ce qui donne en français &amp;quot;Récupérer les éléments selon leur type&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour avoir des infos sur cette fonction on peut soit aller sur le site python pour archicad:&lt;br /&gt;
https://archicadapi.graphisoft.com/archicadPythonPackage/archicad.releases.ac24.html#archicad.releases.ac24.b2310commands.Commands.GetElementsByType&lt;br /&gt;
&lt;br /&gt;
soit aller dans Visual Studio code:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python11.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans Visual Studio Code, on a donc:&lt;br /&gt;
# le nom de la commande (1),&lt;br /&gt;
# ce qu'elle fait (2)&lt;br /&gt;
# le type de fonction (3) : une commande,&lt;br /&gt;
# le type d'argument qu'il faudra mettre entre les () et sous quelle forme (4): ici une chaîne indiquant le type de l’élément. Il faudra donc écrire en anglais le type entre deux guillemets &amp;quot; &amp;quot;&lt;br /&gt;
# le résultat qui nous sera renvoyé (5): une liste de type &amp;quot;ElementIdArrayItem&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Comment lancer la commande ? ====&lt;br /&gt;
Si on suit la partie précédente on doit donc écrire:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GetElementsByType(&amp;quot;Wall&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour lancer cette fonction, il faut toutefois rajouter quelques informations:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python12.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On indique à python qu'on veut utiliser le module python pour archicad (1), puis qu'on veut se connecter à archicad (2), qu'on veut utiliser une commande (3) et enfin quelle commande on veut utiliser (4).&lt;br /&gt;
&lt;br /&gt;
==== Le résultat obtenu avec la 2eme ligne ====&lt;br /&gt;
&lt;br /&gt;
On a créé une variable walls qui récupère le résultat de la commande GetElementsByType()&lt;br /&gt;
&lt;br /&gt;
SI on utilisait la fonction &amp;quot;print&amp;quot; pour voir ce que récupère la variable &amp;quot;walls&amp;quot;, cela donnerait ça:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ElementIdArrayItem {'elementId': {'guid': '86E4F938-8783-4E1C-881E-91C60E902526'}}, ElementIdArrayItem {'elementId': {'guid': 'E794D806-E94C-49D1-9854-A238F49D4AE3'}}, ElementIdArrayItem {'elementId': {'guid': 'B848DBB3-E432-4AEE-8AD1-A8FB0F559BBE'}}, ElementIdArrayItem {'elementId': {'guid': 'FF09403B-BA6D-43D3-B936-6C44AD229F85'}}]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C'est &amp;quot;presque&amp;quot; du JSON. SI on &amp;quot;nettoie&amp;quot; un peu cette réponse pour la transformer en JSON on obtient ça:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;elements&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;elementId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;86E4F938-8783-4E1C-881E-91C60E902526&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;elementId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;E794D806-E94C-49D1-9854-A238F49D4AE3&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;elementId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;B848DBB3-E432-4AEE-8AD1-A8FB0F559BBE&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;elementId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;FF09403B-BA6D-43D3-B936-6C44AD229F85&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schématiquement cela donne çà:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python13.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C'est à dire qu'on a une liste de 4 valeurs (nos 4 murs), allant de l'index 0 à l'index 3 (ce qui corresponds aux 4 murs: mur index 0, mur index 1, mur index 2, mur index 3 )&lt;br /&gt;
&lt;br /&gt;
Cette notion d'index (en 1) sur le schéma n'est pas explicitement indiquée dans le format JSON, c'est une attribution automatique: la première valeur se voit attribuée l'index 0, la seconde l'index 1, etc... Comme une liste python.&lt;br /&gt;
&lt;br /&gt;
A chacun de ces éléments est associé un GUID: c'est un identifiant unique généré par le logiciel qui permet de retrouver cet élément. Cet identifiant reste constant et ne changera pas.&lt;br /&gt;
&lt;br /&gt;
On obtient donc une liste de 4 identifiants uniques (GUID) correspondant aux 4 murs du projet.&lt;br /&gt;
&lt;br /&gt;
=== Analyse de la 3eme Ligne ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print('Nombre de murs: ' + str(len(walls)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette troisième ligne est la plus simple, il s'agit de pur python, et du très basique.&lt;br /&gt;
&lt;br /&gt;
==== La fonction len() qui permet de compter le nombre d'éléments ====&lt;br /&gt;
&lt;br /&gt;
Si on utilise len sur la variable walls, cela s'écrira:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
len(walls)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et donnera comme résultat le nombre d'éléments dans la liste, soit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La fonction print() et une concaténation ==== &lt;br /&gt;
&lt;br /&gt;
On utilise la fonction print() et on fait une concaténation entre le texte Nombre de Murs: et le nombre de mur (en utilisant la fonction len() donc)&lt;br /&gt;
&lt;br /&gt;
Pour concaténer les valeurs, il faut qu'elles soient de même type. Le nombre obtenu par la fonction len() étant de type entier, nous utiliserons la fonction str() pour la transformer en chaine (string en anglais).&lt;br /&gt;
&lt;br /&gt;
Cela donne:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
str(len(walls))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On concatène en utilisant le symbole + entre les deux parties du même type, soit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'Nombre de murs: ' + str(len(walls)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on entre cette concaténation dans la fonction print().&lt;br /&gt;
&lt;br /&gt;
Voila le résultat:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:python14.jpg|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La &amp;quot;bonne méthode&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Le script tel que présenté par le développeur de Python pour archicad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from archicad import ACConnection&lt;br /&gt;
&lt;br /&gt;
conn = ACConnection.connect()&lt;br /&gt;
assert conn&lt;br /&gt;
&lt;br /&gt;
acc = conn.commands&lt;br /&gt;
act = conn.types&lt;br /&gt;
acu = conn.utilities&lt;br /&gt;
&lt;br /&gt;
walls = acc.GetElementsByType('Wall')&lt;br /&gt;
&lt;br /&gt;
print(f'Number of Walls: {len(walls)}')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En comparaison de la méthode Brute que je vous ai présentée juste avant:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from archicad import ACConnection&lt;br /&gt;
walls = ACConnection.connect().commands.GetElementsByType('Wall')&lt;br /&gt;
print('Nombre de murs: ' + str(len(walls)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C'est plus long dans la manière officielle, mais c'est pour le bien du script!&lt;br /&gt;
&lt;br /&gt;
=== La partie à conserver pour tout script ===&lt;br /&gt;
&lt;br /&gt;
De manière générale, tout vos script python pour archicad doivent comporter ces premières lignes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from archicad import ACConnection&lt;br /&gt;
&lt;br /&gt;
conn = ACConnection.connect()&lt;br /&gt;
assert conn&lt;br /&gt;
&lt;br /&gt;
acc = conn.commands&lt;br /&gt;
act = conn.types&lt;br /&gt;
acu = conn.utilities&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pourquoi? Tout simplement pour éviter d'écrire des commandes à rallonge, comme vu précédemment.&lt;br /&gt;
Cela permet d'utiliser ''acc'' plutôt que ''ACConnection.connect().commands''&lt;br /&gt;
&lt;br /&gt;
[[Fichier:python15.jpeg|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cela permet pour l'ensemble du script d'utiliser seulement ''acc.NomDeLaCommande'', ''acu.NomDeLaFonctionUlitaire'' ou ''act.NomDuType''.&lt;br /&gt;
&lt;br /&gt;
L'instruction &amp;quot;''assert''&amp;quot; est une aide de code: si la connexion avec archicad ne se fait pas, le script donnera une erreur de type &amp;quot;''AssertionError''&amp;quot; ce qui permettra de comprendre d'où vient l'erreur plus facilement.&lt;br /&gt;
&lt;br /&gt;
Pour la partie du texte, la concaténation n'est pas recommandée en python, il est recommandé d’utiliser la méthode dites du &amp;quot;''f-Strings''&amp;quot;&lt;br /&gt;
Elle commence par un ''f'' suivi du texte entre deux guillemets (''&amp;lt;nowiki&amp;gt;'&amp;lt;/nowiki&amp;gt;''). Le texte fixe est écrit tel quel et les variables sont écrites entre accolades (''{}'').&lt;br /&gt;
&lt;br /&gt;
== Ajouter des fonctions à notre script ==&lt;br /&gt;
&lt;br /&gt;
Voici quelques exemples d'améliorations de script possibles.&lt;br /&gt;
&lt;br /&gt;
=== Un message pop-up pour afficher le résultat ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:python16.jpeg|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le code correspondant:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from archicad import ACConnection&lt;br /&gt;
from tkinter import *&lt;br /&gt;
from tkinter import messagebox&lt;br /&gt;
&lt;br /&gt;
conn = ACConnection.connect()&lt;br /&gt;
assert conn&lt;br /&gt;
&lt;br /&gt;
acc = conn.commands&lt;br /&gt;
act = conn.types&lt;br /&gt;
acu = conn.utilities&lt;br /&gt;
&lt;br /&gt;
walls = acc.GetElementsByType('Wall')&lt;br /&gt;
&lt;br /&gt;
messagebox.showinfo(&amp;quot;Informations&amp;quot;,f'Nombre de murs: {len(walls)}')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Quels sont les changements? ====&lt;br /&gt;
&lt;br /&gt;
===== Importer un nouveau module =====&lt;br /&gt;
On importe le module tkinter au début, ainsi que message box. Cela s'ecrit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from tkinter import *&lt;br /&gt;
from tkinter import messagebox&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Utiliser messagebox =====&lt;br /&gt;
&lt;br /&gt;
Pour afficher un message pop up, on va utiliser la fonction messagebox précédemment importée.et sa fonction showinfo (d'autres type de fonction existent: https://docs.python.org/3/library/tkinter.messagebox.html).&lt;br /&gt;
&lt;br /&gt;
Cette fonction demande au minimum 1 information; le texte qui sera indiqué dans le titre du Pop-Up. Le second texte sera affiché dans le corps du texte. Ces deux textes doivent être séparés par une virgule.&lt;br /&gt;
&lt;br /&gt;
Cela donne dans notre cas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
messagebox.showinfo(&amp;quot;Informations&amp;quot;,f'Nombre de murs: {len(walls)}')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copier le résultat dans le presse-papier ===&lt;br /&gt;
&lt;br /&gt;
Dans cette version, le résultat est affiché dans la console et copié dans le presse papier. Vous n'avez qu'à faire cmd+v ou ctrl+v pour coller le résultat où vous voulez.&lt;br /&gt;
&lt;br /&gt;
Pour trouver cette partie de code, j'ai du faire quelques recherches google pour trouver une méthodologie ne nécessitant pas l'installation d'un module complémentaire (Pyperclip) sur mon ordi. Il semblerait que ce soit très lourd d'utiliser tkinter pour cela, mais ça marche!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from archicad import ACConnection&lt;br /&gt;
from tkinter import *&lt;br /&gt;
&lt;br /&gt;
conn = ACConnection.connect()&lt;br /&gt;
assert conn&lt;br /&gt;
&lt;br /&gt;
acc = conn.commands&lt;br /&gt;
act = conn.types&lt;br /&gt;
acu = conn.utilities&lt;br /&gt;
&lt;br /&gt;
walls = acc.GetElementsByType('Wall')&lt;br /&gt;
text = f'Nombre de murs: {len(walls)}'&lt;br /&gt;
&lt;br /&gt;
print(text)&lt;br /&gt;
&lt;br /&gt;
r = Tk()&lt;br /&gt;
r.clipboard_clear()&lt;br /&gt;
r.clipboard_append(text)&lt;br /&gt;
r.after(300, r.destroy)&lt;br /&gt;
r.mainloop()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python16.jpeg&amp;diff=50</id>
		<title>Fichier:Python16.jpeg</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python16.jpeg&amp;diff=50"/>
		<updated>2023-02-01T10:00:23Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python15.jpeg&amp;diff=49</id>
		<title>Fichier:Python15.jpeg</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python15.jpeg&amp;diff=49"/>
		<updated>2023-02-01T09:54:22Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python14.jpg&amp;diff=48</id>
		<title>Fichier:Python14.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python14.jpg&amp;diff=48"/>
		<updated>2023-02-01T09:51:01Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python13.png&amp;diff=47</id>
		<title>Fichier:Python13.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python13.png&amp;diff=47"/>
		<updated>2023-02-01T09:46:50Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python12.png&amp;diff=46</id>
		<title>Fichier:Python12.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python12.png&amp;diff=46"/>
		<updated>2023-02-01T09:42:45Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python11.png&amp;diff=45</id>
		<title>Fichier:Python11.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python11.png&amp;diff=45"/>
		<updated>2023-02-01T09:42:35Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Introduction_%C3%A0_l%27utilisation_de_la_connexion_Archicad-Python&amp;diff=44</id>
		<title>Introduction à l'utilisation de la connexion Archicad-Python</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Introduction_%C3%A0_l%27utilisation_de_la_connexion_Archicad-Python&amp;diff=44"/>
		<updated>2023-02-01T09:40:38Z</updated>

		<summary type="html">&lt;p&gt;Simon : /* Comment apprendre python? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(tutoriel initialement rédigé par [https://www.archi-cadlink.fr/memberlist.php?mode=viewprofile&amp;amp;u=70 MathiasJ] sur le forum [https://www.archi-cadlink.fr/ Archi-cadlink] puis remis en forme ici.)&lt;br /&gt;
== Introduction ==&lt;br /&gt;
=== Qu'est ce que python? ===&lt;br /&gt;
C'est un langage de programmation particulièrement utilisé pour l’automatisation de tâches simples mais fastidieuses. Il a été créé en 1991 et en est aujourd'hui à la version 3.12 (date du post). De manière générale, on parle de version 3 pour la version actuelle. C'est celle qui est utilisée pour archicad.&lt;br /&gt;
&lt;br /&gt;
Pour utiliser python, il faut l'installer (voir le site officiel https://www.python.org/).&lt;br /&gt;
&lt;br /&gt;
=== Comment travailler avec python sur archicad ? ===&lt;br /&gt;
&lt;br /&gt;
* Installer la dernière version du langage python sur le site officiel (Dernière version 3.XX)&lt;br /&gt;
* Activer Python dans les options expérimentales (Options &amp;gt; Environnement de travail &amp;gt; Autres options &amp;amp; cocher la case « Activer palette Python Palette»)&lt;br /&gt;
* Afficher la palette python maintenant accessible.&lt;br /&gt;
* Suivre les indications de la palette pour finaliser l'installation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Python1.png&lt;br /&gt;
Fichier:Python2.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comment marche la connexion? ===&lt;br /&gt;
La connexion marche en utilisant la palette python.&lt;br /&gt;
&lt;br /&gt;
Cette palette est composée de deux parties: une partie où l'on sélectionne ses scripts (en haut) et on lance le script voulu , et une partie nommée &amp;quot;console&amp;quot; ou l'ordinateur va vous donner des informations.&lt;br /&gt;
&lt;br /&gt;
==== La Partie script ====&lt;br /&gt;
On sélectionne l'icone dossier et on indique où se trouvent les scripts à utiliser. Un bouton permet de supprimer le dossier, et un autre sert à actualiser la liste.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python3.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour lancer un script, il suffit de sélectionner le script choisi (1), et de cliquer sur lancer (2). On peut aussi double cliquer sur le nom du script pour le lancer. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python4.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La Partie console ====&lt;br /&gt;
C'est une partie très importante pour l'utilisateur du script et indispensable pour le 'codeur'.&lt;br /&gt;
&lt;br /&gt;
On peut y retrouver une indication de lancement du script (1) les informations liées à l'activation du script (Par exemple des informations souhaitées comme des quantités, ou subies comme des rapports d'erreurs)(2), et si le script a bien fini son travail (3).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python5.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comment créer/modifier un script? ===&lt;br /&gt;
&lt;br /&gt;
Pour cela, tout éditeur de texte suffit (Bloc note sur PC par exemple). Sous Mac, on peut en double cliquant sur le script ouvrir un éditeur de code dédié qui donne des outils rudimentaires pour modifier le script (voir capture d'écran ci-dessous), comme la coloration selon le type, le numéro de la ligne sélectionnée, la possibilité de &amp;quot;lancer&amp;quot; le script.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python6.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Toutefois, il est recommandé de travailler sur un éditeur de code dédié.&lt;br /&gt;
Je vous recommande Visual Studio Code qui marche sur Mac et PC et qui possède une extension permettant de travailler aussi sur du GDL.&lt;br /&gt;
Les avantages pour ce type d'outil sont nombreux.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python7.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Certains pour coder en général, d'autres spécifiques à la connexion python/archicad.&lt;br /&gt;
Par exemple:&lt;br /&gt;
* L'ensemble des lignes sont numérotés (les bugs indiquent souvent à quelle ligne le script a buggé, ce qui aide à le corriger),&lt;br /&gt;
* Lors d'erreurs &amp;quot;grossières&amp;quot; (une parenthèse oubliée, un retour à la ligne manquant...), le logiciel alerte et aide à éviter les erreurs bêtes.&lt;br /&gt;
* Après avoir installé le package dédié (https://pypi.org/project/archicad/#description), le logiciel reconnait l'ensemble des commandes disponibles, avec des informations complémentaires qui aident à les utiliser (sur les besoins de la commande, et ce qui résultera de l'utilisation de cette commande).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python8.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par exemple, sur Get2DBOundingBoxes, on apprends que c'est une commande, qu'il lui faut les identifiants des éléments à récupérer sous la forme ElementArrayItem et qu'elle donnera en retour une liste contenant les contours 2D des éléments ou des erreurs s'il n'y en a pas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== HTTP &amp;amp; JSON ===&lt;br /&gt;
&lt;br /&gt;
Une des première chose à savoir, c'est que python n'agit pas directement sur archicad, mais passe via Http en utilisant des messages au format JSON (https://fr.wikipedia.org/wiki/JavaScript_Object_Notation) .&lt;br /&gt;
&lt;br /&gt;
Graphisoft propose un package pour python qui &amp;quot;cache&amp;quot; la communication en JSON.&lt;br /&gt;
&lt;br /&gt;
Par exemple, si on utilise la commande GetAllPropertyIds qui permet de récupérer l'ensemble des identifiant des propriétés d'un fichier archicad, il faudra écrire en python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
acc.GetAllPropertyIds(&amp;quot;UserDefined&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce qui sera traduit par le &amp;quot;package&amp;quot; en JSON sous cette forme:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;command&amp;quot;: &amp;quot;API.GetAllPropertyIds&amp;quot;,&lt;br /&gt;
    &amp;quot;parameters&amp;quot;: {&lt;br /&gt;
        &amp;quot;propertyType&amp;quot;: &amp;quot;UserDefined&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et le résultat donnera quelque chose qui ressemblera à ça (une liste d'identifiant unique - Les GUID - correspondant pour chacun à une propriété d'archicad):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;succeeded&amp;quot;: true,&lt;br /&gt;
    &amp;quot;result&amp;quot;: {&lt;br /&gt;
        &amp;quot;propertyIds&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;E480E81E-EDE3-43FC-9C52-B55A4CA1A85C&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;13A61253-66A9-4494-9393-9E8F2E19D55E&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;BCB5813F-2115-4B8B-A12F-16CFE37C7B7F&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;6F4A46AC-AE91-47E6-BF4A-9F9AB01A4986&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;F6F67733-1DC1-442A-8CF4-ACD2DF7E62C6&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;52D7923A-E5D7-47DF-9319-834B2CB68A6C&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;331D26A3-8168-460C-B7F5-0FA11B596B60&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;78B73923-1B87-460B-8D9E-6E3041CF38D6&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;2FAB57AB-40D6-4B7B-A7F7-31FAE42BCFBD&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;3D9EF415-8D5E-42C3-999F-3CE138DF341F&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;9CC16F4D-9754-B744-B3F8-20BA074A3B2D&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le résultat peux paraitre un peu indigeste, mais cette forme de code en JSON permet de conserver une structure hiérarchique.&lt;br /&gt;
Par exemple si on copie colle la partie &amp;quot;résultat&amp;quot; et qu'on la colle dans un &amp;quot;viewer JSON&amp;quot; trouvable sur internet, les lignes de codes donnent çà:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python9.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Conclusion: les résultat qu'on reçoit peuvent apparaitre au premier abord peu clairs, mais on peut en extraire les données qui nous interessent!&lt;br /&gt;
De même, avant de donner des valeurs au script, il faut les &amp;quot;empaqueter&amp;quot; de manière adéquate.&lt;br /&gt;
&lt;br /&gt;
==== Pourquoi ne pas avoir créé une passerelle directe sans utiliser JSON? ====&lt;br /&gt;
&lt;br /&gt;
Lors de la première bêta, la connexion se faisait directement par python, sans intermédiaire.&lt;br /&gt;
Le choix s'est finalement porté sur HTTP/JSON pour laisser l'opportunité de développer ultérieurement des passerelles avec n'importe quel langage informatique. Il &amp;quot;suffirait&amp;quot; de créer un nouvel package qui permet de produire du code en JSON.&lt;br /&gt;
&lt;br /&gt;
== Comment apprendre python? ==&lt;br /&gt;
Je n'ai pas un &amp;quot;gros niveau&amp;quot;, j'ai essayé plusieurs fois de m'y mettre, et j'ai trouvé enfin une source assez efficace en anglais qui s’appelle ''Automate the Boring Stuff with Python''. C'est un livre (en anglais) qui a la particularité d'être disponible gratuitement et légalement sur un site internet : https://automatetheboringstuff.com/&lt;br /&gt;
&lt;br /&gt;
Pour (re)créer le script sur le total des surfaces de zones, je n'ai eu besoin d'apprendre que finalement peu de concepts propre à python. Ci-dessous les chapitres que j'ai lu (et dont j'ai suivi les petits exercices).&lt;br /&gt;
Vous pouvez surement trouver de la documentation/tuto en Français, surtout depuis que Python peut être enseigné (une option si j'ai bien compris?) au Lycée.&lt;br /&gt;
&lt;br /&gt;
=== Les basiques ===&lt;br /&gt;
https://automatetheboringstuff.com/2e/chapter1/&lt;br /&gt;
&lt;br /&gt;
* Les types de données (entiers, décimaux, chaîne ce qui donne en entier integers, Floating point numbers, strings)&lt;br /&gt;
* La création et l'utilisation de variable en utilisant le signe =&lt;br /&gt;
* La création de commentaires avec le symbole #&lt;br /&gt;
* Des fonctions importantes comme len() pour mesurer un nombre d'éléments et surtout la fonction print() qui va être la base de l'élaboration du script sous python. C'est la fonctions print() qui va permettre d'afficher des informations dans la console d'archicad&lt;br /&gt;
&lt;br /&gt;
=== Les instructions conditionnelles ===&lt;br /&gt;
https://automatetheboringstuff.com/2e/chapter2/&lt;br /&gt;
&lt;br /&gt;
* Les opérateurs de comparaison, en particulier la différence entre == (vérification d'égalité) et = (attribution de valeur)&lt;br /&gt;
* Les différentes conditions de type &amp;quot;If&amp;quot; &amp;quot;else&amp;quot; &amp;quot;elif&amp;quot; &amp;quot;while&amp;quot; &amp;quot;break&amp;quot; les boucles basées sur &amp;quot;for&amp;quot;...&lt;br /&gt;
* L'import de modules (des fonctions complémentaires à python) qu'il faut &amp;quot;appeler&amp;quot; pour pouvoir utiliser&lt;br /&gt;
&lt;br /&gt;
=== Les fonctions ===&lt;br /&gt;
https://automatetheboringstuff.com/2e/chapter3/&lt;br /&gt;
&lt;br /&gt;
=== Les listes ===&lt;br /&gt;
https://automatetheboringstuff.com/2e/chapter4/&lt;br /&gt;
Les listes sont une façon de stocker des données. Chaque donnée à un index et une valeur. Les index sont des entiers et la première valeur d'une liste a pour index 0 (et pas 1).&lt;br /&gt;
&lt;br /&gt;
Il faut apprendre comment récupérer une valeur à partir d'un (ou de plusieurs) index, l'ajout ou la suppression de valeurs dans cette liste.&lt;br /&gt;
&lt;br /&gt;
=== Les dictionnaires ===&lt;br /&gt;
https://automatetheboringstuff.com/2e/chapter5/&lt;br /&gt;
&lt;br /&gt;
Les dictionnaires sont une autre façon de stocker des données. au lieu d'avoir index sous forme de nombre entier, chaque valeur est associée à une &amp;quot;clé&amp;quot;. Cette clé peut être de n'importe quel type.&lt;br /&gt;
&lt;br /&gt;
=== La modification des &amp;quot;chaines&amp;quot; ===&lt;br /&gt;
https://automatetheboringstuff.com/2e/chapter6/&lt;br /&gt;
&lt;br /&gt;
== Ou en est la connexion python/archicad ==&lt;br /&gt;
&lt;br /&gt;
Les possibilités sont (encore) limitées.&lt;br /&gt;
La connexion archicad/python est apparue en archicad 24, quelques fonctions sont apparues en 25 (accès aux informations porteur/non porteur; interieur/extérieur...) et en 26 (Possibilité de récupérer les identifiant des éléments sélectionnés par l'utilisateur, accès aux classifications des éléments...)&lt;br /&gt;
&lt;br /&gt;
De manière générale, les utilisateurs de cette connexion trouvent que le développement de cette partie d'archicad est très lente.&lt;br /&gt;
Le développeur qui a mis en place cette connexion est partie depuis de chez Graphisoft.&lt;br /&gt;
&lt;br /&gt;
Il y'a quand même un indice sur la poursuite du développement de ce côté, c'est la RoadMap présentée par graphisoft qui indique de l'automatisation pour 2025.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python10.jpeg|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Que peut-on faire exactement? ===&lt;br /&gt;
&lt;br /&gt;
Pour savoir ce qu'il est possible de faire, il faut regarder:&lt;br /&gt;
&lt;br /&gt;
* le site dédié à l'interface JSON (voir précédent post) : https://archicadapi.graphisoft.com/JSONInterfaceDocumentation/#Introduction&lt;br /&gt;
* le site dédié à l'&amp;quot;empaqueteur&amp;quot; python (voir précédent post) : https://archicadapi.graphisoft.com/archicadPythonPackage/archicad.html&lt;br /&gt;
&lt;br /&gt;
Le site pour JSON est un peu plus digeste et donne un bon aperçu.&lt;br /&gt;
La majorité des commandes commencent par &amp;quot;Get&amp;quot; suivi d'un texte. Ce sont des commandes pour récupérer des informations. Par exemple récupérer le nom d'un calque, d'une propriété, la valeur de cette propriétén etc...&lt;br /&gt;
&lt;br /&gt;
Les commandes qui vont réellement agir dans archicad sont beaucoup moins nombreuses.&lt;br /&gt;
&lt;br /&gt;
La majorité de ces commandes permettent de modifier les vues et les mises en pages:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DeleteNavigatorItems&lt;br /&gt;
RenameNavigatorItem&lt;br /&gt;
MoveNavigatorItem&lt;br /&gt;
CloneProjectMapItemToViewMap&lt;br /&gt;
CreateViewMapFolder&lt;br /&gt;
CreateLayoutSubset&lt;br /&gt;
CreateLayout&lt;br /&gt;
SetLayoutSettings&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et pour le reste, seulement deux commandes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SetClassificationsOfElements&lt;br /&gt;
SetPropertyValuesOfElements&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L'une pour modifier des paramètres d'un élément archicad (propriété personnalisée ou paramètre intégré (BuiltIn) comme les calques...) l'autre (et seulement depuis archicad 26) les classification des éléments.&lt;br /&gt;
&lt;br /&gt;
Ca reste peu!&lt;br /&gt;
&lt;br /&gt;
=== Tapir ===&lt;br /&gt;
https://www.archicad-api.com/&lt;br /&gt;
&lt;br /&gt;
Des utilisateur d'archicad ont décidé de développer en opensource un plugin permettant d'utiliser dans Grasshopper ( Outil du logiciel Rhinoceros) les possibilités offertes par le plugin python.&lt;br /&gt;
&lt;br /&gt;
Pour augmenter les capacité de ce plugin, ils ont décidé d'améliorer le plugin python en offrant d'autres commandes au logiciel.&lt;br /&gt;
&lt;br /&gt;
Par exemple, ils ont ajouté la possibilité de récupérer les informations projet (ce qui n'est pas possible dans la version de base).&lt;br /&gt;
&lt;br /&gt;
Le développement se reposant sur des bénévole, ce n'est pas très rapide, mais il semblerait que pour des développeur s'y connaissant en C++, la possibilité de créer de nouvelles fonctionnalités ne soit pas très compliqué, et un ancien développeur de graphisoft a partagé un tutoriel à ce sujet dans le discord du projet.&lt;br /&gt;
&lt;br /&gt;
== La suite... ==&lt;br /&gt;
[[Premier script en python, un exemple expliqué de A à Z]]&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Premier_script_en_python,_un_exemple_expliqu%C3%A9_de_A_%C3%A0_Z&amp;diff=43</id>
		<title>Premier script en python, un exemple expliqué de A à Z</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Premier_script_en_python,_un_exemple_expliqu%C3%A9_de_A_%C3%A0_Z&amp;diff=43"/>
		<updated>2023-02-01T09:39:34Z</updated>

		<summary type="html">&lt;p&gt;Simon : Page créée avec « Ce premier script est directement récupéré du tutoriel de Tibor Lorántfy, un ancien développeur de chez graphisoft :  https://archicadapi.graphisoft.com/getting-start... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ce premier script est directement récupéré du tutoriel de Tibor Lorántfy, un ancien développeur de chez graphisoft :&lt;br /&gt;
&lt;br /&gt;
https://archicadapi.graphisoft.com/getting-started-with-archicad-python-connection&lt;br /&gt;
&lt;br /&gt;
Ce premier script va permettre d'afficher dans la console d'archicad le nombre de murs présents dans le projet.&lt;br /&gt;
&lt;br /&gt;
Je vais vous présenter dans un premier temps une version &amp;quot;brute&amp;quot; de ce script, ensuite la version optimale telle que proposée par Tibor, et enfin proposer une interface graphique (très light) avec Tkinter.&lt;br /&gt;
&lt;br /&gt;
Commencons!&lt;br /&gt;
&lt;br /&gt;
== La version &amp;quot;Brute&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Cette version est proposée pour mieux expliquer la méthodologie, mais elle n'est pas du tout recommandée. C'est le script écrit avec le minimum de ligne possible.&lt;br /&gt;
&lt;br /&gt;
Ça se fait... en 3 lignes !&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from archicad import ACConnection&lt;br /&gt;
walls = ACConnection.connect().commands.GetElementsByType('Wall')&lt;br /&gt;
print('Nombre de murs: ' + str(len(walls)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Analyse de la 1ere Ligne ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from archicad import ACConnection&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De manière générale, un script python ne charge pas toutes les fonctionnalité permises par python, et il faut au début du script indiquer les modules supplémentaires que l'on souhaites intégrer.&lt;br /&gt;
&lt;br /&gt;
Il peut s'agir d'un module permettant de travailler avec des fichiers excel (par exemple openpyxl) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from openpyxl import Workbook&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il peut aussi s'agir d'un module permettant de créer une interface graphique (par exemple Tkinter) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from tkinter import *&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il peut s'agir de modules permettant d'utiliser des images, créer de l'aléatoire, etc, etc.&lt;br /&gt;
&lt;br /&gt;
Ces modules sont parfois déjà intégré à l'installation de base de python et ne nécessitent pas d'installation supplémentaires, mais doivent tout de même être appelés (c'est le cas de l'interface graphique Tkinter), et parfois, il faut avoir préalablement installé ce module supplémentaire.&lt;br /&gt;
&lt;br /&gt;
Dans notre cas, '''cette première ligne est absolument nécessaire à tout les script python pour archicad''': Il indique à python de charger le module python/archicad installé sur l'ordinateur ce qui permettra d'accéder à toutes les commandes dédiées à archicad.&lt;br /&gt;
&lt;br /&gt;
Analyse de la 2eme Ligne&lt;br /&gt;
&lt;br /&gt;
Code : Tout sélectionner&lt;br /&gt;
&lt;br /&gt;
walls = ACConnection.connect().commands.GetElementsByType('Wall')&lt;br /&gt;
&lt;br /&gt;
Dans cette deuxième ligne, on créé une variable nommée &amp;quot;walls&amp;quot; et on utilise la commande permettant de récupérer tout les éléments créé avec l'outil mur. J'ai dessiné dans mon fichier archicad 4 murs sur l'étage RDC.&lt;br /&gt;
&lt;br /&gt;
La commande pour Récupérer les éléments selon leur type&lt;br /&gt;
&lt;br /&gt;
Pour récupérer l'ensemble des murs du projet on va utiliser la commande GetElementsByType(), ce qui donne en français &amp;quot;Récupérer les éléments selon leur type&amp;quot;.&lt;br /&gt;
Pour avoir des infos sur cette fonction on peut soit aller sur le site python pour archicad:&lt;br /&gt;
https://archicadapi.graphisoft.com/arch ... entsByType&lt;br /&gt;
&lt;br /&gt;
soit aller dans Visual Studio code:&lt;br /&gt;
&lt;br /&gt;
2023-01-29_15-53.png&lt;br /&gt;
&lt;br /&gt;
Dans Visual Studio Code, on a donc:&lt;br /&gt;
-le nom de la commande (1),&lt;br /&gt;
-ce qu'elle fait (2)&lt;br /&gt;
- le type de fonction (3) : une commande,&lt;br /&gt;
- le type d'argument qu'il faudra mettre entre les () et sous quelle forme (4): ici une chaîne indiquant le type de l’élément. Il faudra donc écrire en anglais le type entre deux guillemets &amp;quot; &amp;quot;&lt;br /&gt;
- le résultat qui nous sera renvoyé (5): une liste de type &amp;quot;ElementIdArrayItem&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Comment lancer la commande ?&lt;br /&gt;
Si on suit la partie précédente on doit donc écrire:&lt;br /&gt;
&lt;br /&gt;
Code : Tout sélectionner&lt;br /&gt;
&lt;br /&gt;
GetElementsByType(&amp;quot;Wall&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Pour lancer cette fonction, il faut toutefois rajouter quelques informations:&lt;br /&gt;
&lt;br /&gt;
2023-01-29_16-10.png&lt;br /&gt;
&lt;br /&gt;
On indique à python qu'on veut utiliser le module python pour archicad (1), puis qu'on veut se connecter à archicad (2), qu'on veut utiliser une commande (3) et enfin quelle commande on veut utiliser (4).&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Introduction_%C3%A0_l%27utilisation_de_la_connexion_Archicad-Python&amp;diff=42</id>
		<title>Introduction à l'utilisation de la connexion Archicad-Python</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Introduction_%C3%A0_l%27utilisation_de_la_connexion_Archicad-Python&amp;diff=42"/>
		<updated>2023-02-01T09:19:06Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(tutoriel initialement rédigé par [https://www.archi-cadlink.fr/memberlist.php?mode=viewprofile&amp;amp;u=70 MathiasJ] sur le forum [https://www.archi-cadlink.fr/ Archi-cadlink] puis remis en forme ici.)&lt;br /&gt;
== Introduction ==&lt;br /&gt;
=== Qu'est ce que python? ===&lt;br /&gt;
C'est un langage de programmation particulièrement utilisé pour l’automatisation de tâches simples mais fastidieuses. Il a été créé en 1991 et en est aujourd'hui à la version 3.12 (date du post). De manière générale, on parle de version 3 pour la version actuelle. C'est celle qui est utilisée pour archicad.&lt;br /&gt;
&lt;br /&gt;
Pour utiliser python, il faut l'installer (voir le site officiel https://www.python.org/).&lt;br /&gt;
&lt;br /&gt;
=== Comment travailler avec python sur archicad ? ===&lt;br /&gt;
&lt;br /&gt;
* Installer la dernière version du langage python sur le site officiel (Dernière version 3.XX)&lt;br /&gt;
* Activer Python dans les options expérimentales (Options &amp;gt; Environnement de travail &amp;gt; Autres options &amp;amp; cocher la case « Activer palette Python Palette»)&lt;br /&gt;
* Afficher la palette python maintenant accessible.&lt;br /&gt;
* Suivre les indications de la palette pour finaliser l'installation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Python1.png&lt;br /&gt;
Fichier:Python2.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comment marche la connexion? ===&lt;br /&gt;
La connexion marche en utilisant la palette python.&lt;br /&gt;
&lt;br /&gt;
Cette palette est composée de deux parties: une partie où l'on sélectionne ses scripts (en haut) et on lance le script voulu , et une partie nommée &amp;quot;console&amp;quot; ou l'ordinateur va vous donner des informations.&lt;br /&gt;
&lt;br /&gt;
==== La Partie script ====&lt;br /&gt;
On sélectionne l'icone dossier et on indique où se trouvent les scripts à utiliser. Un bouton permet de supprimer le dossier, et un autre sert à actualiser la liste.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python3.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour lancer un script, il suffit de sélectionner le script choisi (1), et de cliquer sur lancer (2). On peut aussi double cliquer sur le nom du script pour le lancer. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python4.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La Partie console ====&lt;br /&gt;
C'est une partie très importante pour l'utilisateur du script et indispensable pour le 'codeur'.&lt;br /&gt;
&lt;br /&gt;
On peut y retrouver une indication de lancement du script (1) les informations liées à l'activation du script (Par exemple des informations souhaitées comme des quantités, ou subies comme des rapports d'erreurs)(2), et si le script a bien fini son travail (3).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python5.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comment créer/modifier un script? ===&lt;br /&gt;
&lt;br /&gt;
Pour cela, tout éditeur de texte suffit (Bloc note sur PC par exemple). Sous Mac, on peut en double cliquant sur le script ouvrir un éditeur de code dédié qui donne des outils rudimentaires pour modifier le script (voir capture d'écran ci-dessous), comme la coloration selon le type, le numéro de la ligne sélectionnée, la possibilité de &amp;quot;lancer&amp;quot; le script.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python6.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Toutefois, il est recommandé de travailler sur un éditeur de code dédié.&lt;br /&gt;
Je vous recommande Visual Studio Code qui marche sur Mac et PC et qui possède une extension permettant de travailler aussi sur du GDL.&lt;br /&gt;
Les avantages pour ce type d'outil sont nombreux.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python7.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Certains pour coder en général, d'autres spécifiques à la connexion python/archicad.&lt;br /&gt;
Par exemple:&lt;br /&gt;
* L'ensemble des lignes sont numérotés (les bugs indiquent souvent à quelle ligne le script a buggé, ce qui aide à le corriger),&lt;br /&gt;
* Lors d'erreurs &amp;quot;grossières&amp;quot; (une parenthèse oubliée, un retour à la ligne manquant...), le logiciel alerte et aide à éviter les erreurs bêtes.&lt;br /&gt;
* Après avoir installé le package dédié (https://pypi.org/project/archicad/#description), le logiciel reconnait l'ensemble des commandes disponibles, avec des informations complémentaires qui aident à les utiliser (sur les besoins de la commande, et ce qui résultera de l'utilisation de cette commande).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python8.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par exemple, sur Get2DBOundingBoxes, on apprends que c'est une commande, qu'il lui faut les identifiants des éléments à récupérer sous la forme ElementArrayItem et qu'elle donnera en retour une liste contenant les contours 2D des éléments ou des erreurs s'il n'y en a pas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== HTTP &amp;amp; JSON ===&lt;br /&gt;
&lt;br /&gt;
Une des première chose à savoir, c'est que python n'agit pas directement sur archicad, mais passe via Http en utilisant des messages au format JSON (https://fr.wikipedia.org/wiki/JavaScript_Object_Notation) .&lt;br /&gt;
&lt;br /&gt;
Graphisoft propose un package pour python qui &amp;quot;cache&amp;quot; la communication en JSON.&lt;br /&gt;
&lt;br /&gt;
Par exemple, si on utilise la commande GetAllPropertyIds qui permet de récupérer l'ensemble des identifiant des propriétés d'un fichier archicad, il faudra écrire en python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
acc.GetAllPropertyIds(&amp;quot;UserDefined&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce qui sera traduit par le &amp;quot;package&amp;quot; en JSON sous cette forme:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;command&amp;quot;: &amp;quot;API.GetAllPropertyIds&amp;quot;,&lt;br /&gt;
    &amp;quot;parameters&amp;quot;: {&lt;br /&gt;
        &amp;quot;propertyType&amp;quot;: &amp;quot;UserDefined&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et le résultat donnera quelque chose qui ressemblera à ça (une liste d'identifiant unique - Les GUID - correspondant pour chacun à une propriété d'archicad):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;succeeded&amp;quot;: true,&lt;br /&gt;
    &amp;quot;result&amp;quot;: {&lt;br /&gt;
        &amp;quot;propertyIds&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;E480E81E-EDE3-43FC-9C52-B55A4CA1A85C&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;13A61253-66A9-4494-9393-9E8F2E19D55E&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;BCB5813F-2115-4B8B-A12F-16CFE37C7B7F&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;6F4A46AC-AE91-47E6-BF4A-9F9AB01A4986&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;F6F67733-1DC1-442A-8CF4-ACD2DF7E62C6&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;52D7923A-E5D7-47DF-9319-834B2CB68A6C&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;331D26A3-8168-460C-B7F5-0FA11B596B60&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;78B73923-1B87-460B-8D9E-6E3041CF38D6&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;2FAB57AB-40D6-4B7B-A7F7-31FAE42BCFBD&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;3D9EF415-8D5E-42C3-999F-3CE138DF341F&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;9CC16F4D-9754-B744-B3F8-20BA074A3B2D&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le résultat peux paraitre un peu indigeste, mais cette forme de code en JSON permet de conserver une structure hiérarchique.&lt;br /&gt;
Par exemple si on copie colle la partie &amp;quot;résultat&amp;quot; et qu'on la colle dans un &amp;quot;viewer JSON&amp;quot; trouvable sur internet, les lignes de codes donnent çà:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python9.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Conclusion: les résultat qu'on reçoit peuvent apparaitre au premier abord peu clairs, mais on peut en extraire les données qui nous interessent!&lt;br /&gt;
De même, avant de donner des valeurs au script, il faut les &amp;quot;empaqueter&amp;quot; de manière adéquate.&lt;br /&gt;
&lt;br /&gt;
==== Pourquoi ne pas avoir créé une passerelle directe sans utiliser JSON? ====&lt;br /&gt;
&lt;br /&gt;
Lors de la première bêta, la connexion se faisait directement par python, sans intermédiaire.&lt;br /&gt;
Le choix s'est finalement porté sur HTTP/JSON pour laisser l'opportunité de développer ultérieurement des passerelles avec n'importe quel langage informatique. Il &amp;quot;suffirait&amp;quot; de créer un nouvel package qui permet de produire du code en JSON.&lt;br /&gt;
&lt;br /&gt;
== Comment apprendre python? ==&lt;br /&gt;
Je n'ai pas un &amp;quot;gros niveau&amp;quot;, j'ai essayé plusieurs fois de m'y mettre, et j'ai trouvé enfin une source assez efficace en anglais qui s’appelle Automate the Boring Stuff with Python . C'est un livre (en anglais) qui a la particularité d'être disponible gratuitement et légalement sur un site internet : https://automatetheboringstuff.com/&lt;br /&gt;
&lt;br /&gt;
Pour (re)créer le script sur le total des surfaces de zones, je n'ai eu besoin d'apprendre que finalement peu de concepts propre à python. Ci-dessous les chapitres que j'ai lu (et dont j'ai suivi les petits exercices).&lt;br /&gt;
Vous pouvez surement trouver de la documentation/tuto en Français, surtout depuis que Python peut être enseigné (une option si j'ai bien compris?) au Lycée.&lt;br /&gt;
&lt;br /&gt;
=== Les basiques ===&lt;br /&gt;
https://automatetheboringstuff.com/2e/chapter1/&lt;br /&gt;
&lt;br /&gt;
* Les types de données (entiers, décimaux, chaîne ce qui donne en entier integers, Floating point numbers, strings)&lt;br /&gt;
* La création et l'utilisation de variable en utilisant le signe =&lt;br /&gt;
* La création de commentaires avec le symbole #&lt;br /&gt;
* Des fonctions importantes comme len() pour mesurer un nombre d'éléments et surtout la fonction print() qui va être la base de l'élaboration du script sous python. C'est la fonctions print() qui va permettre d'afficher des informations dans la console d'archicad&lt;br /&gt;
&lt;br /&gt;
=== Les instructions conditionnelles ===&lt;br /&gt;
https://automatetheboringstuff.com/2e/chapter2/&lt;br /&gt;
&lt;br /&gt;
* Les opérateurs de comparaison, en particulier la différence entre == (vérification d'égalité) et = (attribution de valeur)&lt;br /&gt;
* Les différentes conditions de type &amp;quot;If&amp;quot; &amp;quot;else&amp;quot; &amp;quot;elif&amp;quot; &amp;quot;while&amp;quot; &amp;quot;break&amp;quot; les boucles basées sur &amp;quot;for&amp;quot;...&lt;br /&gt;
* L'import de modules (des fonctions complémentaires à python) qu'il faut &amp;quot;appeler&amp;quot; pour pouvoir utiliser&lt;br /&gt;
&lt;br /&gt;
=== Les fonctions ===&lt;br /&gt;
https://automatetheboringstuff.com/2e/chapter3/&lt;br /&gt;
&lt;br /&gt;
=== Les listes ===&lt;br /&gt;
https://automatetheboringstuff.com/2e/chapter4/&lt;br /&gt;
Les listes sont une façon de stocker des données. Chaque donnée à un index et une valeur. Les index sont des entiers et la première valeur d'une liste a pour index 0 (et pas 1).&lt;br /&gt;
&lt;br /&gt;
Il faut apprendre comment récupérer une valeur à partir d'un (ou de plusieurs) index, l'ajout ou la suppression de valeurs dans cette liste.&lt;br /&gt;
&lt;br /&gt;
=== Les dictionnaires ===&lt;br /&gt;
https://automatetheboringstuff.com/2e/chapter5/&lt;br /&gt;
&lt;br /&gt;
Les dictionnaires sont une autre façon de stocker des données. au lieu d'avoir index sous forme de nombre entier, chaque valeur est associée à une &amp;quot;clé&amp;quot;. Cette clé peut être de n'importe quel type.&lt;br /&gt;
&lt;br /&gt;
=== La modification des &amp;quot;chaines&amp;quot; ===&lt;br /&gt;
https://automatetheboringstuff.com/2e/chapter6/&lt;br /&gt;
&lt;br /&gt;
== Ou en est la connexion python/archicad ==&lt;br /&gt;
&lt;br /&gt;
Les possibilités sont (encore) limitées.&lt;br /&gt;
La connexion archicad/python est apparue en archicad 24, quelques fonctions sont apparues en 25 (accès aux informations porteur/non porteur; interieur/extérieur...) et en 26 (Possibilité de récupérer les identifiant des éléments sélectionnés par l'utilisateur, accès aux classifications des éléments...)&lt;br /&gt;
&lt;br /&gt;
De manière générale, les utilisateurs de cette connexion trouvent que le développement de cette partie d'archicad est très lente.&lt;br /&gt;
Le développeur qui a mis en place cette connexion est partie depuis de chez Graphisoft.&lt;br /&gt;
&lt;br /&gt;
Il y'a quand même un indice sur la poursuite du développement de ce côté, c'est la RoadMap présentée par graphisoft qui indique de l'automatisation pour 2025.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python10.jpeg|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Que peut-on faire exactement? ===&lt;br /&gt;
&lt;br /&gt;
Pour savoir ce qu'il est possible de faire, il faut regarder:&lt;br /&gt;
&lt;br /&gt;
* le site dédié à l'interface JSON (voir précédent post) : https://archicadapi.graphisoft.com/JSONInterfaceDocumentation/#Introduction&lt;br /&gt;
* le site dédié à l'&amp;quot;empaqueteur&amp;quot; python (voir précédent post) : https://archicadapi.graphisoft.com/archicadPythonPackage/archicad.html&lt;br /&gt;
&lt;br /&gt;
Le site pour JSON est un peu plus digeste et donne un bon aperçu.&lt;br /&gt;
La majorité des commandes commencent par &amp;quot;Get&amp;quot; suivi d'un texte. Ce sont des commandes pour récupérer des informations. Par exemple récupérer le nom d'un calque, d'une propriété, la valeur de cette propriétén etc...&lt;br /&gt;
&lt;br /&gt;
Les commandes qui vont réellement agir dans archicad sont beaucoup moins nombreuses.&lt;br /&gt;
&lt;br /&gt;
La majorité de ces commandes permettent de modifier les vues et les mises en pages:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DeleteNavigatorItems&lt;br /&gt;
RenameNavigatorItem&lt;br /&gt;
MoveNavigatorItem&lt;br /&gt;
CloneProjectMapItemToViewMap&lt;br /&gt;
CreateViewMapFolder&lt;br /&gt;
CreateLayoutSubset&lt;br /&gt;
CreateLayout&lt;br /&gt;
SetLayoutSettings&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et pour le reste, seulement deux commandes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SetClassificationsOfElements&lt;br /&gt;
SetPropertyValuesOfElements&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L'une pour modifier des paramètres d'un élément archicad (propriété personnalisée ou paramètre intégré (BuiltIn) comme les calques...) l'autre (et seulement depuis archicad 26) les classification des éléments.&lt;br /&gt;
&lt;br /&gt;
Ca reste peu!&lt;br /&gt;
&lt;br /&gt;
=== Tapir ===&lt;br /&gt;
https://www.archicad-api.com/&lt;br /&gt;
&lt;br /&gt;
Des utilisateur d'archicad ont décidé de développer en opensource un plugin permettant d'utiliser dans Grasshopper ( Outil du logiciel Rhinoceros) les possibilités offertes par le plugin python.&lt;br /&gt;
&lt;br /&gt;
Pour augmenter les capacité de ce plugin, ils ont décidé d'améliorer le plugin python en offrant d'autres commandes au logiciel.&lt;br /&gt;
&lt;br /&gt;
Par exemple, ils ont ajouté la possibilité de récupérer les informations projet (ce qui n'est pas possible dans la version de base).&lt;br /&gt;
&lt;br /&gt;
Le développement se reposant sur des bénévole, ce n'est pas très rapide, mais il semblerait que pour des développeur s'y connaissant en C++, la possibilité de créer de nouvelles fonctionnalités ne soit pas très compliqué, et un ancien développeur de graphisoft a partagé un tutoriel à ce sujet dans le discord du projet.&lt;br /&gt;
&lt;br /&gt;
== La suite... ==&lt;br /&gt;
[[Premier script en python, un exemple expliqué de A à Z]]&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Introduction_%C3%A0_l%27utilisation_de_la_connexion_Archicad-Python&amp;diff=41</id>
		<title>Introduction à l'utilisation de la connexion Archicad-Python</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Introduction_%C3%A0_l%27utilisation_de_la_connexion_Archicad-Python&amp;diff=41"/>
		<updated>2023-02-01T09:16:01Z</updated>

		<summary type="html">&lt;p&gt;Simon : Page créée avec « == Introduction == === Qu'est ce que python? === C'est un langage de programmation particulièrement utilisé pour l’automatisation de tâches simples mais fastidieuses.... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
=== Qu'est ce que python? ===&lt;br /&gt;
C'est un langage de programmation particulièrement utilisé pour l’automatisation de tâches simples mais fastidieuses. Il a été créé en 1991 et en est aujourd'hui à la version 3.12 (date du post). De manière générale, on parle de version 3 pour la version actuelle. C'est celle qui est utilisée pour archicad.&lt;br /&gt;
&lt;br /&gt;
Pour utiliser python, il faut l'installer (voir le site officiel https://www.python.org/).&lt;br /&gt;
&lt;br /&gt;
=== Comment travailler avec python sur archicad ? ===&lt;br /&gt;
&lt;br /&gt;
* Installer la dernière version du langage python sur le site officiel (Dernière version 3.XX)&lt;br /&gt;
* Activer Python dans les options expérimentales (Options &amp;gt; Environnement de travail &amp;gt; Autres options &amp;amp; cocher la case « Activer palette Python Palette»)&lt;br /&gt;
* Afficher la palette python maintenant accessible.&lt;br /&gt;
* Suivre les indications de la palette pour finaliser l'installation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Python1.png&lt;br /&gt;
Fichier:Python2.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comment marche la connexion? ===&lt;br /&gt;
La connexion marche en utilisant la palette python.&lt;br /&gt;
&lt;br /&gt;
Cette palette est composée de deux parties: une partie où l'on sélectionne ses scripts (en haut) et on lance le script voulu , et une partie nommée &amp;quot;console&amp;quot; ou l'ordinateur va vous donner des informations.&lt;br /&gt;
&lt;br /&gt;
==== La Partie script ====&lt;br /&gt;
On sélectionne l'icone dossier et on indique où se trouvent les scripts à utiliser. Un bouton permet de supprimer le dossier, et un autre sert à actualiser la liste.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python3.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour lancer un script, il suffit de sélectionner le script choisi (1), et de cliquer sur lancer (2). On peut aussi double cliquer sur le nom du script pour le lancer. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python4.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La Partie console ====&lt;br /&gt;
C'est une partie très importante pour l'utilisateur du script et indispensable pour le 'codeur'.&lt;br /&gt;
&lt;br /&gt;
On peut y retrouver une indication de lancement du script (1) les informations liées à l'activation du script (Par exemple des informations souhaitées comme des quantités, ou subies comme des rapports d'erreurs)(2), et si le script a bien fini son travail (3).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python5.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Comment créer/modifier un script? ===&lt;br /&gt;
&lt;br /&gt;
Pour cela, tout éditeur de texte suffit (Bloc note sur PC par exemple). Sous Mac, on peut en double cliquant sur le script ouvrir un éditeur de code dédié qui donne des outils rudimentaires pour modifier le script (voir capture d'écran ci-dessous), comme la coloration selon le type, le numéro de la ligne sélectionnée, la possibilité de &amp;quot;lancer&amp;quot; le script.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python6.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Toutefois, il est recommandé de travailler sur un éditeur de code dédié.&lt;br /&gt;
Je vous recommande Visual Studio Code qui marche sur Mac et PC et qui possède une extension permettant de travailler aussi sur du GDL.&lt;br /&gt;
Les avantages pour ce type d'outil sont nombreux.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python7.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Certains pour coder en général, d'autres spécifiques à la connexion python/archicad.&lt;br /&gt;
Par exemple:&lt;br /&gt;
* L'ensemble des lignes sont numérotés (les bugs indiquent souvent à quelle ligne le script a buggé, ce qui aide à le corriger),&lt;br /&gt;
* Lors d'erreurs &amp;quot;grossières&amp;quot; (une parenthèse oubliée, un retour à la ligne manquant...), le logiciel alerte et aide à éviter les erreurs bêtes.&lt;br /&gt;
* Après avoir installé le package dédié (https://pypi.org/project/archicad/#description), le logiciel reconnait l'ensemble des commandes disponibles, avec des informations complémentaires qui aident à les utiliser (sur les besoins de la commande, et ce qui résultera de l'utilisation de cette commande).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python8.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par exemple, sur Get2DBOundingBoxes, on apprends que c'est une commande, qu'il lui faut les identifiants des éléments à récupérer sous la forme ElementArrayItem et qu'elle donnera en retour une liste contenant les contours 2D des éléments ou des erreurs s'il n'y en a pas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== HTTP &amp;amp; JSON ===&lt;br /&gt;
&lt;br /&gt;
Une des première chose à savoir, c'est que python n'agit pas directement sur archicad, mais passe via Http en utilisant des messages au format JSON (https://fr.wikipedia.org/wiki/JavaScript_Object_Notation) .&lt;br /&gt;
&lt;br /&gt;
Graphisoft propose un package pour python qui &amp;quot;cache&amp;quot; la communication en JSON.&lt;br /&gt;
&lt;br /&gt;
Par exemple, si on utilise la commande GetAllPropertyIds qui permet de récupérer l'ensemble des identifiant des propriétés d'un fichier archicad, il faudra écrire en python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
acc.GetAllPropertyIds(&amp;quot;UserDefined&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce qui sera traduit par le &amp;quot;package&amp;quot; en JSON sous cette forme:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;command&amp;quot;: &amp;quot;API.GetAllPropertyIds&amp;quot;,&lt;br /&gt;
    &amp;quot;parameters&amp;quot;: {&lt;br /&gt;
        &amp;quot;propertyType&amp;quot;: &amp;quot;UserDefined&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et le résultat donnera quelque chose qui ressemblera à ça (une liste d'identifiant unique - Les GUID - correspondant pour chacun à une propriété d'archicad):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;succeeded&amp;quot;: true,&lt;br /&gt;
    &amp;quot;result&amp;quot;: {&lt;br /&gt;
        &amp;quot;propertyIds&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;E480E81E-EDE3-43FC-9C52-B55A4CA1A85C&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;13A61253-66A9-4494-9393-9E8F2E19D55E&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;BCB5813F-2115-4B8B-A12F-16CFE37C7B7F&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;6F4A46AC-AE91-47E6-BF4A-9F9AB01A4986&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;F6F67733-1DC1-442A-8CF4-ACD2DF7E62C6&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;52D7923A-E5D7-47DF-9319-834B2CB68A6C&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;331D26A3-8168-460C-B7F5-0FA11B596B60&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;78B73923-1B87-460B-8D9E-6E3041CF38D6&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;2FAB57AB-40D6-4B7B-A7F7-31FAE42BCFBD&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;3D9EF415-8D5E-42C3-999F-3CE138DF341F&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;propertyId&amp;quot;: {&lt;br /&gt;
                    &amp;quot;guid&amp;quot;: &amp;quot;9CC16F4D-9754-B744-B3F8-20BA074A3B2D&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le résultat peux paraitre un peu indigeste, mais cette forme de code en JSON permet de conserver une structure hiérarchique.&lt;br /&gt;
Par exemple si on copie colle la partie &amp;quot;résultat&amp;quot; et qu'on la colle dans un &amp;quot;viewer JSON&amp;quot; trouvable sur internet, les lignes de codes donnent çà:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python9.png|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Conclusion: les résultat qu'on reçoit peuvent apparaitre au premier abord peu clairs, mais on peut en extraire les données qui nous interessent!&lt;br /&gt;
De même, avant de donner des valeurs au script, il faut les &amp;quot;empaqueter&amp;quot; de manière adéquate.&lt;br /&gt;
&lt;br /&gt;
==== Pourquoi ne pas avoir créé une passerelle directe sans utiliser JSON? ====&lt;br /&gt;
&lt;br /&gt;
Lors de la première bêta, la connexion se faisait directement par python, sans intermédiaire.&lt;br /&gt;
Le choix s'est finalement porté sur HTTP/JSON pour laisser l'opportunité de développer ultérieurement des passerelles avec n'importe quel langage informatique. Il &amp;quot;suffirait&amp;quot; de créer un nouvel package qui permet de produire du code en JSON.&lt;br /&gt;
&lt;br /&gt;
== Comment apprendre python? ==&lt;br /&gt;
Je n'ai pas un &amp;quot;gros niveau&amp;quot;, j'ai essayé plusieurs fois de m'y mettre, et j'ai trouvé enfin une source assez efficace en anglais qui s’appelle Automate the Boring Stuff with Python . C'est un livre (en anglais) qui a la particularité d'être disponible gratuitement et légalement sur un site internet : https://automatetheboringstuff.com/&lt;br /&gt;
&lt;br /&gt;
Pour (re)créer le script sur le total des surfaces de zones, je n'ai eu besoin d'apprendre que finalement peu de concepts propre à python. Ci-dessous les chapitres que j'ai lu (et dont j'ai suivi les petits exercices).&lt;br /&gt;
Vous pouvez surement trouver de la documentation/tuto en Français, surtout depuis que Python peut être enseigné (une option si j'ai bien compris?) au Lycée.&lt;br /&gt;
&lt;br /&gt;
=== Les basiques ===&lt;br /&gt;
https://automatetheboringstuff.com/2e/chapter1/&lt;br /&gt;
&lt;br /&gt;
* Les types de données (entiers, décimaux, chaîne ce qui donne en entier integers, Floating point numbers, strings)&lt;br /&gt;
* La création et l'utilisation de variable en utilisant le signe =&lt;br /&gt;
* La création de commentaires avec le symbole #&lt;br /&gt;
* Des fonctions importantes comme len() pour mesurer un nombre d'éléments et surtout la fonction print() qui va être la base de l'élaboration du script sous python. C'est la fonctions print() qui va permettre d'afficher des informations dans la console d'archicad&lt;br /&gt;
&lt;br /&gt;
=== Les instructions conditionnelles ===&lt;br /&gt;
https://automatetheboringstuff.com/2e/chapter2/&lt;br /&gt;
&lt;br /&gt;
* Les opérateurs de comparaison, en particulier la différence entre == (vérification d'égalité) et = (attribution de valeur)&lt;br /&gt;
* Les différentes conditions de type &amp;quot;If&amp;quot; &amp;quot;else&amp;quot; &amp;quot;elif&amp;quot; &amp;quot;while&amp;quot; &amp;quot;break&amp;quot; les boucles basées sur &amp;quot;for&amp;quot;...&lt;br /&gt;
* L'import de modules (des fonctions complémentaires à python) qu'il faut &amp;quot;appeler&amp;quot; pour pouvoir utiliser&lt;br /&gt;
&lt;br /&gt;
=== Les fonctions ===&lt;br /&gt;
https://automatetheboringstuff.com/2e/chapter3/&lt;br /&gt;
&lt;br /&gt;
=== Les listes ===&lt;br /&gt;
https://automatetheboringstuff.com/2e/chapter4/&lt;br /&gt;
Les listes sont une façon de stocker des données. Chaque donnée à un index et une valeur. Les index sont des entiers et la première valeur d'une liste a pour index 0 (et pas 1).&lt;br /&gt;
&lt;br /&gt;
Il faut apprendre comment récupérer une valeur à partir d'un (ou de plusieurs) index, l'ajout ou la suppression de valeurs dans cette liste.&lt;br /&gt;
&lt;br /&gt;
=== Les dictionnaires ===&lt;br /&gt;
https://automatetheboringstuff.com/2e/chapter5/&lt;br /&gt;
&lt;br /&gt;
Les dictionnaires sont une autre façon de stocker des données. au lieu d'avoir index sous forme de nombre entier, chaque valeur est associée à une &amp;quot;clé&amp;quot;. Cette clé peut être de n'importe quel type.&lt;br /&gt;
&lt;br /&gt;
=== La modification des &amp;quot;chaines&amp;quot; ===&lt;br /&gt;
https://automatetheboringstuff.com/2e/chapter6/&lt;br /&gt;
&lt;br /&gt;
== Ou en est la connexion python/archicad ==&lt;br /&gt;
&lt;br /&gt;
Les possibilités sont (encore) limitées.&lt;br /&gt;
La connexion archicad/python est apparue en archicad 24, quelques fonctions sont apparues en 25 (accès aux informations porteur/non porteur; interieur/extérieur...) et en 26 (Possibilité de récupérer les identifiant des éléments sélectionnés par l'utilisateur, accès aux classifications des éléments...)&lt;br /&gt;
&lt;br /&gt;
De manière générale, les utilisateurs de cette connexion trouvent que le développement de cette partie d'archicad est très lente.&lt;br /&gt;
Le développeur qui a mis en place cette connexion est partie depuis de chez Graphisoft.&lt;br /&gt;
&lt;br /&gt;
Il y'a quand même un indice sur la poursuite du développement de ce côté, c'est la RoadMap présentée par graphisoft qui indique de l'automatisation pour 2025.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python10.jpeg|thumb|left]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Que peut-on faire exactement? ===&lt;br /&gt;
&lt;br /&gt;
Pour savoir ce qu'il est possible de faire, il faut regarder:&lt;br /&gt;
&lt;br /&gt;
* le site dédié à l'interface JSON (voir précédent post) : https://archicadapi.graphisoft.com/JSONInterfaceDocumentation/#Introduction&lt;br /&gt;
* le site dédié à l'&amp;quot;empaqueteur&amp;quot; python (voir précédent post) : https://archicadapi.graphisoft.com/archicadPythonPackage/archicad.html&lt;br /&gt;
&lt;br /&gt;
Le site pour JSON est un peu plus digeste et donne un bon aperçu.&lt;br /&gt;
La majorité des commandes commencent par &amp;quot;Get&amp;quot; suivi d'un texte. Ce sont des commandes pour récupérer des informations. Par exemple récupérer le nom d'un calque, d'une propriété, la valeur de cette propriétén etc...&lt;br /&gt;
&lt;br /&gt;
Les commandes qui vont réellement agir dans archicad sont beaucoup moins nombreuses.&lt;br /&gt;
&lt;br /&gt;
La majorité de ces commandes permettent de modifier les vues et les mises en pages:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DeleteNavigatorItems&lt;br /&gt;
RenameNavigatorItem&lt;br /&gt;
MoveNavigatorItem&lt;br /&gt;
CloneProjectMapItemToViewMap&lt;br /&gt;
CreateViewMapFolder&lt;br /&gt;
CreateLayoutSubset&lt;br /&gt;
CreateLayout&lt;br /&gt;
SetLayoutSettings&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et pour le reste, seulement deux commandes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SetClassificationsOfElements&lt;br /&gt;
SetPropertyValuesOfElements&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L'une pour modifier des paramètres d'un élément archicad (propriété personnalisée ou paramètre intégré (BuiltIn) comme les calques...) l'autre (et seulement depuis archicad 26) les classification des éléments.&lt;br /&gt;
&lt;br /&gt;
Ca reste peu!&lt;br /&gt;
&lt;br /&gt;
=== Tapir ===&lt;br /&gt;
https://www.archicad-api.com/&lt;br /&gt;
&lt;br /&gt;
Des utilisateur d'archicad ont décidé de développer en opensource un plugin permettant d'utiliser dans Grasshopper ( Outil du logiciel Rhinoceros) les possibilités offertes par le plugin python.&lt;br /&gt;
&lt;br /&gt;
Pour augmenter les capacité de ce plugin, ils ont décidé d'améliorer le plugin python en offrant d'autres commandes au logiciel.&lt;br /&gt;
&lt;br /&gt;
Par exemple, ils ont ajouté la possibilité de récupérer les informations projet (ce qui n'est pas possible dans la version de base).&lt;br /&gt;
&lt;br /&gt;
Le développement se reposant sur des bénévole, ce n'est pas très rapide, mais il semblerait que pour des développeur s'y connaissant en C++, la possibilité de créer de nouvelles fonctionnalités ne soit pas très compliqué, et un ancien développeur de graphisoft a partagé un tutoriel à ce sujet dans le discord du projet.&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python10.jpeg&amp;diff=40</id>
		<title>Fichier:Python10.jpeg</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python10.jpeg&amp;diff=40"/>
		<updated>2023-02-01T09:08:48Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python9.png&amp;diff=39</id>
		<title>Fichier:Python9.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python9.png&amp;diff=39"/>
		<updated>2023-02-01T09:02:14Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python8.png&amp;diff=38</id>
		<title>Fichier:Python8.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python8.png&amp;diff=38"/>
		<updated>2023-02-01T08:58:37Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python7.png&amp;diff=37</id>
		<title>Fichier:Python7.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python7.png&amp;diff=37"/>
		<updated>2023-02-01T08:58:30Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python6.png&amp;diff=36</id>
		<title>Fichier:Python6.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python6.png&amp;diff=36"/>
		<updated>2023-02-01T08:58:16Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python5.png&amp;diff=35</id>
		<title>Fichier:Python5.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python5.png&amp;diff=35"/>
		<updated>2023-02-01T08:49:52Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python4.png&amp;diff=34</id>
		<title>Fichier:Python4.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python4.png&amp;diff=34"/>
		<updated>2023-02-01T08:49:19Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python3.png&amp;diff=33</id>
		<title>Fichier:Python3.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python3.png&amp;diff=33"/>
		<updated>2023-02-01T08:47:43Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python2.png&amp;diff=32</id>
		<title>Fichier:Python2.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python2.png&amp;diff=32"/>
		<updated>2023-02-01T08:43:57Z</updated>

		<summary type="html">&lt;p&gt;Simon : python2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
python2&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python1.png&amp;diff=31</id>
		<title>Fichier:Python1.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Fichier:Python1.png&amp;diff=31"/>
		<updated>2023-02-01T08:40:35Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Utilisateur:Simon&amp;diff=30</id>
		<title>Utilisateur:Simon</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Utilisateur:Simon&amp;diff=30"/>
		<updated>2023-02-01T08:24:42Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Consultez le [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wiki.&lt;br /&gt;
&lt;br /&gt;
== Pour démarrer ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste des paramètres de configuration]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/fr Questions courantes sur MediaWiki]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Apprendre comment lutter contre le pourriel dans votre wiki]&lt;br /&gt;
&lt;br /&gt;
== Tests ==&lt;br /&gt;
[[Introduction à l'utilisation de la connexion Archicad-Python]]&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Objet_%22Test%22&amp;diff=21</id>
		<title>Objet &quot;Test&quot;</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Objet_%22Test%22&amp;diff=21"/>
		<updated>2021-11-25T18:34:01Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L'objet Test tout d'abord:&lt;br /&gt;
Image&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un objet dessiné au trait et inscrit dans le Cadre d'un Rectangle de Taille : A sur l'axe des X et B sur l'axe des Y&lt;br /&gt;
&lt;br /&gt;
à savoir: A, B et ZZYZX sont les valeurs par défaut prises par Archicad respectivement pour la Largeur (en X) La Profondeur (en Y) et la Hauteur (en Z)&lt;br /&gt;
&lt;br /&gt;
Voici le code de cet Objet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Insérer code&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme on peut le voir, cet objet n'est défini qu'en 2D (il ne sera pas visible en 3D) et utilise deux commandes:&lt;br /&gt;
-La commande Rect2 qui définis un rectangle en coordonnées X et Y par deux points en citant après les X puis Y du premier point puis les X et Y du second (RECT2 x1, y1, x2, y2)&lt;br /&gt;
&lt;br /&gt;
-La commande Line2 qui définis une ligne de la même façon en citant deux points (LINE2 x1, y1, x2, y2)&lt;br /&gt;
&lt;br /&gt;
Ici, Toutes les lignes sont définies dans l'espace par des fractions de A et B ce qui veut dire que quelque-soit la forme prise par le rectangle de l'objet qui est défini par ces deux valeurs, ces lignes resteront à leur place et proportionnelles à l'ensemble. (notez bien, cette façon de coder est extrêmement inefficace et d'autres commandes existent évidemment pour inscrire du texte. Néanmoins l'objet fonctionne et ce qu'on y a appris servira pour l'objet n°2 qui est nettement plus utile.)&lt;br /&gt;
&lt;br /&gt;
PS: pour retrouver facilement toutes les commandes et mots clés et la façon de les écrire correctement, je recommande de conserver sous la main cette page du GDL Center: http://gdl.graphisoft.com/reference-guide/index&lt;br /&gt;
&lt;br /&gt;
PSn°2: le point d'exclamation et les phrases qui le suivent s'appellent du code commenté, en fait le point d'exclamation indique au logiciel que tout ce qui se trouve dans la ligne derrière celui-ci ne le concerne pas, c'est magique!!! et surtout ça permet de s'y retrouver quand on reviens regarder son propre code quelques années ou même seulement quelques heures plus tard.&lt;br /&gt;
Pour l'exemple j'ai inscrit de quelle lettre il s'agit au début du code de chaque lettre, imaginez vous essayer de le comprendre sans cette annotation!&lt;br /&gt;
En résumé, pour vous comme pour les autres, un bon code est un code commenté.&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Objet_%22Test%22&amp;diff=20</id>
		<title>Objet &quot;Test&quot;</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Objet_%22Test%22&amp;diff=20"/>
		<updated>2021-11-25T18:33:22Z</updated>

		<summary type="html">&lt;p&gt;Simon : Page créée avec « L'objet Test tout d'abord: Image  Il s'agit d'un objet dessiné au trait et inscrit dans le Cadre d'un Rectangle de Taille : A sur l'axe des X et B sur l'axe des Y  à sav... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L'objet Test tout d'abord:&lt;br /&gt;
Image&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un objet dessiné au trait et inscrit dans le Cadre d'un Rectangle de Taille : A sur l'axe des X et B sur l'axe des Y&lt;br /&gt;
&lt;br /&gt;
à savoir: A, B et ZZYZX sont les valeurs par défaut prises par Archicad respectivement pour la Largeur (en X) La Profondeur (en Y) et la Hauteur (en Z)&lt;br /&gt;
&lt;br /&gt;
Voici le code de cet Objet:&lt;br /&gt;
Image&lt;br /&gt;
&lt;br /&gt;
Comme on peut le voir, cet objet n'est défini qu'en 2D (il ne sera pas visible en 3D) et utilise deux commandes:&lt;br /&gt;
-La commande Rect2 qui définis un rectangle en coordonnées X et Y par deux points en citant après les X puis Y du premier point puis les X et Y du second (RECT2 x1, y1, x2, y2)&lt;br /&gt;
&lt;br /&gt;
-La commande Line2 qui définis une ligne de la même façon en citant deux points (LINE2 x1, y1, x2, y2)&lt;br /&gt;
&lt;br /&gt;
Ici, Toutes les lignes sont définies dans l'espace par des fractions de A et B ce qui veut dire que quelque-soit la forme prise par le rectangle de l'objet qui est défini par ces deux valeurs, ces lignes resteront à leur place et proportionnelles à l'ensemble. (notez bien, cette façon de coder est extrêmement inefficace et d'autres commandes existent évidemment pour inscrire du texte. Néanmoins l'objet fonctionne et ce qu'on y a appris servira pour l'objet n°2 qui est nettement plus utile.)&lt;br /&gt;
&lt;br /&gt;
PS: pour retrouver facilement toutes les commandes et mots clés et la façon de les écrire correctement, je recommande de conserver sous la main cette page du GDL Center: http://gdl.graphisoft.com/reference-guide/index&lt;br /&gt;
&lt;br /&gt;
PSn°2: le point d'exclamation et les phrases qui le suivent s'appellent du code commenté, en fait le point d'exclamation indique au logiciel que tout ce qui se trouve dans la ligne derrière celui-ci ne le concerne pas, c'est magique!!! et surtout ça permet de s'y retrouver quand on reviens regarder son propre code quelques années ou même seulement quelques heures plus tard.&lt;br /&gt;
Pour l'exemple j'ai inscrit de quelle lettre il s'agit au début du code de chaque lettre, imaginez vous essayer de le comprendre sans cette annotation!&lt;br /&gt;
En résumé, pour vous comme pour les autres, un bon code est un code commenté.&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Le_GDL_pour_les_nuls&amp;diff=19</id>
		<title>Le GDL pour les nuls</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Le_GDL_pour_les_nuls&amp;diff=19"/>
		<updated>2021-11-25T18:32:03Z</updated>

		<summary type="html">&lt;p&gt;Simon : Page créée avec « Tout d'abord j'ai consulté le [http://gdl.graphisoft.com/reference-guide GDL Reference guide] (malheureusement plus en Français depuis bien des années si j'ai bien comp... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tout d'abord j'ai consulté le [http://gdl.graphisoft.com/reference-guide GDL Reference guide] (malheureusement plus en Français depuis bien des années si j'ai bien compris, heureusement, je comprends l'anglais, c'est juste plus dur.) &lt;br /&gt;
&lt;br /&gt;
Puis j'ai retrouvé le guide Référence GDl de 2001 encore en Français. (d'ailleurs je me demandais quelle proportion de ce guide était obsolète si quelqu'un à la réponse.)&lt;br /&gt;
&lt;br /&gt;
Guide_referenceGDL_fr.pdf&lt;br /&gt;
&lt;br /&gt;
Enfin, j'ai pu trouver un PDF du GDL Handbook deuxième édition de 2011 (en anglais) qui à ma connaissance n'est plus édité.&lt;br /&gt;
&lt;br /&gt;
gdl-handbook-a-comprehensive-guide-to-creating-powerful-archicad-objects.pdf&lt;br /&gt;
&lt;br /&gt;
[https://community.graphisoft.com/t5/Design-forum/GDL-version-4-Cookbook-what-happened/m-p/123945 CookBook v4 partagée par la communauté Graphisoft] ([https://uptobox.com/16xsse1nxdlq (miroir)]&lt;br /&gt;
&lt;br /&gt;
Pour finir, je me suis dit que je n'étais sûrement pas le seul à pédaler dans la semoule pour démarrer et que j'allais me servir de ce sujet un peu comme d'un fil rouge qui aura le double avantage de permettre aux autres débutants de me suivre et à des gens bien plus avancés de me dire si mon code est irregardable et/ou d'apporter des points clés au compte goutte. (le but étant d'apprendre au fur et à mesure, pas de se prendre une grosse tartine d'un coup)&lt;br /&gt;
&lt;br /&gt;
Je débute donc ici le Guide officiel du GDL pour les Nuls et vais ajouter en suivant et avec des captures du code 2D et 3D les trois premières étapes de mes balbutiements.&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Accueil&amp;diff=18</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Accueil&amp;diff=18"/>
		<updated>2021-11-25T18:29:19Z</updated>

		<summary type="html">&lt;p&gt;Simon : /* GDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GDL ==&lt;br /&gt;
* [[Le GDL pour les nuls]]&lt;br /&gt;
** [[Objet &amp;quot;Test&amp;quot;]]&lt;br /&gt;
** [[Symbole de trémie]]&lt;br /&gt;
** [[Premier objet en 3D]]&lt;br /&gt;
** [[Table]]&lt;br /&gt;
** [[Gradin]]&lt;br /&gt;
* [[Code snippet]]&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Accueil&amp;diff=17</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Accueil&amp;diff=17"/>
		<updated>2021-11-25T18:29:12Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GDL ==&lt;br /&gt;
* [[Le GDL pour les nuls]]&lt;br /&gt;
** [[Objet &amp;quot;Test&amp;quot;]]&lt;br /&gt;
** [[Symbole de trémie]]&lt;br /&gt;
** [[Premier objet en 3D]]&lt;br /&gt;
** [[Table]]&lt;br /&gt;
** [[Gradin]&lt;br /&gt;
* [[Code snippet]]&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=16</id>
		<title>Code snippet</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=16"/>
		<updated>2021-10-18T14:04:07Z</updated>

		<summary type="html">&lt;p&gt;Simon : /* Affichage sur étage supérieur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== HOTSPOT ==&lt;br /&gt;
=== 2D ===&lt;br /&gt;
==== Boite englobante ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0, 0&lt;br /&gt;
HOTSPOT2 a, 0&lt;br /&gt;
HOTSPOT2 0, b&lt;br /&gt;
HOTSPOT2 a, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 -a/2, -b/2&lt;br /&gt;
HOTSPOT2 a/2, -b/2&lt;br /&gt;
HOTSPOT2 -a/2, b/2&lt;br /&gt;
HOTSPOT2 a/2, b/2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 -1, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0,  0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,	-1, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,  b, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur les deux axes en même temps =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0,  b, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 -1,  b, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a,  b, unID, a, 2		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a,  0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2  a, -1, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a,  b, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Rotation =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, angle, 6							: unID=unID+1&lt;br /&gt;
HOTSPOT2  A, 0, unID, angle, 4+128						: unID=unID+1&lt;br /&gt;
HOTSPOT2  A*COS(angle), A*SIN(angle), unID, angle, 5	: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D===&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT  0, 0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT -1, 0, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT  a, 0, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0,  0,	0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0,	-1,	0, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0,  b,	0, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Z =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0, 0,  0, unID, ZZYZX, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,	-1, unID, ZZYZX, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,  ZZYZX, unID, ZZYZX, 2	: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HOTLINE ==&lt;br /&gt;
=== Boite englobante ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTLINE2 0, 0, a, 0&lt;br /&gt;
HOTLINE2 a, 0, a, b&lt;br /&gt;
HOTLINE2 0, b, a, b&lt;br /&gt;
HOTLINE2 0, 0, 0, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gestion de l'affichage ==&lt;br /&gt;
=== Affichage différent en fonction de l'étage d'implantation ===&lt;br /&gt;
* L'objet placé doit être paramétré en &amp;quot;Visible sur tous les étages&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zz = REQUEST (&amp;quot;Story&amp;quot;, &amp;quot;&amp;quot;, index1, story_name) ! Étage affiché&lt;br /&gt;
zz = REQUEST (&amp;quot;Home_story&amp;quot;, &amp;quot;&amp;quot;, index2, home_story_name) ! Étage d'implantation de l'objet&lt;br /&gt;
&lt;br /&gt;
IF index1 &amp;gt; index2 THEN&lt;br /&gt;
	!Symbole 2D affiché au dessus de l'étage d'implantation&lt;br /&gt;
ENDIF&lt;br /&gt;
IF index1 = index2 THEN&lt;br /&gt;
	!Symbole 2D affiché sur l'étage d'implantation&lt;br /&gt;
ENDIF&lt;br /&gt;
IF index1 &amp;lt; index2 THEN&lt;br /&gt;
	!Symbole 2D affiché en dessous de l'étage d'implantation&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Orientation 2D ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MUL2 1 - 2 * SYMB_MIRRORED, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
r = request (&amp;quot;View_Rotangle&amp;quot;, &amp;quot;&amp;quot;, _angleViewRot)&lt;br /&gt;
&lt;br /&gt;
! Actual rotation of the 2D symbol:	&lt;br /&gt;
_totalRotate	= (SYMB_ROTANGLE + _angleViewRot) MOD 360&lt;br /&gt;
&lt;br /&gt;
! Count the number of transformations of the &lt;br /&gt;
! coordinate system in different cases&lt;br /&gt;
_nTrans = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Toujours horizontal ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rot2 _totalRotate * (SYMB_MIRRORED - not(SYMB_MIRRORED))&lt;br /&gt;
_nTrans = _nTrans + 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Lisible ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (_totalRotate &amp;gt; (90 + EPS) &amp;amp; _totalRotate &amp;lt; (270 + EPS)) then&lt;br /&gt;
    rot2 180&lt;br /&gt;
    _nTrans = _nTrans + 1&lt;br /&gt;
endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Script interface ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_dialog `Paramètres personnalisés`,444,266&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Checkbox (texte cliquable) ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_infield{3} &amp;quot;bool-parameter&amp;quot;, 240, 30, 110, 15,&lt;br /&gt;
7, &amp;quot;&amp;quot;,&lt;br /&gt;
2,&lt;br /&gt;
1, 20, 20, 20, 20,&lt;br /&gt;
0, &amp;quot;Texte&amp;quot;, 0,&lt;br /&gt;
1, &amp;quot;Texte&amp;quot;, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Liste de polices ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dim fontnames[]&lt;br /&gt;
n = REQUEST (&amp;quot;FONTNAMES_LIST&amp;quot;, &amp;quot;&amp;quot;, fontnames)&lt;br /&gt;
ui_outfield `Police`,		10, 14, 100, 15 &lt;br /&gt;
ui_custom_popup_infield &amp;quot;sampleName&amp;quot;, 	115, 10, 150, 20,&lt;br /&gt;
	0, 0, 1, &amp;quot;&amp;quot;, fontnames&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Macros ==&lt;br /&gt;
=== Suis-je une macro ? ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nameM=&amp;quot;&amp;quot;&lt;br /&gt;
sts=REQUEST(&amp;quot;name_of_main&amp;quot;,&amp;quot;&amp;quot;,nameM)&lt;br /&gt;
IF NOT(nameM=&amp;quot;&amp;quot;) THEN&lt;br /&gt;
  PRINT nameM+&amp;quot; is CALLing me!&amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  PRINT &amp;quot;I am free!&amp;quot;&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Mathématiques ==&lt;br /&gt;
=== Comparaisons ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABS( A - B )&amp;gt;EPS   ! A&amp;lt;&amp;gt;B&lt;br /&gt;
ABS( A - B )&amp;lt;EPS   ! A=B&lt;br /&gt;
A - B &amp;lt; EPS        ! A&amp;lt;=B&lt;br /&gt;
A - B &amp;lt; -EPS       ! A&amp;lt;B&lt;br /&gt;
B - A &amp;gt; EPS        ! A&amp;lt;B&lt;br /&gt;
B - A &amp;lt; EPS        ! A&amp;gt;=B&lt;br /&gt;
B - A &amp;lt; -EPS       ! A&amp;gt;B&lt;br /&gt;
A - B &amp;gt; EPS        ! A&amp;gt;B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Trucs &amp;amp; astuces divers ==&lt;br /&gt;
=== Transformer POLY_B{5} en PRISM_ à l'aide d'une recherche REGEX ===&lt;br /&gt;
Dans un éditeur de texte supportant les recherches REGEX (Regular Expression) :&lt;br /&gt;
&lt;br /&gt;
Chercher : &amp;lt;code&amp;gt;(?-s)^\t*poly2_b\{5\} *([0-9]+),(?s).*? 0, $&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer par : &amp;lt;code&amp;gt;PRISM_ \1, b,&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=15</id>
		<title>Code snippet</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=15"/>
		<updated>2021-10-18T14:03:39Z</updated>

		<summary type="html">&lt;p&gt;Simon : /* Affichage sur étage supérieur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== HOTSPOT ==&lt;br /&gt;
=== 2D ===&lt;br /&gt;
==== Boite englobante ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0, 0&lt;br /&gt;
HOTSPOT2 a, 0&lt;br /&gt;
HOTSPOT2 0, b&lt;br /&gt;
HOTSPOT2 a, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 -a/2, -b/2&lt;br /&gt;
HOTSPOT2 a/2, -b/2&lt;br /&gt;
HOTSPOT2 -a/2, b/2&lt;br /&gt;
HOTSPOT2 a/2, b/2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 -1, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0,  0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,	-1, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,  b, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur les deux axes en même temps =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0,  b, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 -1,  b, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a,  b, unID, a, 2		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a,  0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2  a, -1, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a,  b, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Rotation =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, angle, 6							: unID=unID+1&lt;br /&gt;
HOTSPOT2  A, 0, unID, angle, 4+128						: unID=unID+1&lt;br /&gt;
HOTSPOT2  A*COS(angle), A*SIN(angle), unID, angle, 5	: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D===&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT  0, 0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT -1, 0, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT  a, 0, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0,  0,	0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0,	-1,	0, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0,  b,	0, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Z =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0, 0,  0, unID, ZZYZX, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,	-1, unID, ZZYZX, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,  ZZYZX, unID, ZZYZX, 2	: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HOTLINE ==&lt;br /&gt;
=== Boite englobante ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTLINE2 0, 0, a, 0&lt;br /&gt;
HOTLINE2 a, 0, a, b&lt;br /&gt;
HOTLINE2 0, b, a, b&lt;br /&gt;
HOTLINE2 0, 0, 0, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gestion de l'affichage ==&lt;br /&gt;
=== Affichage sur étage supérieur ===&lt;br /&gt;
* L'objet placé doit être paramétré en &amp;quot;Visible sur tous les étages&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zz = REQUEST (&amp;quot;Story&amp;quot;, &amp;quot;&amp;quot;, index1, story_name) ! Étage affiché&lt;br /&gt;
zz = REQUEST (&amp;quot;Home_story&amp;quot;, &amp;quot;&amp;quot;, index2, home_story_name) ! Étage d'implantation de l'objet&lt;br /&gt;
&lt;br /&gt;
IF index1 &amp;gt; index2 THEN&lt;br /&gt;
	!Symbole 2D affiché au dessus de l'étage d'implantation&lt;br /&gt;
ENDIF&lt;br /&gt;
IF index1 = index2 THEN&lt;br /&gt;
	!Symbole 2D affiché sur l'étage d'implantation&lt;br /&gt;
ENDIF&lt;br /&gt;
IF index1 &amp;lt; index2 THEN&lt;br /&gt;
	!Symbole 2D affiché en dessous de l'étage d'implantation&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Orientation 2D ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MUL2 1 - 2 * SYMB_MIRRORED, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
r = request (&amp;quot;View_Rotangle&amp;quot;, &amp;quot;&amp;quot;, _angleViewRot)&lt;br /&gt;
&lt;br /&gt;
! Actual rotation of the 2D symbol:	&lt;br /&gt;
_totalRotate	= (SYMB_ROTANGLE + _angleViewRot) MOD 360&lt;br /&gt;
&lt;br /&gt;
! Count the number of transformations of the &lt;br /&gt;
! coordinate system in different cases&lt;br /&gt;
_nTrans = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Toujours horizontal ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rot2 _totalRotate * (SYMB_MIRRORED - not(SYMB_MIRRORED))&lt;br /&gt;
_nTrans = _nTrans + 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Lisible ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (_totalRotate &amp;gt; (90 + EPS) &amp;amp; _totalRotate &amp;lt; (270 + EPS)) then&lt;br /&gt;
    rot2 180&lt;br /&gt;
    _nTrans = _nTrans + 1&lt;br /&gt;
endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Script interface ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_dialog `Paramètres personnalisés`,444,266&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Checkbox (texte cliquable) ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_infield{3} &amp;quot;bool-parameter&amp;quot;, 240, 30, 110, 15,&lt;br /&gt;
7, &amp;quot;&amp;quot;,&lt;br /&gt;
2,&lt;br /&gt;
1, 20, 20, 20, 20,&lt;br /&gt;
0, &amp;quot;Texte&amp;quot;, 0,&lt;br /&gt;
1, &amp;quot;Texte&amp;quot;, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Liste de polices ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dim fontnames[]&lt;br /&gt;
n = REQUEST (&amp;quot;FONTNAMES_LIST&amp;quot;, &amp;quot;&amp;quot;, fontnames)&lt;br /&gt;
ui_outfield `Police`,		10, 14, 100, 15 &lt;br /&gt;
ui_custom_popup_infield &amp;quot;sampleName&amp;quot;, 	115, 10, 150, 20,&lt;br /&gt;
	0, 0, 1, &amp;quot;&amp;quot;, fontnames&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Macros ==&lt;br /&gt;
=== Suis-je une macro ? ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nameM=&amp;quot;&amp;quot;&lt;br /&gt;
sts=REQUEST(&amp;quot;name_of_main&amp;quot;,&amp;quot;&amp;quot;,nameM)&lt;br /&gt;
IF NOT(nameM=&amp;quot;&amp;quot;) THEN&lt;br /&gt;
  PRINT nameM+&amp;quot; is CALLing me!&amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  PRINT &amp;quot;I am free!&amp;quot;&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Mathématiques ==&lt;br /&gt;
=== Comparaisons ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABS( A - B )&amp;gt;EPS   ! A&amp;lt;&amp;gt;B&lt;br /&gt;
ABS( A - B )&amp;lt;EPS   ! A=B&lt;br /&gt;
A - B &amp;lt; EPS        ! A&amp;lt;=B&lt;br /&gt;
A - B &amp;lt; -EPS       ! A&amp;lt;B&lt;br /&gt;
B - A &amp;gt; EPS        ! A&amp;lt;B&lt;br /&gt;
B - A &amp;lt; EPS        ! A&amp;gt;=B&lt;br /&gt;
B - A &amp;lt; -EPS       ! A&amp;gt;B&lt;br /&gt;
A - B &amp;gt; EPS        ! A&amp;gt;B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Trucs &amp;amp; astuces divers ==&lt;br /&gt;
=== Transformer POLY_B{5} en PRISM_ à l'aide d'une recherche REGEX ===&lt;br /&gt;
Dans un éditeur de texte supportant les recherches REGEX (Regular Expression) :&lt;br /&gt;
&lt;br /&gt;
Chercher : &amp;lt;code&amp;gt;(?-s)^\t*poly2_b\{5\} *([0-9]+),(?s).*? 0, $&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer par : &amp;lt;code&amp;gt;PRISM_ \1, b,&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=13</id>
		<title>Code snippet</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=13"/>
		<updated>2021-10-11T10:08:40Z</updated>

		<summary type="html">&lt;p&gt;Simon : /* Sur l'axe Z */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== HOTSPOT ==&lt;br /&gt;
=== 2D ===&lt;br /&gt;
==== Boite englobante ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0, 0&lt;br /&gt;
HOTSPOT2 a, 0&lt;br /&gt;
HOTSPOT2 0, b&lt;br /&gt;
HOTSPOT2 a, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 -a/2, -b/2&lt;br /&gt;
HOTSPOT2 a/2, -b/2&lt;br /&gt;
HOTSPOT2 -a/2, b/2&lt;br /&gt;
HOTSPOT2 a/2, b/2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 -1, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0,  0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,	-1, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,  b, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Rotation =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, angle, 6							: unID=unID+1&lt;br /&gt;
HOTSPOT2  A, 0, unID, angle, 4+128						: unID=unID+1&lt;br /&gt;
HOTSPOT2  A*COS(angle), A*SIN(angle), unID, angle, 5	: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D===&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT  0, 0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT -1, 0, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT  a, 0, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0,  0,	0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0,	-1,	0, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0,  b,	0, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Z =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0, 0,  0, unID, ZZYZX, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,	-1, unID, ZZYZX, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,  ZZYZX, unID, ZZYZX, 2	: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HOTLINE ==&lt;br /&gt;
=== Boite englobante ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTLINE2 0, 0, a, 0&lt;br /&gt;
HOTLINE2 a, 0, a, b&lt;br /&gt;
HOTLINE2 0, b, a, b&lt;br /&gt;
HOTLINE2 0, 0, 0, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gestion de l'affichage ==&lt;br /&gt;
=== Affichage sur étage supérieur ===&lt;br /&gt;
* L'objet placé doit être paramétré en &amp;quot;Visible sur tous les étages&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zz = REQUEST (&amp;quot;Story&amp;quot;, &amp;quot;&amp;quot;, index1, story_name)&lt;br /&gt;
zz = REQUEST (&amp;quot;Home_story&amp;quot;, &amp;quot;&amp;quot;, index2, home_story_name)&lt;br /&gt;
&lt;br /&gt;
IF index1 &amp;gt;= index2 THEN&lt;br /&gt;
&lt;br /&gt;
	!Symbole 2D&lt;br /&gt;
&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Orientation 2D ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MUL2 1 - 2 * SYMB_MIRRORED, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
r = request (&amp;quot;View_Rotangle&amp;quot;, &amp;quot;&amp;quot;, _angleViewRot)&lt;br /&gt;
&lt;br /&gt;
! Actual rotation of the 2D symbol:	&lt;br /&gt;
_totalRotate	= (SYMB_ROTANGLE + _angleViewRot) MOD 360&lt;br /&gt;
&lt;br /&gt;
! Count the number of transformations of the &lt;br /&gt;
! coordinate system in different cases&lt;br /&gt;
_nTrans = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Toujours horizontal ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rot2 _totalRotate * (SYMB_MIRRORED - not(SYMB_MIRRORED))&lt;br /&gt;
_nTrans = _nTrans + 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Lisible ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (_totalRotate &amp;gt; (90 + EPS) &amp;amp; _totalRotate &amp;lt; (270 + EPS)) then&lt;br /&gt;
    rot2 180&lt;br /&gt;
    _nTrans = _nTrans + 1&lt;br /&gt;
endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Script interface ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_dialog `Paramètres personnalisés`,444,266&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Checkbox (texte cliquable) ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_infield{3} &amp;quot;bool-parameter&amp;quot;, 240, 30, 110, 15,&lt;br /&gt;
7, &amp;quot;&amp;quot;,&lt;br /&gt;
2,&lt;br /&gt;
1, 20, 20, 20, 20,&lt;br /&gt;
0, &amp;quot;Texte&amp;quot;, 0,&lt;br /&gt;
1, &amp;quot;Texte&amp;quot;, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Liste de polices ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dim fontnames[]&lt;br /&gt;
n = REQUEST (&amp;quot;FONTNAMES_LIST&amp;quot;, &amp;quot;&amp;quot;, fontnames)&lt;br /&gt;
ui_outfield `Police`,		10, 14, 100, 15 &lt;br /&gt;
ui_custom_popup_infield &amp;quot;sampleName&amp;quot;, 	115, 10, 150, 20,&lt;br /&gt;
	0, 0, 1, &amp;quot;&amp;quot;, fontnames&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Macros ==&lt;br /&gt;
=== Suis-je une macro ? ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nameM=&amp;quot;&amp;quot;&lt;br /&gt;
sts=REQUEST(&amp;quot;name_of_main&amp;quot;,&amp;quot;&amp;quot;,nameM)&lt;br /&gt;
IF NOT(nameM=&amp;quot;&amp;quot;) THEN&lt;br /&gt;
  PRINT nameM+&amp;quot; is CALLing me!&amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  PRINT &amp;quot;I am free!&amp;quot;&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Mathématiques ==&lt;br /&gt;
=== Comparaisons ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABS( A - B )&amp;gt;EPS   ! A&amp;lt;&amp;gt;B&lt;br /&gt;
ABS( A - B )&amp;lt;EPS   ! A=B&lt;br /&gt;
A - B &amp;lt; EPS        ! A&amp;lt;=B&lt;br /&gt;
A - B &amp;lt; -EPS       ! A&amp;lt;B&lt;br /&gt;
B - A &amp;gt; EPS        ! A&amp;lt;B&lt;br /&gt;
B - A &amp;lt; EPS        ! A&amp;gt;=B&lt;br /&gt;
B - A &amp;lt; -EPS       ! A&amp;gt;B&lt;br /&gt;
A - B &amp;gt; EPS        ! A&amp;gt;B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Trucs &amp;amp; astuces divers ==&lt;br /&gt;
=== Transformer POLY_B{5} en PRISM_ à l'aide d'une recherche REGEX ===&lt;br /&gt;
Dans un éditeur de texte supportant les recherches REGEX (Regular Expression) :&lt;br /&gt;
&lt;br /&gt;
Chercher : &amp;lt;code&amp;gt;(?-s)^\t*poly2_b\{5\} *([0-9]+),(?s).*? 0, $&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer par : &amp;lt;code&amp;gt;PRISM_ \1, b,&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=12</id>
		<title>Code snippet</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=12"/>
		<updated>2021-10-11T10:08:25Z</updated>

		<summary type="html">&lt;p&gt;Simon : /* Rotation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== HOTSPOT ==&lt;br /&gt;
=== 2D ===&lt;br /&gt;
==== Boite englobante ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0, 0&lt;br /&gt;
HOTSPOT2 a, 0&lt;br /&gt;
HOTSPOT2 0, b&lt;br /&gt;
HOTSPOT2 a, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 -a/2, -b/2&lt;br /&gt;
HOTSPOT2 a/2, -b/2&lt;br /&gt;
HOTSPOT2 -a/2, b/2&lt;br /&gt;
HOTSPOT2 a/2, b/2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 -1, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0,  0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,	-1, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,  b, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Rotation =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, angle, 6							: unID=unID+1&lt;br /&gt;
HOTSPOT2  A, 0, unID, angle, 4+128						: unID=unID+1&lt;br /&gt;
HOTSPOT2  A*COS(angle), A*SIN(angle), unID, angle, 5	: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3D===&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT  0, 0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT -1, 0, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT  a, 0, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0,  0,	0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0,	-1,	0, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0,  b,	0, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Z =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0, 0,  0, unID, ZZYZX, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,	-1, unID, ZZYZX, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,  ZZYZX, unID, ZZYZX, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== HOTLINE ==&lt;br /&gt;
=== Boite englobante ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTLINE2 0, 0, a, 0&lt;br /&gt;
HOTLINE2 a, 0, a, b&lt;br /&gt;
HOTLINE2 0, b, a, b&lt;br /&gt;
HOTLINE2 0, 0, 0, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gestion de l'affichage ==&lt;br /&gt;
=== Affichage sur étage supérieur ===&lt;br /&gt;
* L'objet placé doit être paramétré en &amp;quot;Visible sur tous les étages&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zz = REQUEST (&amp;quot;Story&amp;quot;, &amp;quot;&amp;quot;, index1, story_name)&lt;br /&gt;
zz = REQUEST (&amp;quot;Home_story&amp;quot;, &amp;quot;&amp;quot;, index2, home_story_name)&lt;br /&gt;
&lt;br /&gt;
IF index1 &amp;gt;= index2 THEN&lt;br /&gt;
&lt;br /&gt;
	!Symbole 2D&lt;br /&gt;
&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Orientation 2D ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MUL2 1 - 2 * SYMB_MIRRORED, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
r = request (&amp;quot;View_Rotangle&amp;quot;, &amp;quot;&amp;quot;, _angleViewRot)&lt;br /&gt;
&lt;br /&gt;
! Actual rotation of the 2D symbol:	&lt;br /&gt;
_totalRotate	= (SYMB_ROTANGLE + _angleViewRot) MOD 360&lt;br /&gt;
&lt;br /&gt;
! Count the number of transformations of the &lt;br /&gt;
! coordinate system in different cases&lt;br /&gt;
_nTrans = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Toujours horizontal ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rot2 _totalRotate * (SYMB_MIRRORED - not(SYMB_MIRRORED))&lt;br /&gt;
_nTrans = _nTrans + 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Lisible ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (_totalRotate &amp;gt; (90 + EPS) &amp;amp; _totalRotate &amp;lt; (270 + EPS)) then&lt;br /&gt;
    rot2 180&lt;br /&gt;
    _nTrans = _nTrans + 1&lt;br /&gt;
endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Script interface ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_dialog `Paramètres personnalisés`,444,266&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Checkbox (texte cliquable) ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_infield{3} &amp;quot;bool-parameter&amp;quot;, 240, 30, 110, 15,&lt;br /&gt;
7, &amp;quot;&amp;quot;,&lt;br /&gt;
2,&lt;br /&gt;
1, 20, 20, 20, 20,&lt;br /&gt;
0, &amp;quot;Texte&amp;quot;, 0,&lt;br /&gt;
1, &amp;quot;Texte&amp;quot;, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Liste de polices ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dim fontnames[]&lt;br /&gt;
n = REQUEST (&amp;quot;FONTNAMES_LIST&amp;quot;, &amp;quot;&amp;quot;, fontnames)&lt;br /&gt;
ui_outfield `Police`,		10, 14, 100, 15 &lt;br /&gt;
ui_custom_popup_infield &amp;quot;sampleName&amp;quot;, 	115, 10, 150, 20,&lt;br /&gt;
	0, 0, 1, &amp;quot;&amp;quot;, fontnames&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Macros ==&lt;br /&gt;
=== Suis-je une macro ? ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nameM=&amp;quot;&amp;quot;&lt;br /&gt;
sts=REQUEST(&amp;quot;name_of_main&amp;quot;,&amp;quot;&amp;quot;,nameM)&lt;br /&gt;
IF NOT(nameM=&amp;quot;&amp;quot;) THEN&lt;br /&gt;
  PRINT nameM+&amp;quot; is CALLing me!&amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  PRINT &amp;quot;I am free!&amp;quot;&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Mathématiques ==&lt;br /&gt;
=== Comparaisons ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABS( A - B )&amp;gt;EPS   ! A&amp;lt;&amp;gt;B&lt;br /&gt;
ABS( A - B )&amp;lt;EPS   ! A=B&lt;br /&gt;
A - B &amp;lt; EPS        ! A&amp;lt;=B&lt;br /&gt;
A - B &amp;lt; -EPS       ! A&amp;lt;B&lt;br /&gt;
B - A &amp;gt; EPS        ! A&amp;lt;B&lt;br /&gt;
B - A &amp;lt; EPS        ! A&amp;gt;=B&lt;br /&gt;
B - A &amp;lt; -EPS       ! A&amp;gt;B&lt;br /&gt;
A - B &amp;gt; EPS        ! A&amp;gt;B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Trucs &amp;amp; astuces divers ==&lt;br /&gt;
=== Transformer POLY_B{5} en PRISM_ à l'aide d'une recherche REGEX ===&lt;br /&gt;
Dans un éditeur de texte supportant les recherches REGEX (Regular Expression) :&lt;br /&gt;
&lt;br /&gt;
Chercher : &amp;lt;code&amp;gt;(?-s)^\t*poly2_b\{5\} *([0-9]+),(?s).*? 0, $&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer par : &amp;lt;code&amp;gt;PRISM_ \1, b,&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=MediaWiki:Common.css&amp;diff=11</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=MediaWiki:Common.css&amp;diff=11"/>
		<updated>2021-10-11T10:07:04Z</updated>

		<summary type="html">&lt;p&gt;Simon : Page créée avec « /* Le CSS placé ici sera appliqué à tous les habillages. */ pre {     tab-size:4;     -moz-tab-size: 4;     -o-tab-size:  4; } »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
pre {&lt;br /&gt;
    tab-size:4;&lt;br /&gt;
    -moz-tab-size: 4;&lt;br /&gt;
    -o-tab-size:  4;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=10</id>
		<title>Code snippet</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=10"/>
		<updated>2021-10-11T10:01:33Z</updated>

		<summary type="html">&lt;p&gt;Simon : /* Affichage sur étage supérieur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== HOTSPOT ==&lt;br /&gt;
=== 2D ===&lt;br /&gt;
==== Boite englobante ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0, 0&lt;br /&gt;
HOTSPOT2 a, 0&lt;br /&gt;
HOTSPOT2 0, b&lt;br /&gt;
HOTSPOT2 a, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 -a/2, -b/2&lt;br /&gt;
HOTSPOT2 a/2, -b/2&lt;br /&gt;
HOTSPOT2 -a/2, b/2&lt;br /&gt;
HOTSPOT2 a/2, b/2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 -1, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0,  0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,	-1, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,  b, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Rotation =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, angle, 6	: unID=unID+1&lt;br /&gt;
HOTSPOT2  A, 0, unID, angle, 4+128		: unID=unID+1&lt;br /&gt;
HOTSPOT2  A*COS(angle), A*SIN(angle), unID, angle, 5		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===3D===&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT  0, 0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT -1, 0, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT  a, 0, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0,  0,	0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0,	-1,	0, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0,  b,	0, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Z =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0, 0,  0, unID, ZZYZX, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,	-1, unID, ZZYZX, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,  ZZYZX, unID, ZZYZX, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== HOTLINE ==&lt;br /&gt;
=== Boite englobante ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTLINE2 0, 0, a, 0&lt;br /&gt;
HOTLINE2 a, 0, a, b&lt;br /&gt;
HOTLINE2 0, b, a, b&lt;br /&gt;
HOTLINE2 0, 0, 0, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gestion de l'affichage ==&lt;br /&gt;
=== Affichage sur étage supérieur ===&lt;br /&gt;
* L'objet placé doit être paramétré en &amp;quot;Visible sur tous les étages&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zz = REQUEST (&amp;quot;Story&amp;quot;, &amp;quot;&amp;quot;, index1, story_name)&lt;br /&gt;
zz = REQUEST (&amp;quot;Home_story&amp;quot;, &amp;quot;&amp;quot;, index2, home_story_name)&lt;br /&gt;
&lt;br /&gt;
IF index1 &amp;gt;= index2 THEN&lt;br /&gt;
&lt;br /&gt;
	!Symbole 2D&lt;br /&gt;
&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Orientation 2D ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MUL2 1 - 2 * SYMB_MIRRORED, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
r = request (&amp;quot;View_Rotangle&amp;quot;, &amp;quot;&amp;quot;, _angleViewRot)&lt;br /&gt;
&lt;br /&gt;
! Actual rotation of the 2D symbol:	&lt;br /&gt;
_totalRotate	= (SYMB_ROTANGLE + _angleViewRot) MOD 360&lt;br /&gt;
&lt;br /&gt;
! Count the number of transformations of the &lt;br /&gt;
! coordinate system in different cases&lt;br /&gt;
_nTrans = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Toujours horizontal ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rot2 _totalRotate * (SYMB_MIRRORED - not(SYMB_MIRRORED))&lt;br /&gt;
_nTrans = _nTrans + 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Lisible ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (_totalRotate &amp;gt; (90 + EPS) &amp;amp; _totalRotate &amp;lt; (270 + EPS)) then&lt;br /&gt;
    rot2 180&lt;br /&gt;
    _nTrans = _nTrans + 1&lt;br /&gt;
endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Script interface ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_dialog `Paramètres personnalisés`,444,266&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Checkbox (texte cliquable) ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_infield{3} &amp;quot;bool-parameter&amp;quot;, 240, 30, 110, 15,&lt;br /&gt;
7, &amp;quot;&amp;quot;,&lt;br /&gt;
2,&lt;br /&gt;
1, 20, 20, 20, 20,&lt;br /&gt;
0, &amp;quot;Texte&amp;quot;, 0,&lt;br /&gt;
1, &amp;quot;Texte&amp;quot;, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Liste de polices ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dim fontnames[]&lt;br /&gt;
n = REQUEST (&amp;quot;FONTNAMES_LIST&amp;quot;, &amp;quot;&amp;quot;, fontnames)&lt;br /&gt;
ui_outfield `Police`,		10, 14, 100, 15 &lt;br /&gt;
ui_custom_popup_infield &amp;quot;sampleName&amp;quot;, 	115, 10, 150, 20,&lt;br /&gt;
	0, 0, 1, &amp;quot;&amp;quot;, fontnames&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Macros ==&lt;br /&gt;
=== Suis-je une macro ? ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nameM=&amp;quot;&amp;quot;&lt;br /&gt;
sts=REQUEST(&amp;quot;name_of_main&amp;quot;,&amp;quot;&amp;quot;,nameM)&lt;br /&gt;
IF NOT(nameM=&amp;quot;&amp;quot;) THEN&lt;br /&gt;
  PRINT nameM+&amp;quot; is CALLing me!&amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  PRINT &amp;quot;I am free!&amp;quot;&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Mathématiques ==&lt;br /&gt;
=== Comparaisons ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABS( A - B )&amp;gt;EPS   ! A&amp;lt;&amp;gt;B&lt;br /&gt;
ABS( A - B )&amp;lt;EPS   ! A=B&lt;br /&gt;
A - B &amp;lt; EPS        ! A&amp;lt;=B&lt;br /&gt;
A - B &amp;lt; -EPS       ! A&amp;lt;B&lt;br /&gt;
B - A &amp;gt; EPS        ! A&amp;lt;B&lt;br /&gt;
B - A &amp;lt; EPS        ! A&amp;gt;=B&lt;br /&gt;
B - A &amp;lt; -EPS       ! A&amp;gt;B&lt;br /&gt;
A - B &amp;gt; EPS        ! A&amp;gt;B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Trucs &amp;amp; astuces divers ==&lt;br /&gt;
=== Transformer POLY_B{5} en PRISM_ à l'aide d'une recherche REGEX ===&lt;br /&gt;
Dans un éditeur de texte supportant les recherches REGEX (Regular Expression) :&lt;br /&gt;
&lt;br /&gt;
Chercher : &amp;lt;code&amp;gt;(?-s)^\t*poly2_b\{5\} *([0-9]+),(?s).*? 0, $&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer par : &amp;lt;code&amp;gt;PRISM_ \1, b,&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=9</id>
		<title>Code snippet</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=9"/>
		<updated>2021-10-11T09:59:41Z</updated>

		<summary type="html">&lt;p&gt;Simon : /* Boites englobantes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== HOTSPOT ==&lt;br /&gt;
=== 2D ===&lt;br /&gt;
==== Boite englobante ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0, 0&lt;br /&gt;
HOTSPOT2 a, 0&lt;br /&gt;
HOTSPOT2 0, b&lt;br /&gt;
HOTSPOT2 a, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 -a/2, -b/2&lt;br /&gt;
HOTSPOT2 a/2, -b/2&lt;br /&gt;
HOTSPOT2 -a/2, b/2&lt;br /&gt;
HOTSPOT2 a/2, b/2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 -1, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0,  0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,	-1, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,  b, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Rotation =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, angle, 6	: unID=unID+1&lt;br /&gt;
HOTSPOT2  A, 0, unID, angle, 4+128		: unID=unID+1&lt;br /&gt;
HOTSPOT2  A*COS(angle), A*SIN(angle), unID, angle, 5		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===3D===&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT  0, 0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT -1, 0, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT  a, 0, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0,  0,	0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0,	-1,	0, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0,  b,	0, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Z =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0, 0,  0, unID, ZZYZX, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,	-1, unID, ZZYZX, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,  ZZYZX, unID, ZZYZX, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== HOTLINE ==&lt;br /&gt;
=== Boite englobante ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTLINE2 0, 0, a, 0&lt;br /&gt;
HOTLINE2 a, 0, a, b&lt;br /&gt;
HOTLINE2 0, b, a, b&lt;br /&gt;
HOTLINE2 0, 0, 0, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gestion de l'affichage ==&lt;br /&gt;
=== Affichage sur étage supérieur ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zz = REQUEST (&amp;quot;Story&amp;quot;, &amp;quot;&amp;quot;, index1, story_name)&lt;br /&gt;
zz = REQUEST (&amp;quot;Home_story&amp;quot;, &amp;quot;&amp;quot;, index2, home_story_name)&lt;br /&gt;
&lt;br /&gt;
IF index1 = index2 OR (index1 &amp;gt; index2 AND aff_eta_sup) THEN&lt;br /&gt;
&lt;br /&gt;
	!Symbole 2D&lt;br /&gt;
&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Orientation 2D ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MUL2 1 - 2 * SYMB_MIRRORED, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
r = request (&amp;quot;View_Rotangle&amp;quot;, &amp;quot;&amp;quot;, _angleViewRot)&lt;br /&gt;
&lt;br /&gt;
! Actual rotation of the 2D symbol:	&lt;br /&gt;
_totalRotate	= (SYMB_ROTANGLE + _angleViewRot) MOD 360&lt;br /&gt;
&lt;br /&gt;
! Count the number of transformations of the &lt;br /&gt;
! coordinate system in different cases&lt;br /&gt;
_nTrans = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Toujours horizontal ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rot2 _totalRotate * (SYMB_MIRRORED - not(SYMB_MIRRORED))&lt;br /&gt;
_nTrans = _nTrans + 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Lisible ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (_totalRotate &amp;gt; (90 + EPS) &amp;amp; _totalRotate &amp;lt; (270 + EPS)) then&lt;br /&gt;
    rot2 180&lt;br /&gt;
    _nTrans = _nTrans + 1&lt;br /&gt;
endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Script interface ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_dialog `Paramètres personnalisés`,444,266&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Checkbox (texte cliquable) ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_infield{3} &amp;quot;bool-parameter&amp;quot;, 240, 30, 110, 15,&lt;br /&gt;
7, &amp;quot;&amp;quot;,&lt;br /&gt;
2,&lt;br /&gt;
1, 20, 20, 20, 20,&lt;br /&gt;
0, &amp;quot;Texte&amp;quot;, 0,&lt;br /&gt;
1, &amp;quot;Texte&amp;quot;, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Liste de polices ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dim fontnames[]&lt;br /&gt;
n = REQUEST (&amp;quot;FONTNAMES_LIST&amp;quot;, &amp;quot;&amp;quot;, fontnames)&lt;br /&gt;
ui_outfield `Police`,		10, 14, 100, 15 &lt;br /&gt;
ui_custom_popup_infield &amp;quot;sampleName&amp;quot;, 	115, 10, 150, 20,&lt;br /&gt;
	0, 0, 1, &amp;quot;&amp;quot;, fontnames&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Macros ==&lt;br /&gt;
=== Suis-je une macro ? ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nameM=&amp;quot;&amp;quot;&lt;br /&gt;
sts=REQUEST(&amp;quot;name_of_main&amp;quot;,&amp;quot;&amp;quot;,nameM)&lt;br /&gt;
IF NOT(nameM=&amp;quot;&amp;quot;) THEN&lt;br /&gt;
  PRINT nameM+&amp;quot; is CALLing me!&amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  PRINT &amp;quot;I am free!&amp;quot;&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Mathématiques ==&lt;br /&gt;
=== Comparaisons ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABS( A - B )&amp;gt;EPS   ! A&amp;lt;&amp;gt;B&lt;br /&gt;
ABS( A - B )&amp;lt;EPS   ! A=B&lt;br /&gt;
A - B &amp;lt; EPS        ! A&amp;lt;=B&lt;br /&gt;
A - B &amp;lt; -EPS       ! A&amp;lt;B&lt;br /&gt;
B - A &amp;gt; EPS        ! A&amp;lt;B&lt;br /&gt;
B - A &amp;lt; EPS        ! A&amp;gt;=B&lt;br /&gt;
B - A &amp;lt; -EPS       ! A&amp;gt;B&lt;br /&gt;
A - B &amp;gt; EPS        ! A&amp;gt;B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Trucs &amp;amp; astuces divers ==&lt;br /&gt;
=== Transformer POLY_B{5} en PRISM_ à l'aide d'une recherche REGEX ===&lt;br /&gt;
Dans un éditeur de texte supportant les recherches REGEX (Regular Expression) :&lt;br /&gt;
&lt;br /&gt;
Chercher : &amp;lt;code&amp;gt;(?-s)^\t*poly2_b\{5\} *([0-9]+),(?s).*? 0, $&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer par : &amp;lt;code&amp;gt;PRISM_ \1, b,&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=8</id>
		<title>Code snippet</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=8"/>
		<updated>2021-10-11T09:59:28Z</updated>

		<summary type="html">&lt;p&gt;Simon : /* Boites englobantes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== HOTSPOT ==&lt;br /&gt;
=== 2D ===&lt;br /&gt;
==== Boite englobante ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0, 0&lt;br /&gt;
HOTSPOT2 a, 0&lt;br /&gt;
HOTSPOT2 0, b&lt;br /&gt;
HOTSPOT2 a, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 -a/2, -b/2&lt;br /&gt;
HOTSPOT2 a/2, -b/2&lt;br /&gt;
HOTSPOT2 -a/2, b/2&lt;br /&gt;
HOTSPOT2 a/2, b/2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 -1, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0,  0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,	-1, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,  b, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Rotation =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, angle, 6	: unID=unID+1&lt;br /&gt;
HOTSPOT2  A, 0, unID, angle, 4+128		: unID=unID+1&lt;br /&gt;
HOTSPOT2  A*COS(angle), A*SIN(angle), unID, angle, 5		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===3D===&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT  0, 0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT -1, 0, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT  a, 0, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0,  0,	0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0,	-1,	0, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0,  b,	0, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Z =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0, 0,  0, unID, ZZYZX, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,	-1, unID, ZZYZX, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,  ZZYZX, unID, ZZYZX, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== HOTLINE ==&lt;br /&gt;
=== Boites englobantes ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTLINE2 0, 0, a, 0&lt;br /&gt;
HOTLINE2 a, 0, a, b&lt;br /&gt;
HOTLINE2 0, b, a, b&lt;br /&gt;
HOTLINE2 0, 0, 0, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Gestion de l'affichage ==&lt;br /&gt;
=== Affichage sur étage supérieur ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zz = REQUEST (&amp;quot;Story&amp;quot;, &amp;quot;&amp;quot;, index1, story_name)&lt;br /&gt;
zz = REQUEST (&amp;quot;Home_story&amp;quot;, &amp;quot;&amp;quot;, index2, home_story_name)&lt;br /&gt;
&lt;br /&gt;
IF index1 = index2 OR (index1 &amp;gt; index2 AND aff_eta_sup) THEN&lt;br /&gt;
&lt;br /&gt;
	!Symbole 2D&lt;br /&gt;
&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Orientation 2D ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MUL2 1 - 2 * SYMB_MIRRORED, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
r = request (&amp;quot;View_Rotangle&amp;quot;, &amp;quot;&amp;quot;, _angleViewRot)&lt;br /&gt;
&lt;br /&gt;
! Actual rotation of the 2D symbol:	&lt;br /&gt;
_totalRotate	= (SYMB_ROTANGLE + _angleViewRot) MOD 360&lt;br /&gt;
&lt;br /&gt;
! Count the number of transformations of the &lt;br /&gt;
! coordinate system in different cases&lt;br /&gt;
_nTrans = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Toujours horizontal ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rot2 _totalRotate * (SYMB_MIRRORED - not(SYMB_MIRRORED))&lt;br /&gt;
_nTrans = _nTrans + 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Lisible ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (_totalRotate &amp;gt; (90 + EPS) &amp;amp; _totalRotate &amp;lt; (270 + EPS)) then&lt;br /&gt;
    rot2 180&lt;br /&gt;
    _nTrans = _nTrans + 1&lt;br /&gt;
endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Script interface ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_dialog `Paramètres personnalisés`,444,266&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Checkbox (texte cliquable) ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_infield{3} &amp;quot;bool-parameter&amp;quot;, 240, 30, 110, 15,&lt;br /&gt;
7, &amp;quot;&amp;quot;,&lt;br /&gt;
2,&lt;br /&gt;
1, 20, 20, 20, 20,&lt;br /&gt;
0, &amp;quot;Texte&amp;quot;, 0,&lt;br /&gt;
1, &amp;quot;Texte&amp;quot;, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Liste de polices ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dim fontnames[]&lt;br /&gt;
n = REQUEST (&amp;quot;FONTNAMES_LIST&amp;quot;, &amp;quot;&amp;quot;, fontnames)&lt;br /&gt;
ui_outfield `Police`,		10, 14, 100, 15 &lt;br /&gt;
ui_custom_popup_infield &amp;quot;sampleName&amp;quot;, 	115, 10, 150, 20,&lt;br /&gt;
	0, 0, 1, &amp;quot;&amp;quot;, fontnames&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Macros ==&lt;br /&gt;
=== Suis-je une macro ? ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nameM=&amp;quot;&amp;quot;&lt;br /&gt;
sts=REQUEST(&amp;quot;name_of_main&amp;quot;,&amp;quot;&amp;quot;,nameM)&lt;br /&gt;
IF NOT(nameM=&amp;quot;&amp;quot;) THEN&lt;br /&gt;
  PRINT nameM+&amp;quot; is CALLing me!&amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  PRINT &amp;quot;I am free!&amp;quot;&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Mathématiques ==&lt;br /&gt;
=== Comparaisons ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABS( A - B )&amp;gt;EPS   ! A&amp;lt;&amp;gt;B&lt;br /&gt;
ABS( A - B )&amp;lt;EPS   ! A=B&lt;br /&gt;
A - B &amp;lt; EPS        ! A&amp;lt;=B&lt;br /&gt;
A - B &amp;lt; -EPS       ! A&amp;lt;B&lt;br /&gt;
B - A &amp;gt; EPS        ! A&amp;lt;B&lt;br /&gt;
B - A &amp;lt; EPS        ! A&amp;gt;=B&lt;br /&gt;
B - A &amp;lt; -EPS       ! A&amp;gt;B&lt;br /&gt;
A - B &amp;gt; EPS        ! A&amp;gt;B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Trucs &amp;amp; astuces divers ==&lt;br /&gt;
=== Transformer POLY_B{5} en PRISM_ à l'aide d'une recherche REGEX ===&lt;br /&gt;
Dans un éditeur de texte supportant les recherches REGEX (Regular Expression) :&lt;br /&gt;
&lt;br /&gt;
Chercher : &amp;lt;code&amp;gt;(?-s)^\t*poly2_b\{5\} *([0-9]+),(?s).*? 0, $&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer par : &amp;lt;code&amp;gt;PRISM_ \1, b,&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=7</id>
		<title>Code snippet</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Code_snippet&amp;diff=7"/>
		<updated>2021-10-07T15:14:32Z</updated>

		<summary type="html">&lt;p&gt;Simon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== HOTSPOT ==&lt;br /&gt;
=== 2D ===&lt;br /&gt;
==== Boites englobantes ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0, 0&lt;br /&gt;
HOTSPOT2 a, 0&lt;br /&gt;
HOTSPOT2 0, b&lt;br /&gt;
HOTSPOT2 a, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 -a/2, -b/2&lt;br /&gt;
HOTSPOT2 a/2, -b/2&lt;br /&gt;
HOTSPOT2 -a/2, b/2&lt;br /&gt;
HOTSPOT2 a/2, b/2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 -1, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2  a, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2 0,  0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,	-1, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT2 0,  b, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Rotation =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT2  0, 0, unID, angle, 6	: unID=unID+1&lt;br /&gt;
HOTSPOT2  A, 0, unID, angle, 4+128		: unID=unID+1&lt;br /&gt;
HOTSPOT2  A*COS(angle), A*SIN(angle), unID, angle, 5		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===3D===&lt;br /&gt;
==== Déplacements ====&lt;br /&gt;
===== Sur l'axe X =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT  0, 0, 0, unID, a, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT -1, 0, 0, unID, a, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT  a, 0, 0, unID, a, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Y =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0,  0,	0, unID, b, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0,	-1,	0, unID, b, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0,  b,	0, unID, b, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===== Sur l'axe Z =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTSPOT 0, 0,  0, unID, ZZYZX, 1+128	: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,	-1, unID, ZZYZX, 3		: unID=unID+1&lt;br /&gt;
HOTSPOT 0, 0,  ZZYZX, unID, ZZYZX, 2		: unID=unID+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== HOTLINE ==&lt;br /&gt;
=== Boites englobantes ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HOTLINE2 0, 0, a, 0&lt;br /&gt;
HOTLINE2 a, 0, a, b&lt;br /&gt;
HOTLINE2 0, b, a, b&lt;br /&gt;
HOTLINE2 0, 0, 0, b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Gestion de l'affichage ==&lt;br /&gt;
=== Affichage sur étage supérieur ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zz = REQUEST (&amp;quot;Story&amp;quot;, &amp;quot;&amp;quot;, index1, story_name)&lt;br /&gt;
zz = REQUEST (&amp;quot;Home_story&amp;quot;, &amp;quot;&amp;quot;, index2, home_story_name)&lt;br /&gt;
&lt;br /&gt;
IF index1 = index2 OR (index1 &amp;gt; index2 AND aff_eta_sup) THEN&lt;br /&gt;
&lt;br /&gt;
	!Symbole 2D&lt;br /&gt;
&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Orientation 2D ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MUL2 1 - 2 * SYMB_MIRRORED, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
r = request (&amp;quot;View_Rotangle&amp;quot;, &amp;quot;&amp;quot;, _angleViewRot)&lt;br /&gt;
&lt;br /&gt;
! Actual rotation of the 2D symbol:	&lt;br /&gt;
_totalRotate	= (SYMB_ROTANGLE + _angleViewRot) MOD 360&lt;br /&gt;
&lt;br /&gt;
! Count the number of transformations of the &lt;br /&gt;
! coordinate system in different cases&lt;br /&gt;
_nTrans = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Toujours horizontal ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rot2 _totalRotate * (SYMB_MIRRORED - not(SYMB_MIRRORED))&lt;br /&gt;
_nTrans = _nTrans + 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Lisible ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (_totalRotate &amp;gt; (90 + EPS) &amp;amp; _totalRotate &amp;lt; (270 + EPS)) then&lt;br /&gt;
    rot2 180&lt;br /&gt;
    _nTrans = _nTrans + 1&lt;br /&gt;
endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Script interface ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_dialog `Paramètres personnalisés`,444,266&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Checkbox (texte cliquable) ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ui_infield{3} &amp;quot;bool-parameter&amp;quot;, 240, 30, 110, 15,&lt;br /&gt;
7, &amp;quot;&amp;quot;,&lt;br /&gt;
2,&lt;br /&gt;
1, 20, 20, 20, 20,&lt;br /&gt;
0, &amp;quot;Texte&amp;quot;, 0,&lt;br /&gt;
1, &amp;quot;Texte&amp;quot;, 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Liste de polices ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dim fontnames[]&lt;br /&gt;
n = REQUEST (&amp;quot;FONTNAMES_LIST&amp;quot;, &amp;quot;&amp;quot;, fontnames)&lt;br /&gt;
ui_outfield `Police`,		10, 14, 100, 15 &lt;br /&gt;
ui_custom_popup_infield &amp;quot;sampleName&amp;quot;, 	115, 10, 150, 20,&lt;br /&gt;
	0, 0, 1, &amp;quot;&amp;quot;, fontnames&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Macros ==&lt;br /&gt;
=== Suis-je une macro ? ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nameM=&amp;quot;&amp;quot;&lt;br /&gt;
sts=REQUEST(&amp;quot;name_of_main&amp;quot;,&amp;quot;&amp;quot;,nameM)&lt;br /&gt;
IF NOT(nameM=&amp;quot;&amp;quot;) THEN&lt;br /&gt;
  PRINT nameM+&amp;quot; is CALLing me!&amp;quot;&lt;br /&gt;
ELSE&lt;br /&gt;
  PRINT &amp;quot;I am free!&amp;quot;&lt;br /&gt;
ENDIF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Mathématiques ==&lt;br /&gt;
=== Comparaisons ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ABS( A - B )&amp;gt;EPS   ! A&amp;lt;&amp;gt;B&lt;br /&gt;
ABS( A - B )&amp;lt;EPS   ! A=B&lt;br /&gt;
A - B &amp;lt; EPS        ! A&amp;lt;=B&lt;br /&gt;
A - B &amp;lt; -EPS       ! A&amp;lt;B&lt;br /&gt;
B - A &amp;gt; EPS        ! A&amp;lt;B&lt;br /&gt;
B - A &amp;lt; EPS        ! A&amp;gt;=B&lt;br /&gt;
B - A &amp;lt; -EPS       ! A&amp;gt;B&lt;br /&gt;
A - B &amp;gt; EPS        ! A&amp;gt;B&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Trucs &amp;amp; astuces divers ==&lt;br /&gt;
=== Transformer POLY_B{5} en PRISM_ à l'aide d'une recherche REGEX ===&lt;br /&gt;
Dans un éditeur de texte supportant les recherches REGEX (Regular Expression) :&lt;br /&gt;
&lt;br /&gt;
Chercher : &amp;lt;code&amp;gt;(?-s)^\t*poly2_b\{5\} *([0-9]+),(?s).*? 0, $&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer par : &amp;lt;code&amp;gt;PRISM_ \1, b,&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Utilisateur:Simon&amp;diff=6</id>
		<title>Utilisateur:Simon</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Utilisateur:Simon&amp;diff=6"/>
		<updated>2021-10-07T13:59:53Z</updated>

		<summary type="html">&lt;p&gt;Simon : Page créée avec « Consultez le [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wi... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Consultez le [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wiki.&lt;br /&gt;
&lt;br /&gt;
== Pour démarrer ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste des paramètres de configuration]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/fr Questions courantes sur MediaWiki]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Apprendre comment lutter contre le pourriel dans votre wiki]&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.archi-cadlink.fr/index.php?title=Accueil&amp;diff=5</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="http://wiki.archi-cadlink.fr/index.php?title=Accueil&amp;diff=5"/>
		<updated>2021-10-07T13:59:42Z</updated>

		<summary type="html">&lt;p&gt;Simon : Contenu remplacé par « == GDL == * Code snippet »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GDL ==&lt;br /&gt;
* [[Code snippet]]&lt;/div&gt;</summary>
		<author><name>Simon</name></author>
		
	</entry>
</feed>