GeoLicia

Divers

Un interpréteur de scripts est intégré à GeoLicia.

Les scripts permettent d'automatiser des constructions (macros) ou de faire des tests sur la figure (parallélisme, orthogonalité, ...)

La syntaxe est sensible à la casse. Les commandes sont en minuscules.

Voici quelques exemples.

Crée le milieu de deux points Construit le cercle passant par trois points Teste si un point est sur une droite
import GPoint

import GPoint

milieu de [#1#2]

export LAST

import GPoint|un point du cercle

import GPoint|un deuxième point du cercle

import GPoint|un troisième point du cercle

ifexists Point #1 & Point #2 & Point #3

{invisible} @10000= mediatrice de [#1#2]

{invisible} @10001= mediatrice de [#2#3]

@10002=intersection(0) de @10000 et de @10001

@10003= cercle de centre @10002 passant par #1

export @10000 @10001 @10002 @10003

endif

return

import GPoint

import GDroite

projection de #1 sur #2

iflikepoint LAST=#1

return true

endif

return false

Commandes :

1. Imports, exports d'objets.

return [chaine]

Termine le script en renvoyant l'argument optionnel chaine.

export obj1 obj2 obj3 ...

Exporte des objets créés et termine le script.

Les objets créés dans le scripts sont détruits à la fin de son exécution. Pour que les objets subsistent, il faut les exporter.

Il faut bien prendre garde lorsqu'on exporte un objet d'exporter aussi les objets qui le définissent (et dans le bon ordre).

Le nom des objets à exporter doit commencer par le caractère spécial @.

import <type>[|message]

Attend que l'utilisateur clique sur un objet du type souhaité. L'objet est alors nommé #1, #2, #3, ... selon l'ordre d'apparition de la commande import dans le script.

On peut éventuellement définir un message qui renseigne l'utilisateur sur la nature de l'objet à sélectionner

<type> peut être :

  • GPoint : pour un point
  • GDroite : pour une droite
  • GDemidroite : pour une demi-droite
  • GSegment : pour un segment
  • GCercle : pour un cercle

2. Les tests

Toutes les instructions de test suivent la syntaxe suivante :

if<instr> <condition>

(instruction si la condition est vérifiée)

endif

ifexists <type> nomobj

<instr>

endif

<instr> ne sera executé qui si des objets de type donné <type> portant les noms nomobj existent.

Cela permet d'éviter d'utiliser des objets qui n'ont pas été définis ou qui ont été détruits.

Les types pour <type> sont :

  • Point
  • Droite
  • Segment

On peut utiliser les opérateurs logiques & (et), | (ou) et ! (non) et des parenthèses.

Exemple :

ifexists Point A & Point B & Point C

if exists (Segment [AB] | Droite (AB)) & Point C & !(Point D)

iflikepoint p1=p2

<instr>

endif

Teste si les deux points p1 et p2 sont identiques, même s'ils ont été définis différemment.

Comme pour ifexists, on peut utiliser des opérateurs logiques.

iflike obj

<instr>

endif

Teste s'il existe un objet identique à obj qui doit être un point, une droite, un segment ou un cercle.

Comme pour ifexists, on peut utiliser des opérateurs logiques.

3. Création d'objets

Les objets sont créés temporairement, le temps de l'exécution du script. Il ne sont pas affichés à l'écran. Pour créer définitivement un objet, il faut utiliser la commande export.

Pour ne pas interférer avec des objets déjà créés, les objets nouvellement créés doivent avoir pour nom @10000, @10001, @10002, ... tous commençant par le caractère spécial @.

On peut aussi omettre le nom des objets dans leur définition. On y fait alors référence par l'indicateur spécial LAST pour le dernier objet créé ou LAST(1) pour l'avant dernier, LAST(2) pour l'antépénultième (avant-avant-dernier), etc...

Objets de base

Point nom(x,y) [sur obj]

Crée un point, éventuellement lié à un objet (droite, segment, cercle). Lorsque le point est lié à une droite, obj est le nom de la droite. Lorsque le point est lié à un segment, obj est du type [p1p2]. Dans le cas d'un cercle, cercle nom_du_cercle.

Les coordonnées peuvent être ajustées pour être sur l'objet.

Exemple :

Point A(50,100)

Point B(10,10) sur d

Point C(50,60) sur [AB]

Point D(60,70) sur cercle @10

nom=droite (p1p2)

Crée la droite passant par les points p1 et p2. La droite est nommée nom.

Exemple :

Point A(50,100)

Point B(10,10)

d= droite (AB)

nom=segment [p1p2]

Crée le segment d'extrémités les points p1 et p2.

Exemple :

Point A(50,100)

Point B(10,10)

@10000= segment[AB]

nom=demi-droite [p1p2)

Crée la demi-droite d'origine p1 et qui passe par p2.

Exemple :

Point A(50,100)

Point B(10,10)

@10000= demi-droite [AB)

nom= cercle de centre <c> passant par <p>

Crée un cercle.

Exemple :

@10000= cercle de centre A passant par B

nom= cercle de diametre [p1p2]

Crée un cercle de diamètre donné

Exemple :

@10000= cercle de diametre [AB]

Objets construits

nom= droite perpendiculaire a <d> passant par <p>

Exemple :

@10000= droite perpendiculaire a d passant par A

nom= droite parallele a <d> passant par <p>

Exemple :

@10000= droite parallele a d passant par A

nom= mediatrice de [p1p2]

Exemple :

@10000= mediatrice de [AB]

nom= bissectrice de p1p2p3

Exemple :

@10000= bissectrice de ABC

nom= milieu de [p1p2]

Exemple :

I= milieu de [AB]

nom= homothetie de <p> de centre <c> et de facteur <f>

Exemple :

@10000= homothetie de A de centre O et de facteur -0.25

nom= symetrie(<obj>) de <p>

Symétrie centrale ou axiale selon que obj est une droite ou un point.

Exemple :

@10000= symetrie(O) de A

@10001= symetrie(d) de A

nom= projection de <p> sur <d>

Projection orthogonale sur une droite. <d> peut être une droite, un segment ou une demi-droite. Dans tous les cas, on considère la projection sur la droite.

Exemple :

@10000= projection de A sur d

nom= translation de <p> de vecteur <p1p2>

Exemple :

C= translation de D de vecteur AB

nom= intersection(0|1) de obj1 et de obj2

Intersection entre deux objets. Lorsque plusieurs intersections sont possibles (avec des cercles), on les distingue en précisant 0 ou 1 entre les parenthèses.

Les objets peuvent être : droite, segment, demi-droite, cercle.

Exemple :

@10000= intersection(0) de d et de d'

@10001= cercle de centre A passant par B

@10002= intersection(0) de d et de @10001

@10003= intersection(1) de d et de @10002

Attributs

On peut faire précéder la définition d'un objet par des attributs, notés entre accolades.

  • {invisible}
  • {epais}
  • {plein}
  • {tiretlong}
  • {pointille}
  • {tiretpointille}
  • {tiretcourt}
','|'); $i=0; while ($invalide[$i]) { $str1 = strtr($str1, $invalide[$i], '_'); $i++; } return $str1; } // Configuration //Modification 03/02/2010 : faille depuis $_GET['url_hit'] /* if (file_exists($kietu['url_hit'].'config.php')) { require ($kietu['url_hit'].'config.php'); } if (file_exists($kietu['url_hit'].'define/moteur.php')) { require ($kietu['url_hit'].'define/moteur.php'); } */ require("./kietu/config.php"); require("./kietu/define/moteur.php"); //Fin modif 03/02/2010 // Verification cookie if ($kietu['cookie']!=1) { // Fonctions (Telechargées sur www.phpapps.org / Créées pas samsauce@lycos.fr / Modifiées) function kie_systeme($agent) { if (eregi('(win|windows) ?(9x ?4\.90|Me)', $agent)) return 14; if (eregi('(win|windows) ?(98)', $agent)) return 19; if (eregi('(win|windows) ?(2000)', $agent)) return 17; if (eregi('(win|windows) ?(95)', $agent)) return 18; if (eregi('(win|windows) ?(NT)', $agent)) { if (eregi('(win|windows) ?NT ?(5\.1|6(\.0)?)', $agent)) return 15; if (eregi('(win|windows) ?NT ?(5(\.0)?)', $agent)) return 17; return 16; } if (eregi('(win|windows) ?XP', $agent)) return 15; if (eregi('(win|windows)', $agent)) return 13; if (eregi('(linux)', $agent)) return 12; if (eregi('SunOs', $agent)) return 10; if (eregi('(freebsd|openbsd|netbsd)', $agent)) return 9; if (eregi('(AIX)', $agent)) return 8; if (eregi('(QNX)', $agent)) return 21; if (eregi('(HP-UX)', $agent)) return 7; if (eregi('(IRIX)', $agent)) return 6; if (eregi('(unix|x11)', $agent)) return 5; if (eregi('(mac|ppc)', $agent)) return 4; if (eregi('beos', $agent)) return 3; if (eregi('os/2', $agent)) return 2; if (eregi('(bot|google|slurp|scooter|spider|infoseek|arachnoidea|altavista)', $agent)) return '01'; if (eregi('tv', $agent)) return 20; return 0; } function kie_navigateur($agent) { $kie_liste_navigateurs=array('5'=>'Amaya','6'=>'AOL','7'=>'AvantGo','8'=>'Bluefish','9'=>'Dillo','10'=>'Galeon','11'=>'iCab','12'=>'ICEBrowser','13'=>'Konqueror','14'=>'Lynx','15'=>'Opera','16'=>'Oregano','17'=>'WebTv','18'=>'Wget','19'=>'Safari','20'=>'Kanari'); for ($kie_i=5, $kie_type_navigateur='';$kie_i<=19;$kie_i++) if (eregi($kie_liste_navigateurs[$kie_i] . '[ \/]([0-9\.]+)', $agent, $kie_version)) return $kie_i.'**'.$kie_version[1]; if (eregi('MSIE[ \/]([0-9\.]+)', $agent, $kie_version)) return '4**'.$kie_version[1]; if (eregi('Mozilla/([0-9.]+)', $agent, $kie_version) && !eregi('compatible', $agent)) { if (eregi('netscape[[:alnum:]]*[/\ ]([0-9.]+)', $agent, $kie_version)) return '2**'.$kie_version[1]; if (eregi('rv:([0-9.]+)', $agent, $kie_version) || eregi('[^[]]m([0-9.]+)',$agent, $kie_version)) return '3**'.$kie_version[1]; return '2**'.$kie_version[1]; } if (eregi('(bot|google|slurp|scooter|spider|infoseek|arachnoidea|altavista)', $agent)) return '1**0'; return '0**0'; } // Initialisation de mySQL mysql_connect($kietu_mysql_address,$kietu_mysql_user,$kietu_mysql_pass) or die('Connexion impossible.'); mysql_select_db($kietu_mysql_database) or die('Erreur connexion à la BDD'); $kietu['http_referer']=mysql_real_escape_string($_SERVER['HTTP_REFERER']); $kietu['referimg']=mysql_real_escape_string($_GET['referimg']); $kietu['php_self']=mysql_real_escape_string($_SERVER['PHP_SELF']); $kie_heure=date('Y-m-d', mktime(date('H') + $kie_decalage)); $kie_heure2=date('H', mktime(date('H') + $kie_decalage)); // Navigateur $kie_browser=kie_navigateur($kietu['http_user_agent']); $kie_browser=explode('**',$kie_browser); $kie_browser_type=mysql_real_escape_string($kie_browser[0]); $kie_browser_ver=mysql_real_escape_string(strtr($kie_browser[1],'.','')); // OS $kie_os=mysql_real_escape_string(kie_systeme($kietu['http_user_agent'])); // Requete de verification $kietu['website']=substr($kietu['website'], 0, 10); $kie_temp=$kietu['remote_addr']; $kie_temp2=mysql_real_escape_string($kietu['website']); $kie_query='SELECT id FROM kietu_visit WHERE site=\''.$kie_temp2.'\' AND nav=\''.$kie_browser_type.'\' AND navver=\''.$kie_browser_ver.'\' AND sys=\''.$kie_os.'\' AND date=\''.$kie_heure.'\' AND LEFT(ip,9)=\''.substr($kie_temp,0,9).'\' LIMIT 1'; $kie_result=mysql_query($kie_query) or die('Erreur controle visiteur deja passé'); $kie_nbr_enr=mysql_num_rows($kie_result); // Envoi dans les BDD selon le résultat if ($kie_nbr_enr==0) { // Référant if ($kietu['appel']=='img') { $kietu_temp=str_replace('**','?',$kietu['referimg']); $kie_refer=str_replace('*','&',$kietu_temp); if ($kie_refer=='') { $kie_refer='Inaccessible (appel du script par une image)'; } } else { $kie_refer=$kietu['http_referer']; } $kietu_temp=parse_url($kie_refer); $kie_from=$kietu_temp['host'].$kietu_temp['path']; $kie_from=mysql_real_escape_string(substr($kie_from,0,strrpos($kie_from,'/'))); if($kie_from=='') { $kie_from='Lien direct'; } if (is_array($kietu_ref_a_ignorer)) { while(list($kie_key, $kie_value)=each($kietu_ref_a_ignorer)) { $kie_temp2=parse_url($kie_value); if ($kietu_temp['host']==$kie_temp2['host']) { $kie_from='Ignoré'; } } } else { $kie_temp2=parse_url($kie_ref_a_ignorer); if ($kietu_temp['host']==$kie_temp2['host']&$kietu_temp!='') { $kie_from='Ignoré'; } } // Insertion BDD n°1 (kietu_visit) $kie_temp=mysql_real_escape_string($kietu['remote_addr']); $kie_temp2=mysql_real_escape_string($kietu['website']); $kie_query='INSERT INTO kietu_visit (site, ip, nav, navver, refer, sys, date) VALUES (\''.$kie_temp2.'\', \''.$kie_temp.'\',\''.$kie_browser_type.'\', \''.$kie_browser_ver.'\', \''.$kie_from.'\', \''.$kie_os.'\', \''.$kie_heure.'\')'; $kie_result=mysql_query($kie_query) or die('Erreur insertion dans la BDD'); $kie_id=mysql_insert_id(); // Recherche du domaine $kie_temp=@gethostbyaddr($kietu['remote_addr']); $kie_domaine=mysql_real_escape_string(strtolower(strrchr ($kie_temp, '.'))); if ($kie_temp==$kietu['remote_addr']) { $kie_domaine='IP'; } // Insertion BDD n°2 (kietu_domai) $kie_temp2=mysql_real_escape_string($kietu['website']); mysql_query('UPDATE kietu_domai SET nombre=nombre + 1 WHERE site=\''.$kie_temp2.'\' AND domaine=\''.$kie_domaine.'\' AND date=\''.$kie_heure.'\' LIMIT 1'); if(mysql_affected_rows()==0) { mysql_query('INSERT INTO kietu_domai (site, domaine, nombre, date) values (\''.$kie_temp2.'\', \''.$kie_domaine.'\', 1,\''.$kie_heure.'\')') or die('Erreur insertion domaines'); } } // Page demandée + Insertion BDD n°3 (kietu_pages) if ($kietu['appel']=='img') { $kie_dem=parse_url($kietu['http_referer']); } else { $kie_dem=parse_url($kietu['php_self']); } $kie_request=$kie_dem['path'].$kie_dem['query']; $masque='^([[:alnum:]/_\.-]*)index.([[:alpha:]])+$'; if (ereg($masque,$kie_request,$recup)==true) { if ($recup[1]=='') { $kie_request='/'; } else { $kie_request=$recup[1]; } } if (isset($kietu['psefra']) & $kietu['psefra']!='') { $kie_request .=' '.htmlspecialchars($kietu['psefra']); } $kie_request=substr($kie_request,0,50).mysql_real_escape_string($_GET['page']); $kie_temp2=$kietu['website']; mysql_query('UPDATE kietu_pages SET nombre=nombre+1 WHERE site=\''.$kie_temp2.'\' AND pages=\''.$kie_request.'\' AND date=\''.$kie_heure.'\' LIMIT 1'); if(mysql_affected_rows()==0) { mysql_query('INSERT INTO kietu_pages (site, pages, nombre, date) values (\''.$kie_temp2.'\', \''.$kie_request.'\', 1,\''.$kie_heure.'\')') or die('Erreur insertion pages'); } // Page par heure + Insertion BDD n°4 (kietu_heure) $kie_temp2=mysql_real_escape_string($kietu['website']); mysql_query('UPDATE kietu_heure SET '.$kie_heure2.'_h='.$kie_heure2.'_h + 1 WHERE site=\''.$kie_temp2.'\' AND date=\''.$kie_heure.'\' LIMIT 1'); if(mysql_affected_rows()==0) { mysql_query('INSERT INTO kietu_heure (site, date, '.$kie_heure2.'_h) values (\''.$kie_temp2.'\', \''.$kie_heure.'\', 1)') or die('Erreur insertion heure'); } // Mots-clés + Insertion BDD n°5 (kietu_motcl) function kie_trouver_motcle($chaine,$cle) { parse_str($chaine); if (isset($$cle)) { return $$cle; } } $kie_temp=parse_url($kie_refer); while(list($key,$value)=each($kie_moteur)) { if(eregi($key,$kie_temp['host'])) { if (is_array($value[1])) { while (list($key2,$value2)=each($value[1])) { $kie_motcl.=kie_trouver_motcle($kie_temp['query'],$value2); } } else { $kie_motcl.=kie_trouver_motcle($kie_temp['query'],$value[1]); } $kie_motcl=rawurldecode($kie_motcl); if ($kie_motcl<>'') { mysql_query('INSERT INTO kietu_motcl (id, keywords) values ('.$kie_id.',\''.mysql_real_escape_string($kie_motcl).'\')') or die ('Erreur insertion mots clés'); break; } } } // Archivage automatique if($kietu['archivageauto']==1) { $mois=date("n"); $annee=date("Y"); if($mois=="1") { $mois="12"; $annee--; } else { $mois--; } $sit=$kie_temp2; $result=mysql_query('DELECT ID FROM kietu_archive WHERE mois='.$mois.' AND annee='.$annee.' AND site=\''.$sit.'\''); if (mysql_num_rows($result)==0) { include("modules/fonction_archive.php"); archivage($mois,$annee,$sit); } } mysql_close(); } // Affichage logo/texte if ($kietu['appel']=='img') { header ('Location: media/kietu.gif'); } elseif ($kietu_aff_logo==1) { echo 'Statistiques générées par Kietu? / Script PHP gratuit / http://www.kietu.net'; } elseif ($kietu_aff_text==1) { echo ''.$kie_text.''; } else { echo ''; } ?>