Projet

Général

Profil

« Précédent | Suivant » 

Révision 0bd646e4

ID0bd646e44064921316fc51262ea66c40f172c76b
Parent 6b16425b
Enfant 862d44f8

Ajouté par Victor PONGNIAN il y a plus de 10 ans

remise en forme du travail de Victor Pongnian suit à son stage
Il reste pas mal de cosmétique à revoir mais le système devrait déjà être utilisable dans l'état.

Fichiers

  • ajouté
  • modifié
  • copié
  • renommé
  • supprimé

Voir les différences

Révisions

.htaccess
1
AddDefaultCharset UTF-8
2
php_value output_buffering off
3
php_value display_errors on
4
php_value error_reporting 32767
addParams.php
1 1
<!DOCTYPE html>
2 2
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
3
<head>
4
   <meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>
5
   <link rel="stylesheet" media="screen" href="css/index_style.css" />
6
   <title>Positionnerment dun panoramique</title>
3 7
<?php
4
if(isset($_GET['dir']) && isset($_GET['panorama'])){
5
	
6
	$_GET['dir'] = htmlspecialchars($_GET['dir']);              //Protection des variables GET.
7
	$_GET['panorama'] = htmlspecialchars($_GET['panorama']);    // ...
8
	
9
	if (isset($_POST['param_latitude']) && isset($_POST['param_longitude']) 
10
	&& isset($_POST['param_altitude']) && isset($_POST['param_elevation']) 
11
	&& isset($_POST['param_title']) && isset($_POST['param_loop'])) {
12
		
13
		foreach ($_POST as $value)                              //Protection des variables POST.
14
		{	
15
		    $value = htmlspecialchars($value);
16
		}
8
   // tableau de vérification de conformité
9
 $params = array('title' => array('name' => 'titre', 
10
				  'pattern' => '^.{1,50}$',
11
				  'required' => true),
12
		 'latitude' => array('name' => 'latitude', 
13
				     'type' => 'numeric',
14
				     'min' => -180,
15
				     'max' => 180,
16
				     'required' => true),
17
		 'longitude' => array('name' => 'longitude', 
18
				     'type' => 'numeric',
19
				      'min' => -180,
20
				      'max' => 180,
21
				      'required' => true),
22
		 'altitude' => array('name' => 'altitude', 
23
				     'type' => 'numeric',
24
				     'min' => -180,
25
				     'max' => 180,
26
				     'required' => true),
27
		 'loop' => array('name' => 'image_loop', 
28
				 'type' => 'boolean',
29
				 'required' => false),
30
		 'dir' => array('required' => true),
31
		 'panorama' => array('required' => true));
32
$wrong = array();
33
$values = array();
34
// vérification de la conformité
35
foreach($params as $param => $check) {
36
  if (isset($_REQUEST['param_'.$param])) {
37
    $tst = $_REQUEST['param_'.$param];
38
    if ((isset($check['min']) || isset($check['max'])) && ! is_numeric($tst)) $wrong[$param] = "<em>$tst</em> ne correspond pas à une valeur numérique";
39
    else if (isset($check['min']) && $tst < $check['min']) $wrong[$param] = "<em>$tst</em> trop bas";
40
    else if (isset($check['max']) && $tst > $check['max']) $wrong[$param] = "<em>$tst</em> trop haut";
41
    else if (isset($check['pattern']) && preg_match('/'.preg_quote($check['pattern']).'/', $tst)) $wrong[$param] = "<em>$tst</em> non conforme";
42
    else $values[$param] = $tst;
43
  } else if (isset($check['required']) && $check['required']) {
44
    $wrong[$param] = '<em>$tst</em> est un paramètre manquant';
45
  }
46
}
17 47

  
18
		/* --- Vérification des inputs avec des regex. ---*/
19
	    // Pour la latitude : ( Le javascript bride entre -90 et 90)
20
	    if (preg_match("#^(\-?[1-9]+[0-9]?[.,]{0,1}[0-9]{0,6}|\-?[0-9]{1}[.,]{0,1}[0-9]{0,6})$#", $_POST['param_latitude']))
21
	    {
22
	    	$lat = $_POST['param_latitude'];
23
	        //echo 'Le ' . $_POST['param_latitude'] . ' est un numéro <strong>valide</strong> !';
24
	    }
25
	    else
26
	    {
27
	        echo 'Le ' . $_POST['param_latitude'] . ' n\'est pas valide, recommencez !';
28
	        
29
	    }
30
	    
31
	    // Pour la longitude : ( Le javascript bride entre -180 et 180)
32
	    if (preg_match("#^(\-?[1-9]+[0-9]?[.,]{0,1}[0-9]{0,6}|\-?[0-9]{0,1}[.,]{1}[0-9]{0,6})$#", $_POST['param_longitude']))
33
	    {
34
	    	$lon = $_POST['param_longitude'];
35
	        //echo 'Le ' . $_POST['param_longitude'] . ' est un numéro <strong>valide</strong> !';
36
	    }
37
	    else
38
	    {
39
	        echo 'Le ' . $_POST['param_longitude'] . ' n\'est pas valide, recommencez !';
40
	        
41
	    }
42
	    
43
	    // Pour l'altitude ( Le javascript bride entre 0 et 500)
44
	    if (preg_match("#^([1-9]+[0-9]{0,4}|0)$#", $_POST['param_altitude']))
45
	    {
46
	    	$alt = $_POST['param_altitude'];
47
	        //echo 'Le ' . $_POST['param_altitude'] . ' est un numéro <strong>valide</strong> !';
48
	    }
49
	    else
50
	    {
51
	        echo 'Le ' . $_POST['param_altitude'] . ' n\'est pas valide, recommencez !';
52
	        
53
	    }
54
	    
55
	    // Pour l'élévation  ( Le javascript bride entre -10 et 10)
56
	    if (preg_match("#^(\-?[1-9]+[0-9]?|0)$#", $_POST['param_elevation']))
57
	    {
58
	    	$ele = $_POST['param_elevation'];
59
	        //echo 'Le ' . $_POST['param_elevation'] . ' est un numéro <strong>valide</strong> !';
60
	    }
61
	    else
62
	    {
63
	        echo 'Le ' . $_POST['param_elevation'] . ' n\'est pas valide, recommencez !';
64
	        
65
	    }
66
	    
67
	    $loop = $_POST['param_loop'];   // Variable radio automatiquement présente
68
	    if(isset($lat) && isset($lon) && isset($alt) && isset($ele) && isset($loop)) {
69
 	
70
	    	// On recherche le dossier correspondant au panorama en question
71
	    	$dir_file = "/var/www/data/tsf2/vpongnian/panorama/".$_GET['dir']."/".$_GET['panorama'];
72
	    	$dir_open = opendir($dir_file);
73
	    	while (false !== ($file = readdir($dir_open))) {
74
    	               // Si on trouve bien des tuiles
75
		       if (preg_match('/(.*)_[0-9]+_[0-9]+_[0-9]+\.jpg$/', $file, $reg)) {
76
			 $prefix = $reg[1];
77
			 $new_param_file = $prefix.".params";
78
			 break;   // On sort à la première tuile trouvée
79
		       }
80
		    }
81
		    closedir($dir_open);
82
		    
83
		    $retour = "\n"; 
84
                    // On vérifie qu'on a bien crée un nouveau fichier .params et on écrit dedans.
85
		    if(isset($new_param_file)){
86
		    	$param_file = fopen($dir_file."/".$new_param_file,'a+');
87
		    	fputs($param_file,"titre = \"" . $_POST['param_title'] . "\"");
88
		    	fputs($param_file,$retour);
89
		    	fputs($param_file,"latitude = " . $lat);
90
		    	fputs($param_file,$retour);
91
		    	fputs($param_file,"longitude = " . $lon);
92
		    	fputs($param_file,$retour);
93
		    	fputs($param_file,"altitude = " . $alt);
94
		    	fputs($param_file,$retour);
95
		    	fputs($param_file,"elevation = " . $alt);
96
		    	fputs($param_file,$retour);
97
		    	fputs($param_file,"image_loop =" . $loop);
98
		    	fputs($param_file,$retour);
99
		    	fclose($param_file);
100
		    	
101
		    	echo 'Paramétrage OK. Retour au panorama';
102
		    	header("Refresh: 1; URL=index.php");  
103
		    } else {
104
		    	
105
		    	echo "<script>alert(\"impossible d'écrire dans le fichier\")</script>";
106
		    }
107
	    }
48
if (isset($values['panorama'])) {
49
  $back_url = sprintf('panorama.php?panorama=%s', $values['panorama']);
50
  if (isset($values['dir'])) $back_url .= '&amp;dir='. $values['dir'];
51
} else {
52
  $back_url = '.';
53
}
54

  
55
if (count($wrong) == 0) {
56
  // On recherche le dossier correspondant au panorama en question
57
  $dir_file = "./".$values['dir']."/".$values['panorama'];
58
  $dir_open = opendir($dir_file);
59
  while (false !== ($file = readdir($dir_open))) {
60
    // Si on trouve bien des tuiles
61
    if (preg_match('/(.*)_[0-9]+_[0-9]+_[0-9]+\.jpg$/', $file, $reg)) {
62
      $prefix = $reg[1];
63
      $new_param_file = $prefix.".params";
64
      break;   // On sort à la première tuile trouvée
65
    }
66
  }
67
  closedir($dir_open);
68
  
69
  // On vérifie qu'on a bien créée un nouveau fichier .params et on écrit dedans.
70
  if(isset($new_param_file)){
71
    $fid = fopen($dir_file."/".$new_param_file,'a+');
72
    echo '<p>Les valeurs suivantes sont utilisées.</p>'."\n";
73
    echo "<dl>\n";
74
    foreach ($values as $k => $v) {
75
      echo "$k -$v<br/>\n";
76
      if (isset($params[$k]['name'])) {
77
	$nm = $params[$k]['name'];
78
	if (isset($params[$k]['type']) && $params[$k]['type'] == 'numeric') {
79
	  $vf = $v;
80
	} else if (isset($params[$k]['type']) && $params[$k]['type'] == 'boolean') {
81
	  $vf = $v ? "true" : "false"; 
108 82
	} else {
109
		echo '<script>alert(\'$_POST manquant\')</script>';
110
		header("Refresh: 2; URL=javascript:history.back();"); 	
83
	  $vf = "\"$v\"";
111 84
	}
112
} else {
113
echo '<script>alert(\'La destinaton est manquante\')</script>';
114
header("Refresh: 2; URL=javascript:history.back();");
85
	fputs($fid, "$nm = $vf\n");
86
	printf("<dt>%s</dt>\n<dd>%s</dd>\n", $nm, $vf);
87
      }
88
    }
89
    echo "</dl>\n";
90
    fclose($fid);
91
    echo '<p class="succes">Paramétrage terminé.</p>'."\n";
92
  } else {
93
    printf("<p class=\"error\">impossible d'écrire dans le fichier '%s'</p>\n", $dir_file);
94
  }
95
 } else {
96
  echo '<p class="error">Les valeurs suivantes sont incorrectes.</p>'."\n";
97
  echo "<dl>\n";
98
  foreach ($wrong as $k => $v) {
99
    printf("<dt>%s</dt>\n<dd>%s</dd>\n", $k, $v);
100
  }
101
  echo "</dl>\n";
115 102
}
103
printf('<a href="%s">Retour au panorama</a></p>'."\n", $back_url);
116 104

  
117 105
?>
118 106
</html>
class/site_point.class.php
7 7
  private $zooms;
8 8

  
9 9
  public function __construct($dir) {
10
    // si $dir n'est pas un répertoire il ne s'agit pas d'un panorama.
11
    if (!is_dir($dir)) return;
10 12
    $this->base_dir = $dir;
11 13
    $dir_fd = opendir($this->base_dir);
12 14
  
......
80 82
    
81 83
    $e = atan2(($alt2 - $alt1)/1000 - $d*$d/(2*$rt), $d);  // angle de l'élévation en radians
82 84
    //    printf("%s, %s, %s, %s\n",$lat1, $this->params['latitude'], $lat, $dLat);
83
	
84
    return array($d, $cap*180/M_PI, $e*180/M_PI, $rapport);   // les résultats sont en degrés
85
    return array($d, $cap*180/M_PI, $e*180/M_PI);   // les résultats sont en degrés
85 86
  }
86 87
  
87 88
}
class/sites_dir.class.php
4 4

  
5 5
  public function __construct($dir) {
6 6
    $this->base_dir = $dir;
7
    }
7
  }
8 8
  
9 9
  public function get_sites() {
10
	try
11
	{
12
	    $dir_fd = opendir($this->base_dir);
13
	}
14
	catch(Exception $e)
15
	{
16
		die('Erreur : '.$e->getMessage());
17
	}
18
	     
19
 
10
    $dir_fd = @opendir($this->base_dir);
11

  
20 12
    $point_list = array();
21 13
    while (false !== ($point_dir = readdir($dir_fd))) {
22 14
      $pt = new site_point($this->base_dir.'/'.$point_dir);
......
26 18
  }
27 19
  
28 20
  public function get_dir() {
29
  	return $this->base_dir;
21
    return $this->base_dir;
30 22
  }
31

  
32 23
}
class/utils.class.php
1
<?php
2

  
3
abstract class utils {
4
  static public function init() {
5
    function __autoload($class) {
6
      $class_loc = 'class/'.$class.'.class.php';
7
      if (is_readable($class_loc)) {
8
	require_once($class_loc);
9
      }
10
    }
11

  
12
    function errorToException($code, $msg, $file, $line) {
13
      throw new Exception($msg);
14
    }
15
    set_error_handler('errorToException');
16
  }
17

  
18
}
creerPano.php
1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
2
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
3
	<head>
4
		<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>
5
		<link rel="stylesheet" media="screen" href="css/ttn_style_1.css" />
6
    	<title>creation d'un panoramique</title>
7
    	<script type="text/javascript">
8
    	
9
		function showLoad(outgoingLink){
10
 
11
		var link = document.getElementById(outgoingLink);
12
		var loader = document.createElement('img');
13
		loader.id = 'loader';
14
		loader.src ='images/loader2.gif';
15
		var li = link.parentNode;
16
		li.appendChild(loader);
17
		}
18
    	</script>
19
    </head>
20
    <body>
21
	    <img id="top" src="images/top.png" alt="">
22
		<div id="page_container">
23
		    <h1><img src="images/tetaneutral.png"></h1>
24
		  	<h2>Listes des photos sur le serveur</h2> 
25
		  	<p>Cliquez pour générer un panorama</p>  
26
       		<div id="containerList">
27
		    	<ul>
28
		    	
29
	       		<?php
30
                        
31
	       		$base_dir = "/var/www/data/tsf2/vpongnian/panorama/upload/"; // modifier selon l'arborescence.
32
				    try
33
					{
34
                                            // On ouvre le dossier ou se trouve les images
35
					    $dir_fd = opendir($base_dir); 
36
					    
37
					    $i=0;         // Garantir l'unicité du id des liens.
38
					    while (false !== ($image_name = readdir($dir_fd))) {
39
					    	$dir = $base_dir.$image_name;   
40
					    	
41
							if ($image_name != "." && $image_name != "..")   // N'affiche pas les répertoires parents et courant.
42
							{
43
							     printf('<li><a href="genererPano.php?name=%s" id="link_'.$i.'" onclick="showLoad(this.id);return true;">%s</a></li>'."\n",$image_name,$image_name);
44
							     $i++; 
45
							}  
46
							      
47
					        	
48
					    }
49
					}
50
					catch(Exception $e)
51
					{
52
						die('Erreur : '.$e->getMessage());
53
					} 
54
	       		?>
55
       			</ul>
56
    		</div>
57
    		<div id="footer"><a href="./index.php">Retour à l'index</a></div>
58
			
59
    	</div>
60
    	<img id="bottom" src="images/bottom.png" alt="">
61
    </body>
62
</html>
css/index_style.css
1
	body
2
	{
3
		
4
		background:#44F;
5
		font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif;
6
		font-size:small;
7
		margin:8px 0 16px;
8
		text-align:center;
9
		overflow:auto;
10
		
11
	}
12
	
13
	#top
14
	{
15
		display:block;
16
		height:10px;
17
		margin:10px auto 0;
18
		width:650px;
19
	}
20
	
21
	div#index_container
22
	{
23
		background:#fff;
24
		
25
		margin: auto;
26
		text-align:left;
27
		width:640px;
28
	}
29
	
30
	div#index_container h2 {
31
		margin:1.05em;
32
		text-shadow: 0.1em 0.1em 0.15em #44F; 
33
	}
34
	#bottom
35
	{
36
		display:block;
37
		height:10px;
38
		margin:0 auto;
39
		width:650px;
40
	}
41
	
42
	h1
43
	{
44
		background-color:#6699CC;
45
		margin:0;
46
		min-height:0;
47
		padding:0;
48
		text-decoration:none;
49
		text-align: center;
50
		
51
	}
52
	
53
	h1 a
54
	{
55
		
56
		display:block;
57
		height:100%;
58
		min-height:40px;
59
		
60
	}
61
	
62
	h1 img
63
	{
64
		margin-top: 8px;
65
	}
66
	
67
	img
68
	{
69
		/*behavior:url(css/iepngfix.htc);*/
70
		border:none;
71
	}
72
	
73
	div#containerList
74
	{
75
		margin:20px 20px 0;
76
		padding:0 0 20px;
77
	}
78
	
79
	#containerList
80
	{
81
		font-family:Lucida Grande, Tahoma, Arial, Verdana, sans-serif;
82
		
83
	}
84
	
85
	#containerList li
86
	{
87
		width:100%;
88
		margin:1.05em;
89
		font-size:14px;
90
		
91
	}
92
	
93
	div#containerList ul
94
	{
95
		font-size:100%;
96
		list-style-type:circle;
97
		margin:0;
98
		padding:0;
99
		width:100%;
100
	}
101
	
102
	div#interaction {
103
		background-color:#fff;
104
		margin: auto;
105
		width:640px;
106
		border-top: 2px dotted #44F;
107
	}
108
	
109
	div#interaction li{
110
	
111
		display:inline-block;
112
		list-style-type:none;
113
		margin:1.08em;
114
	
115
	}
116
	
117
	div#interaction li a{
118
	
119
	    color:#3F2DFF;
120
	    text-decoration:none;
121
	    font-size:16px;
122
    }
123
	 
124
	div#interaction li a:hover {
125
		color:#FF9900;
126
		text-decoration:underline;
127
	}
128
	
129
	
130
	
131
	p a {
132
		background-color:#fff;
133
		border-radius: 4px;
134
		padding:3px;
135
		text-shadow: 0.1em 0.05em 0.15em #444; 
136
		font-size:11px;
137
	}
1
* {
2
    margin:0;
3
    padding:0;
4
    font-family:Arial, Verdana, sans-serif;
5
}
6

  
7
body {
8
    background-color:#44F;
9
    text-align:center;
10
    width:50rem;
11
    margin:auto;
12
}
13

  
14
header {
15
    margin:1rem 0;
16
    box-shadow:0 0 0.5rem 0 #000;
17
    background-color:#69C;
18
}
19

  
20
h1 {
21
    text-align:center;
22
    padding:0.2rem;
23
}
24

  
25
img {vertical-align:middle}
26

  
27
h2 {
28
    padding:0.5em 1em;
29
    text-shadow: 0.1em 0.1em 0.15em #44F; 
30
}
31

  
32
#main {
33
    box-shadow:0 0 0.5rem 0 #000;
34
    text-align:left;
35
    background-color:#FFF;
36
}
37

  
38
#main a {text-decoration:none}
39

  
40
#pano-list li samp:after {
41
    padding-left:1em;
42
    content:'fichier non configuré';
43
    font-weight:bold;
44
    color:#F00;
45
}
46
#pano-list li {
47
    list-style-type:circle;
48
    list-style-position:inside;
49
    border:dashed #777 0;
50
    border-top-width:0.1em;
51
    padding:0.3em 1em;
52
}
53

  
54
#pano-list li:nth-child(6n),
55
#pano-list li:nth-child(6n+1),
56
#pano-list li:nth-child(6n+2) {
57
    background-color:#FFE;
58
}
59

  
60
#pano-list li:nth-child(6n+3),
61
#pano-list li:nth-child(6n+4),
62
#pano-list li:nth-child(6n+5) {
63
    background-color:#FEF;
64
}
65

  
66
#interaction {
67
    text-align:center;
68
    border:solid #777 0;
69
    border-top-width:0.1em;
70
    padding:0.5em 0;
71
}
72

  
73
#interaction a {
74
    padding:1em;
75
}
76

  
77
#interaction a:hover {
78
    color:#F90;
79
    text-decoration:underline;
80
}
81

  
82
footer {
83
  margin:1rem 0
84
}
85

  
86
.validators a {
87
    background-color:#fff;
88
    border-radius: 0.4rem;
89
    padding:0.3ex;
90
    text-shadow: 0.1em 0.05em 0.15em #444; 
91
}
css/map.css
1 1
* {
2
    font-family:Arial, Verdana, sans-serif;
2 3
    padding:0;
3 4
    margin:0;
4 5
}
......
49 50
    cursor:default;
50 51
}
51 52

  
52
fieldset#control {
53
    text-shadow:2px 2px 2px #000, -2px -2px 2px #000;
54
    color:#FFF;
55
    float:left;
56
    position:absolute;
57
    top:1em;
58
    left:2em;
59
    background-color:rgba(128,128,128,0.5);
60
    border:solid #F00 1px;
61
    border-radius:0.5em;
62
    padding:0.2em 0.5em;
63
}
53
img {vertical-align:middle}
64 54

  
65 55
input {
66 56
    vertical-align:middle;
67 57
}
68 58

  
69

  
70 59
input[type="number"] {
71 60
    border-radius:1em;
72 61
    display:block;
73 62
    float:right;
63
    width:10ex;
74 64
}
75 65

  
76
#locadraw input[type="number"] {
77
    width:10ex;
66
input[type="submit"],
67
input[type="reset"],
68
input[type="button"] {
69
    border-radius:0.4rem;
70
    padding:0.2em 1em;
71
    margin:0.2em;
78 72
}
79 73

  
80
#res>:not(ul), #control, #params, #info ,#addParams ,#adding, #loca{
81
    user-select:none;
82
    -khtml-user-select:none;
83
    -o-user-select:none;
84
    -moz-user-select:-moz-none;
85
    -webkit-user-select:none;
74
input[type="checkbox"] {
75
    margin:0 1em;
86 76
}
87 77

  
88
div#params {
89
    padding:0.2em 1.3em;
78
#params {
79
    padding:0.2em 0.5em;
90 80
    border-radius:0.5em;
91 81
    background-color:rgba(128,128,128,0.5);
92 82
    border:solid #00F 1px;
93 83
    position:absolute;
94 84
    top:1em;
95 85
    right:2em;
96
    float:right;
86
    min-width:10em;
87
    color:#FFF;
97 88
}
98 89

  
99
div#params em {
100
	
90
#params em {	
101 91
    display:block;
102 92
    float:right;
103 93
    background-color:#88F;
104 94
    border-radius:0.5em;
105 95
    padding:0 0.5em;
106
    color:#FFF;
107
}
108

  
109
div#params em:nth-child[2] {
110
    display:inline;
96
    color:#FF0;
111 97
}
112 98

  
113
span#loca{
114
	text-shadow:2px 2px 2px #000, -2px -2px 2px #000;
99
#loca_show {
100
    text-shadow:2px 2px 2px #000, -2px -2px 2px #000;
115 101
    color:#FFF;
116 102
    float:left;
117 103
    position:absolute;
......
122 108
    padding:0 1em; 
123 109
}
124 110

  
125

  
126
div#addParams  {
127
	text-shadow:2px 2px 2px #000, -2px -2px 2px #000;
111
#addParams {
112
    text-shadow:2px 2px 2px #000, -2px -2px 2px #000;
128 113
    color:#FFF;
129
    float:left;
130 114
    position:absolute;
131 115
    top:1em;
132 116
    right:2em;
133
    
134 117
    border:solid #F00 1px;
135 118
    border-radius:0.5em;
136 119
    padding:0.2em 0.5em;
137 120
    background-color:#F88; 
138
    padding:0 1em; 
139
   
121
    padding:0 1em;
140 122
}
141 123

  
142
div#addParams label {
143
        
124
#addParams label {
144 125
    border-radius:0.5em;
145 126
    padding:0 1em;
146 127
}
147 128

  
148
div#addParams label:hover {
149
	 color: #FF0; 
150
     
129
#addParams label:hover {
130
    color: #FF0; 
151 131
}
152 132

  
153
fieldset#locadraw {
154
    
133
fieldset {
134
    border:solid #F00 1px;
135
    border-radius:0.5em;
136
    padding:0 0.5em;
155 137
    color:#FFF;
156
    float:left;
157 138
    position:absolute;
139
    background-color:rgba(128,128,128,0.5);
140
}
141

  
142
fieldset#control {
143
    top:1em;
144
    left:2em;
145
    padding:0.2em 0.5em;
146
}
147

  
148

  
149
fieldset#locadraw {
158 150
    bottom:1em;
159 151
    left:1em;
160
    background-color:rgba(128,128,128,0.5);
161
    border:solid #F00 1px;
162
    border-radius:0.5em;
163
    padding:0 1em;
164 152
    visibility:hidden;
153
    min-width:10em;
165 154
}
166 155

  
167 156
fieldset#adding {
168
    
169
    color:#FFF;
170
    float:left;
171
    position:absolute;
172 157
    top:1em;
173 158
    right:2em;
174
    background-color:rgba(128,128,128,0.5);
175
    border:solid #F00 1px;
176
    border-radius:0.5em;
177
    padding:0 1em;
178 159
    visibility: hidden;
179 160
}
180 161

  
181

  
182

  
183
form#form_param label {
184
	
185
    margin-right: 15px;
186
    width: 0.5em;
187
    padding:0.3em 0.5em;
188
    min-height: 1px;
189
    text-align: left;
162
#form_param label {	
190 163
    text-shadow:2px 2px 2px #000, -2px -2px 2px #000;
191 164
}
192 165
 
193 166

  
194 167
input:focus {
195
  border-color: rgba(82, 168, 236, 0.75);
196
  -moz-box-shadow: 0 0 8px rgba(82, 168, 236, 0.5);
197
  -webkit-box-shadow: 0 0 8px rgba(82, 168, 236, 0.5);
198
  box-shadow: 0 0 8px rgba(82, 168, 236, 0.5);
199
}
200
 
201
.correct {
202
  border-color: rgba(68, 191, 68, 0.75);
168
  background-color:#004;
169
  color:#FFF;
170
  border-color:#F00;
203 171
}
204 172
 
205
.correct:focus {
206
  border-color: rgba(68, 191, 68, 0.75);
207
  -moz-box-shadow: 0 0 8px rgba(68, 191, 68, 0.5);
208
  -webkit-box-shadow: 0 0 8px rgba(68, 191, 68, 0.5);
209
  box-shadow: 0 0 8px rgba(68, 191, 68, 0.5);
210
}
211
 
212
.incorrect {
213
  border-color: rgba(191, 68, 68, 0.75);
214
}
215
 
216
.incorrect:focus {
217
  border-color: rgba(191, 68, 68, 0.75);
218
  -moz-box-shadow: 0 0 8px rgba(191, 68, 68, 0.5);
219
  -webkit-box-shadow: 0 0 8px rgba(191, 68, 68, 0.5);
220
  box-shadow: 0 0 8px rgba(191, 68, 68, 0.5);
221
} 
222

  
223
/*p#chsignInfo {
224
color:#F00;
225
font-size: 12px;
226
margin:1.02em 1em;
227
background-color: #CCC;
228
border-radius: 4px;
229
padding:2px;
230
}*/
231

  
232
.answer {
233
  margin:0.2em 0;
234
  display:block;
235
}
236

  
237
.answer input {
238
  border-radius:0.5rem;
239
  padding:0.2em 0.7em;
240
}
241

  
242
.form_button {
243
    background-color:rgba(128,128,128,0.9);
244
    /*background: url(button.png) no-repeat top;*/
245
    display:inline-block;
246
}
247

  
248 173
.validators {
249 174
    text-align:center;
250
    background-color:#CCC;
175
    background-color:rgba(50%,50%,50%,0.5);
251 176
    border:solid 1px #F55;
252
    border-width:0 0 1px 0;
253
    display:none;
177
    border-radius:0.5em;
178
    border-width:1px;
179
    position:absolute;
180
    bottom:1em;
181
    left:45%;
182
    padding:0.2em 0.5em;
183
    font-size:80%;
254 184
}
255 185

  
186
.validators img {height:1em}
187

  
256 188
#res {
257 189
    padding:0.2em 0.4em;
258 190
    color:#FF8;
......
263 195
    border:solid #FFF 1px;
264 196
}
265 197

  
266
#res:empty {padding:0;}
198
#res:empty {display:none}
267 199

  
268 200
#res li {
269 201
    list-style-type: none;
270 202
    color:#FFF;
271 203
    background-color:rgba(100,0,0,0.5);
272

  
273 204
}
description
1
Système de visualisateton et de parcours des panoramas via le Web.
envoyer.php
1
<?php $uid = md5(uniqid(rand())); ?>
2
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
1
<!DOCTYPE html>
3 2
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
4
	<head>
5
    	
6
    	<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>
7
    	<link type="image/x-icon" rel="shortcut icon" href="images/tsf.png"/>
8
  		<link rel="stylesheet" media="screen" href="css/view.css" />
9
    	<title>Upload d'une image sur le serveur !</title>
10
    	        <!-- suivi de l'upload par ajax. Peut être utile pour certains navigateurs qui ne renseigne pas l'avancement.
11
		<script type="text/javascript">
12
			var HttpRequestObject = false;
13
			if(window.XMLHttpRequest) {
14
			   HttpRequestObject = new XMLHttpRequest();
15
			}
16
			else if(window.ActiveXObject) {
17
			   HttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");
18
			}
19
			
20
			function startProgress(uid) {
21
			  
22
				
23
			   <!--document.getElementById('upload').style.display = 'none';-->
24
			   document.getElementById('pb_outer').style.display = 'block';
25
			   setTimeout('getProgress("' + uid + '")', 1000);
26
			  
27
			   
28
			   
29
			}
30
			function getProgress(uid) {
31
			   if(HttpRequestObject) {
32
			      HttpRequestObject.open('GET', 'getprogress.php?uid=' + uid, true);
33
			      HttpRequestObject.onreadystatechange = function() {
34
			         if(HttpRequestObject.readyState == 4 && HttpRequestObject.status == 200) {
35
			            var response = HttpRequestObject.responseText;
36
			            var elem = response.split('#');
37
			            var progress = elem[0];
38
			            var url =elem[1];
39
			            var message=elem[2];
40
			            
41
			            document.getElementById('pb_inner').style.width = progress + '%';
42
			            document.getElementById('pb_inner').innerHTML = progress + '%';
43
			           
44
			            if(progress < 100) {
45
			               
46
			               setTimeout('getProgress("' + uid + '")', 100);
47
			                
48
			            } else {
49
				            if(message !=='') {
50
				            	document.getElementById('pb_outer').style.display = 'none';
51
				            	document.getElementById('pb_inner').style.width = 'none';
52
				           		alert(message);
53
				            } else {
54
					            document.getElementById('pb_inner').innerHTML = 'Upload Complete!';
55
					            document.location.href= url; 
56
				            }
57
			            }
58
			         }
59
			      }
60
			      
61
			      HttpRequestObject.send(null);
62
			   }
63
			}
64
			
65
			function showLoader() {
66
				document.getElementById('loader').innerHTML = "Veuillez patienter ...  ";
67
				
68
				
69
			}
70
			
71
		</script>
72
	</head>
73
	<body id="main_body">
74
  		<img id="top" src="images/top.png" alt="">
75
		<div id="form_container">
76
			<h1><img src="images/tetaneutral.png"></h1>
77
		
78
	    	<form onSubmit="startProgress('<?php echo $uid; ?>');" action="uploadTest.php" method="post" class="appnitro" enctype="multipart/form-data" name="upload" id="upload" target="upload_frame">
79
				 <h2>Ajouter un nouveau panorama</h2>
80
										
81
			<ul>
82
				<li id="li_1" >
83
					<label for="file" class="description">Envoyer le fichier :</label>
84
					<div>
85
			        <input type="hidden" name="APC_UPLOAD_PROGRESS" id="progress_key" value="<?php echo $uid; ?>" />
86
			        <input type="file" name="file" id="file" />
87
			   	 	</div>  
88
				</li>
89
				
90
				<li class="buttons">
91
	        		<input type="submit" name="submit" id="submit" value="Submit" />
92
	        	</li>
93
			</ul>
94
			</form>
95
			<!-- Fin du formulaire -->
96
			<div id="footer">
97
				<a href="./index.php">Retour liste</a>
98
			</div>
99
		</div>
100
		<div id="infoSize">
101
		<img src="images/bulle.png" id="bulle"/>
102
		<label id="txtInfo">Le fichier à envoyer doit etre une image de type .tif ou .jpeg<br />
103
        Taille maximale : 300 Mo</label>
104
    	</div>
105
		<!-- Barre d'upload -->
106
		<div id="pb_outer">
107
  		<div id="pb_inner"></div>
108
  		</div>
109
  		<p id="info"></p>
3
  <head>
4
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>
5
    <link type="image/x-icon" rel="shortcut icon" href="images/tsf.png"/>
6
    <link rel="stylesheet" media="screen" href="css/view.css" />
7
    <title>Envoi d'une image sur le serveur</title>
8
  </head>
9
  <body id="main_body">
10
    <img id="top" src="images/top.png" alt="">
11
    <div id="form_container">
12
      <h1><img src="images/tetaneutral.svg"></h1>
13
      <form action="uploadReceive.php" method="post" enctype="multipart/form-data" id="upload">
14
	<h2>Ajouter un nouveau panorama</h2>
15
	<ul>
16
	  <li id="li_1" >
17
	    <label for="file" class="description">Envoyer le fichier :</label>
18
	    <div>
19
	      <input type="hidden" name="APC_UPLOAD_PROGRESS" id="progress_key" value="panoramas"/>
20
	      <input type="file" name="files[]" id="file" multiple="multiple"
21
		     title="Le fichier à envoyer doit être une image de taille maximale 300 Mo"/>
22
	    </div>  
23
	  </li>
110 24
	  
111
	  <iframe style="display: none" id="upload_frame" name="upload_frame"></iframe>
112
	 
113
    <?php 
114
    
115
    /*******************************************************************
116
     * Permet d'afficher l'image uploadée sur le serveur
117
     *******************************************************************/
118

  
119
    if(isset($_GET['img']) && isset($_GET['dir'])){
120
  
121
    	apc_delete('link');   // Suppression de la variable cache.
122
    	
123
    	$image_name = htmlspecialchars($_GET['img']);
124
    	$dir_image = htmlspecialchars($_GET['dir']);
125
    	
126
        $basename = basename($_GET['img']);
127
    	$filePartArr = explode('.', $basename);  
128
        $ext = $filePartArr[count($filePartArr) - 1];
129
	if($ext=="tif"){
130
		$basename = basename($_GET['img'],".tif");
131
	}else if($ext=="jpeg"){
132
	      $basename = basename($_GET['img'],".jpeg");
133
       	} else {
134
	      $basename = basename($_GET['img'],".jpg");
135
	} 
136
    	        //Permet d'afficher l'image après uptload ( Conversion des .tiff et .jpg pour affichage dans le navigateur )
137
		$input = 'convert /var/www/data/tsf2/vpongnian/panorama/upload/'.$_GET['img'].' -resize 10% /var/www/data/tsf2/vpongnian/panorama/upload/'.$basename.'.jpg'; // Adapter les chemins absolus ou relatifs
138
		$escaped_command = escapeshellcmd($input);
139
		$output = shell_exec($escaped_command);
140
		echo "<pre>$output</pre>\n";
141
		
142
    ?><div id="genererPano">
143
		<form enctype="multipart/form-data" action="<?php echo "envoyer.php"/*htmlspecialchars($_SERVER['PHP_SELF'])*/; ?>" method="post" onSubmit="showLoader()">
144
		  <p>
145
		    <label id="l_generer" for="no" title="Génerer le panoramique">Generer le panoramique :</label>
146
		    <input type="hidden" name="image_name" value="<?php echo $image_name; ?>" />
147
		    <input type="submit" name="no" value="pas maintenant"/>
148
		    <input type="submit" name="yes" value="oui" />
149
		    <label id="loader"></label>
150
		  </p>
151
		</form>
152
	  </div>
153
    <?php 
154
   
155
    echo "<img src=/data/tsf2/vpongnian/panorama/upload/".$basename.".jpg id='imageUpload'/>";
156
    }  
157
    if (isset($_POST['no'])) {
158
		header("Location: ./index.php"); /* Redirection du navigateur */
159
		exit;
160
	} 
161
	if (isset($_POST['yes'])) {
162
		header("Location: ./genererPano.php?name=".$_POST['image_name']);
163
		exit;
164
	}
165
    ?>
166
   
25
	  <li class="buttons">
26
	    <input type="submit" name="submit" id="submit" value="Submit" />
27
	  </li>
28
	</ul>
29
      </form>
30
      <!-- Fin du formulaire -->
31
      <div id="footer">
32
	<a href="./index.php">Retour liste</a>
33
      </div>
34
    </div>
167 35
  </body>
168
</html>
36
</html>
genererPano.php
1
<?php
2
	if (isset($_GET['name'])) {
3
		// Protection de la variable GET
4
		$pano_name = htmlspecialchars($_GET['name']);
5
		$filePartArr = explode('.',$pano_name);  
6
		$ext = $filePartArr[count($filePartArr) - 1];
7
		if($ext=="tif"){
8
			$pano_basename = basename($pano_name,".tif");
9
		}else if($ext=="jpeg"){
10
		      $pano_basename = basename($pano_name,".jpeg");
11
		} else {
12
			$pano_basename = basename($pano_name,".jpg");
13
		} 
1
<!DOCTYPE html>
2
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
3
<head>
4
  <meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>
5
  <link type="image/x-icon" rel="shortcut icon" href="images/tsf.png"/>
6
  <title>convertiseur image vers panorama</title>
7
</head>
14 8

  
15
		//Partie exécutante du script gen_tiles qui gènere les tuiles à partir d'une image.
16
		$input = './to_tiles/gen_tiles.sh -p '.$pano_basename.' /var/www/data/tsf2/vpongnian/panorama/upload/'.$pano_name;
17
		$escaped_command = escapeshellcmd($input);
18
		$output = shell_exec($escaped_command);
19
		$log_file = fopen('./log/'.$pano_basename.'.log','a+');
20
		fputs($log_file, $output);   // verbose intégré dans un .log.
21
		fclose($log_file);
22
		
23
                // Ouverture d'un nouveau dossier qui contiendra toutes les tuiles.
24
		$dir = '/var/www/data/tsf2/tiles/'.$pano_basename;
25
		
26
		mkdir($dir,0777);
27
		
28
		$dir_fd = opendir('/var/www/data/tsf2/vpongnian/panorama');
9
<?php
10
require 'class/utils.class.php';
11
utils::init();
12
if (isset($_GET['name'])) {
13
  $pano_name = $_GET['name'];
14
  $pano_basename = preg_replace('/\.[^.]+$/', '', $pano_name);
15
  
16
  //Partie exécutante du script gen_tiles qui gènere les tuiles à partir d'une image.
17
  $panos_dir = 'tiles';
18
  $pano_dest = $panos_dir.'/'.$pano_basename;
19
  if (! is_dir($panos_dir)) {
20
    echo "<p class=\"error\">le répertoire \"$panos_dir\" n'est pas accessible</p>\n";
21
  } else if (file_exists($pano_dest)) {
22
    echo "<p class=\"error\">le nom de répertoire \"$pano_dest\" est déjà pris</p>\n";
23
  } else {
24
    mkdir($pano_dest);
25
    $escaped_command = escapeshellcmd('./to_tiles/gen_tiles.sh -p '.$pano_dest.'/'.$pano_basename.' ./upload/'.$pano_name);
29 26
		
30
		while (false !== ($image_name = readdir($dir_fd))) {
31
	    	        // Déplacement des tuiles dans le nouveau dossier à partir de dir_fd.
32
			if(preg_match('/(.*)_[0-9]+_[0-9]+_[0-9]+\.jpg$/', $image_name, $reg)) {
33
	        	rename("./".$image_name, $dir."/".$image_name);
34
	    	}
35
	    	
36
	    }
37
	    closedir($dir_fd);
38
	    header("Location: ./index.php?");
27
    printf("<h2>Exécution de la commande :</h2>\n<p class=\"cmd\"><samp>%s</samp></p>\n<pre>", htmlspecialchars($escaped_command));
28
    if ($fp = popen($escaped_command, 'r')) {
29
      while (!feof($fp)) {
30
	//set_time_limit (20); 
31
	$results = fgets($fp, 4096);
32
	if (strlen($results) == 0) {
33
	  // stop the browser timing out
34
	  flush();
35
	} else {
36
	  $tok = strtok($results, "\n");
37
	  while ($tok !== false) {
38
	    echo htmlspecialchars(sprintf("%s\n",$tok))."<br/>";
39
	    flush(); 
40
	    $tok = strtok("\n");
41
	  }
39 42
	}
40
?>
43
      }
44
      print("</pre>\n");
45
      if (pclose($fp) === 0) {
46
	print("<h4><span class=\"success\">Opération réussie</span></h4>\n");
47
	printf("<p>Pour acceder directement au panorama <a href=\"panorama.php?dir=%s&amp;panorama=%s\">cliquer ici</a></p>\n", 
48
	       $panos_dir, $pano_basename);
49
      } else {
50
	print("<h4><span class=\"error\">Opération en échec durant l'exécution du script !</span></h4>\n");
51
      }
52
    } else {
53
      print("<h4><span class=\"error\">Opération en échec à l'ouverture du script !</span></h4>\n");
54
    }
55
  }
56
  print("<p>Pour acceder à la liste des panoramas <a href=\".\">cliquer ici</a></p>\n") ;
57
}
58
?>
getprogress.php
1
<?php
2
header('Expires: Tue, 08 Oct 1991 00:00:00 GMT');
3
header('Cache-Control: no-cache, must-revalidate');
4

  
5
if(isset($_GET['uid'])){
6
   $status = apc_fetch('upload_' . $_GET['uid']);
7
   $url = apc_fetch('link');
8
   $message = apc_fetch('info');
9
   echo round($status['current']/$status['total']*100)."#".$url."#".$message;
10
}
11
?>
images/tetaneutral.svg
1
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
<!-- Created with Inkscape (http://www.inkscape.org/) -->
3

  
4
<svg
5
   xmlns:dc="http://purl.org/dc/elements/1.1/"
6
   xmlns:cc="http://creativecommons.org/ns#"
7
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
   xmlns:svg="http://www.w3.org/2000/svg"
9
   xmlns="http://www.w3.org/2000/svg"
10
   version="1.1"
11
   width="371.90289"
12
   height="55.950001"
13
   id="svg2">
14
  <metadata
15
     id="metadata8">
16
    <rdf:RDF>
17
      <cc:Work
18
         rdf:about="">
19
        <dc:format>image/svg+xml</dc:format>
20
        <dc:type
21
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
22
        <dc:title></dc:title>
23
      </cc:Work>
24
    </rdf:RDF>
25
  </metadata>
26
  <defs
27
     id="defs6" />
28
  <rect
29
     width="371.90289"
30
     height="55.950001"
31
     ry="0"
32
     x="0"
33
     y="0"
34
     id="rect2993"
35
     style="opacity:0.91000001;fill:#fffbf4;fill-opacity:1;stroke:none" />
36
  <text
37
     x="22.015928"
38
     y="43.308048"
39
     transform="scale(0.97381679,1.0268872)"
40
     id="text2987"
41
     xml:space="preserve"
42
     style="font-size:43.09389877px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b2a58d;fill-opacity:1;stroke:none;font-family:Sans"><tspan
43
       x="22.015928"
44
       y="43.308048"
45
       id="tspan2989"><tspan
46
   id="tspan2991"
47
   style="font-size:43.09389877px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#b2a58d;fill-opacity:1;font-family:Sans;-inkscape-font-specification:Sans Bold">teta</tspan><tspan
48
   id="tspan3763"
49
   style="fill:#e8d7bc;fill-opacity:1">neutral</tspan>.net</tspan></text>
50
</svg>
images/valid_css.svg
1
<?xml version="1.0" encoding="iso-8859-1"?>
2
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" version="1.1" overflow="visible" xmlns:xlink="http://www.w3.org/1999/xlink"
4
     preserveAspectRatio="xMinYMin meet" viewBox="0 0 88 31" width="88" height="31">
5
  <g shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality">
6
    <g shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality">
7
      <g id="Background">
8
      </g>
9
      <g id="Guides">
10
      </g>
11
      <g id="Foreground">
12
        <g>
13
          <polygon points="0,0 88,0 88,31 0,31 0,0   " fill="none"/>
14
          <path d="M44,15.5" fill="none"/>
15
        </g>
16
        <g>
17
          <polygon points="0,0 83,0 83,31 0,31 0,0   " fill="#B3CEE1"/>
18
          <path d="M41.5,15.5" fill="#B3CEE1"/>
19
        </g>
20
        <g>
21
          <polygon points="0.365,0 36.809,0 36.809,31 0.365,31 0.365,0   " fill="#FFFFFF"/>
22
          <path d="M18.587,15.5" fill="#FFFFFF"/>
23
        </g>
24
        <g>
25
          <polygon points="4.692,2.291 44.697,2.291 44.697,26.897 4.692,26.897 4.692,2.291   " fill="none"/>
26
          <path d="M24.695,14.594" fill="none"/>
27
        </g>
28
        <g>
29
          <g>
30
            <defs>
31
              <polygon points="0,30 83,30 83,31 0,31 0,30     " id="XMLID_640_"/>
32
            </defs>
33
            <use xlink:href="#XMLID_640_" fill="#504D4C"/>
34
            <clipPath id="XMLID_666_">
35
              <use xlink:href="#XMLID_640_"/>
36
            </clipPath>
37
            <g clip-path="url(#XMLID_666_)">
38
              <g>
39
                <polygon points="0,0 88,0 88,31 0,31 0,0      " fill="none"/>
40
                <path d="M44,15.5" fill="none"/>
41
              </g>
42
              <g>
43
                <polygon points="0,0 83,0 83,31 0,31 0,0      " fill="#48494B"/>
44
                <path d="M41.5,15.5" fill="#48494B"/>
45
              </g>
46
              <g>
47
                <polygon points="0.365,0 36.809,0 36.809,31 0.365,31 0.365,0      " fill="#4F4F4F"/>
48
                <path d="M18.587,15.5" fill="#4F4F4F"/>
49
              </g>
50
            </g>
51
          </g>
52
        </g>
53
        <g>
54
          <g>
55
            <defs>
56
              <polygon points="82,0 83,0 83,31 82,31 82,0     " id="XMLID_642_"/>
57
            </defs>
58
            <use xlink:href="#XMLID_642_" fill="#504D4C"/>
59
            <clipPath id="XMLID_667_">
60
              <use xlink:href="#XMLID_642_"/>
61
            </clipPath>
62
            <g clip-path="url(#XMLID_667_)">
63
              <g>
64
                <polygon points="0,0 88,0 88,31 0,31 0,0      " fill="none"/>
65
                <path d="M44,15.5" fill="none"/>
66
              </g>
67
              <g>
68
                <polygon points="0,0 83,0 83,31 0,31 0,0      " fill="#48494B"/>
69
                <path d="M41.5,15.5" fill="#48494B"/>
70
              </g>
71
              <g>
72
                <g>
73
                  <defs>
74
                    <polygon points="0,30 83,30 83,31 0,31 0,30        " id="XMLID_644_"/>
75
                  </defs>
76
                  <use xlink:href="#XMLID_644_" fill="#191919"/>
77
                  <clipPath id="XMLID_668_">
78
                    <use xlink:href="#XMLID_644_"/>
79
                  </clipPath>
80
                  <g clip-path="url(#XMLID_668_)">
81
                    <g>
82
                      <polygon points="0,0 88,0 88,31 0,31 0,0         " fill="none"/>
83
                      <path d="M44,15.5" fill="none"/>
84
                    </g>
85
                    <g>
86
                      <polygon points="0,0 83,0 83,31 0,31 0,0         " fill="#181818"/>
87
                      <path d="M41.5,15.5" fill="#181818"/>
88
                    </g>
89
                    <g>
90
                      <polygon points="0.365,0 36.809,0 36.809,31 0.365,31 0.365,0         " fill="#191919"/>
91
                      <path d="M18.587,15.5" fill="#191919"/>
92
                    </g>
93
                  </g>
94
                </g>
95
              </g>
96
            </g>
97
          </g>
98
        </g>
99
        <g>
100
          <polygon points="0,0 1,0 1,31 0,31 0,0   " fill="#CCCCCC"/>
101
          <path d="M0.5,15.5" fill="#CCCCCC"/>
102
        </g>
103
        <g>
104
          <g>
105
            <defs>
106
              <polygon points="2.16,29.005 82.16,29.005 82.16,30.005 2.16,30.005 2.16,29.005     " id="XMLID_646_"/>
107
            </defs>
108
            <use xlink:href="#XMLID_646_" fill="#9E9C9C"/>
109
            <clipPath id="XMLID_669_">
110
              <use xlink:href="#XMLID_646_"/>
111
            </clipPath>
112
            <g clip-path="url(#XMLID_669_)">
113
              <g>
114
                <polygon points="0,0 88,0 88,31 0,31 0,0      " fill="none"/>
115
                <path d="M44,15.5" fill="none"/>
116
              </g>
117
              <g>
118
                <polygon points="0,0 83,0 83,31 0,31 0,0      " fill="#9097A0"/>
119
                <path d="M41.5,15.5" fill="#9097A0"/>
120
              </g>
121
              <g>
122
                <polygon points="0.365,0 36.809,0 36.809,31 0.365,31 0.365,0      " fill="#B5B5B5"/>
123
                <path d="M18.587,15.5" fill="#B5B5B5"/>
124
              </g>
125
              <g>
126
                <g>
127
                  <defs>
128
                    <polygon points="0,30 83,30 83,31 0,31 0,30        " id="XMLID_648_"/>
129
                  </defs>
130
                  <use xlink:href="#XMLID_648_" fill="#383838"/>
131
                  <clipPath id="XMLID_670_">
132
                    <use xlink:href="#XMLID_648_"/>
133
                  </clipPath>
134
                  <g clip-path="url(#XMLID_670_)">
135
                    <g>
136
                      <polygon points="0,0 88,0 88,31 0,31 0,0         " fill="none"/>
137
                      <path d="M44,15.5" fill="none"/>
138
                    </g>
139
                    <g>
140
                      <polygon points="0,0 83,0 83,31 0,31 0,0         " fill="#343536"/>
141
                      <path d="M41.5,15.5" fill="#343536"/>
142
                    </g>
143
                    <g>
144
                      <polygon points="0.365,0 36.809,0 36.809,31 0.365,31 0.365,0         " fill="#383838"/>
145
                      <path d="M18.587,15.5" fill="#383838"/>
146
                    </g>
147
                  </g>
148
                </g>
149
              </g>
150
              <g>
151
                <g>
152
                  <defs>
153
                    <polygon points="82,0 83,0 83,31 82,31 82,0        " id="XMLID_650_"/>
154
                  </defs>
155
                  <use xlink:href="#XMLID_650_" fill="#383838"/>
156
                  <clipPath id="XMLID_671_">
157
                    <use xlink:href="#XMLID_650_"/>
158
                  </clipPath>
159
                  <g clip-path="url(#XMLID_671_)">
160
                    <g>
161
                      <polygon points="0,0 88,0 88,31 0,31 0,0         " fill="none"/>
162
                      <path d="M44,15.5" fill="none"/>
163
                    </g>
164
                    <g>
165
                      <polygon points="0,0 83,0 83,31 0,31 0,0         " fill="#343536"/>
166
                      <path d="M41.5,15.5" fill="#343536"/>
167
                    </g>
168
                    <g>
... Ce différentiel a été tronqué car il excède la taille maximale pouvant être affichée.