1 /* 2 Copyright 2008,2009, 2010 3 Matthias Ehmann, 4 Michael Gerhaeuser, 5 Carsten Miller, 6 Bianca Valentin, 7 Alfred Wassermann, 8 Peter Wilfahrt 9 10 This file is part of JSXGraph. 11 12 JSXGraph is free software: you can redistribute it and/or modify 13 it under the terms of the GNU Lesser General Public License as published by 14 the Free Software Foundation, either version 3 of the License, or 15 (at your option) any later version. 16 17 JSXGraph is distributed in the hope that it will be useful, 18 but WITHOUT ANY WARRANTY; without even the implied warranty of 19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 GNU Lesser General Public License for more details. 21 22 You should have received a copy of the GNU Lesser General Public License 23 along with JSXGraph. If not, see <http://www.gnu.org/licenses/>. 24 */ 25 JXG.CinderellaReader = new function() { 26 this.parseData = function(board) { 27 var dataLines, i, j, k, pCoords, defName, objName, defPoints, segment, 28 defRadius, circle, erg, poly, point, objName2, erg2, lines, point2, oX, oY, scale; 29 dataLines = this.data.split('\n'); 30 for(i=0; i<dataLines.length; i++) { 31 if(dataLines[i].search(/FreePoint.+/) != -1) { // freier Punkt 32 pCoords = dataLines[i].slice(dataLines[i].search(/FreePoint.+/)+11); 33 pCoords = pCoords.split(','); 34 for(j=0; j<pCoords.length; j++) { 35 pCoords[j] = pCoords[j].slice(0,pCoords[j].search(/\+i\*/)); 36 } 37 objName = dataLines[i].match(/"[A-Za-z]*"/); 38 objName = objName[0].slice(1, objName[0].length-1); 39 erg = this.readPointProperties(dataLines,i); 40 i = erg[1]; 41 board.create('point',[pCoords[0]/pCoords[2],-1*pCoords[1]/pCoords[2]], 42 {name:objName, size:erg[0][1], fillColor:erg[0][0], strokeColor:erg[2], labelColor:erg[3]}); 43 44 } 45 else if(dataLines[i].search(/Join\(.+/) != -1 || dataLines[i].search(/Segment\(.+/) != -1) { // Gerade oder Strecke 46 if(dataLines[i].search(/Join\(.+/) != -1) { 47 defPoints = dataLines[i].slice(dataLines[i].search(/Join.+/)+5); 48 segment = false; 49 } 50 else { 51 defPoints = dataLines[i].slice(dataLines[i].search(/Segment.+/)+8); 52 segment = true; 53 } 54 defPoints = defPoints.split(','); 55 defName = []; 56 for(j=0; j<defPoints.length; j++) { 57 defName[j] = defPoints[j].match(/"[A-Za-z]*"/)[0]; 58 defName[j] = defName[j].slice(1,defName[j].length-1); 59 } 60 objName = dataLines[i].match(/"[A-Za-z]*"/); 61 objName = objName[0].slice(1, objName[0].length-1); 62 erg = this.readLineProperties(dataLines,i); 63 i = erg[2]; 64 board.create('line',[JXG.getReference(board,defName[0]),JXG.getReference(board,defName[1])], 65 {straightFirst:!segment, straightLast:!segment, name:objName, withLabel:true, 66 strokeColor:erg[0][0], strokeWidth:erg[0][2], dash:erg[1]}); 67 } 68 else if(dataLines[i].search(/CircleMP.+/) != -1) { // Kreis, durch zwei Punkte definiert 69 defPoints = dataLines[i].slice(dataLines[i].search(/CircleMP.+/)+9); 70 defPoints = defPoints.split(','); 71 defName = []; 72 for(j=0; j<defPoints.length; j++) { 73 defName[j] = defPoints[j].match(/"[A-Za-z]*"/)[0]; 74 defName[j] = defName[j].slice(1,defName[j].length-1); 75 } 76 objName = dataLines[i].match(/"[A-Za-z0-9]*"/); 77 objName = objName[0].slice(1, objName[0].length-1); 78 erg = this.readCircleProperties(dataLines,i); 79 i = erg[3]; 80 board.create('circle',[JXG.getReference(board,defName[0]),JXG.getReference(board,defName[1])], 81 {name:objName, strokeColor:erg[0][0], fillColor:erg[1], fillOpacity:erg[2], 82 strokeWidth:erg[0][2]}); 83 } 84 else if(dataLines[i].search(/CircleByFixedRadius.+/) != -1 || dataLines[i].search(/CircleByRadius.+/) != -1) { // Kreis, mit Radius 85 if(dataLines[i].search(/CircleByFixedRadius.+/) != -1) { 86 defPoints = dataLines[i].slice(dataLines[i].search(/CircleByFixedRadius.+/)+20); 87 } 88 else { 89 defPoints = dataLines[i].slice(dataLines[i].search(/CircleByRadius.+/)+15); 90 } 91 defPoints = defPoints.split(','); 92 defName = defPoints[0].match(/"[A-Za-z0-9]*"/)[0]; 93 defName = defName.slice(1,defName.length-1); 94 objName = dataLines[i].match(/"[A-Za-z0-9]*"/); 95 objName = objName[0].slice(1, objName[0].length-1); 96 defRadius = defPoints[1].slice(0,defPoints[1].search(/\+i\*/)); 97 erg = this.readCircleProperties(dataLines,i); 98 i = erg[3]; 99 board.create('circle',[JXG.getReference(board,defName),Math.sqrt(1*defRadius)], 100 {name:objName, strokeColor:erg[0][0], fillColor:erg[1], fillOpacity:erg[2], 101 strokeWidth:erg[0][2]}); 102 } 103 else if(dataLines[i].search(/PointOnCircle.+/) != -1) { // Gleiter auf Kreis 104 defPoints = dataLines[i].split(':='); 105 objName = defPoints[0].match(/"[A-Za-z]*"/)[0]; 106 objName = objName.slice(1, objName.length-1); 107 defName = defPoints[1].match(/"[A-Za-z0-9]*"/)[0]; 108 defName = defName.slice(1,defName.length-1); 109 defPoints = defPoints[1].match(/\[.*\]/)[0]; 110 defPoints = defPoints.split(','); 111 for(k=0; k<defPoints.length; k++) { 112 defPoints[k] = defPoints[k].split('+i*'); 113 } 114 defPoints[0] = 1*(defPoints[0][0].slice(1)); 115 defPoints[1] = 1*defPoints[1][0]; 116 if(dataLines[i][1] == 'n') { // umgedreht! 117 defPoints[0] = -1*defPoints[0]; 118 defPoints[1] = -1*defPoints[1]; 119 } 120 erg = this.readPointProperties(dataLines,i); 121 i = erg[1]; 122 circle = JXG.getReference(board,defName); 123 board.create('glider', 124 [circle.midpoint.coords.usrCoords[1]+defPoints[0],circle.midpoint.coords.usrCoords[2]-defPoints[1],circle], 125 {name:objName, size:erg[0][1], fillColor:erg[0][0], strokeColor:erg[2], labelColor:erg[3]}); 126 } 127 else if(dataLines[i].search(/PointOnLine.+/) != -1) { // Gleiter auf Geade 128 defPoints = dataLines[i].split(':='); 129 objName = defPoints[0].match(/"[A-Za-z]*"/)[0]; 130 objName = objName.slice(1, objName.length-1); 131 defName = defPoints[1].match(/"[A-Za-z0-9]*"/)[0]; 132 defName = defName.slice(1,defName.length-1); 133 pCoords = defPoints[1].match(/\[.*\]/)[0]; 134 pCoords = pCoords.split(','); 135 pCoords[0] = 1*(pCoords[0].slice(1,pCoords[0].search(/\+i\*/))); // Klammer mit wegschneiden 136 for(j=1; j<pCoords.length; j++) { 137 pCoords[j] = 1*(pCoords[j].slice(0,pCoords[j].search(/\+i\*/))); 138 } 139 erg = this.readPointProperties(dataLines,i); 140 i = erg[1]; 141 board.create('glider', 142 [pCoords[0]/pCoords[2],-1*pCoords[1]/pCoords[2],JXG.getReference(board,defName)], 143 {name:objName, size:erg[0][1], fillColor:erg[0][0], strokeColor:erg[2], labelColor:erg[3]}); 144 } 145 else if(dataLines[i].search(/Mid\(.+/) != -1) { // Mittelpunkt 146 defPoints = dataLines[i].slice(dataLines[i].search(/Mid.+/)+4); 147 defPoints = defPoints.split(','); 148 defName = []; 149 for(j=0; j<defPoints.length; j++) { 150 defName[j] = defPoints[j].match(/"[A-Za-z]*"/)[0]; 151 defName[j] = defName[j].slice(1,defName[j].length-1); 152 } 153 objName = dataLines[i].match(/"[A-Za-z0-9]*"/); 154 objName = objName[0].slice(1, objName[0].length-1); 155 erg = this.readPointProperties(dataLines,i); 156 i = erg[1]; 157 board.create('midpoint', 158 [JXG.getReference(board,defName[0]),JXG.getReference(board,defName[1])], 159 {name:objName, size:erg[0][1], fillColor:erg[0][0], strokeColor:erg[2], labelColor:erg[3]}); 160 } 161 else if(dataLines[i].search(/CircleBy3\(.+/) != -1) { // Umkreis 162 defPoints = dataLines[i].slice(dataLines[i].search(/CircleBy3.+/)+10); 163 defPoints = defPoints.split(','); 164 defName = []; 165 for(j=0; j<defPoints.length; j++) { 166 defName[j] = defPoints[j].match(/"[A-Za-z]*"/)[0]; 167 defName[j] = defName[j].slice(1,defName[j].length-1); 168 } 169 objName = dataLines[i].match(/"[A-Za-z0-9]*"/); 170 objName = objName[0].slice(1, objName[0].length-1); 171 erg = this.readCircleProperties(dataLines,i); 172 i = erg[3]; 173 circle = board.create('circumcircle', 174 [JXG.getReference(board,defName[0]),JXG.getReference(board,defName[1]),JXG.getReference(board,defName[2])], 175 {name:['',objName]}); 176 circle[0].setProperty({visible:false}); 177 circle[1].setProperty({strokeColor:erg[0][0], fillColor:erg[1], fillOpacity:erg[2], 178 strokeWidth:erg[0][2]}); 179 } 180 else if(dataLines[i].search(/Parallel\(.+/) != -1) { // Parallele 181 defPoints = dataLines[i].slice(dataLines[i].search(/Parallel.+/)+9); 182 defPoints = defPoints.split(','); 183 defName = []; 184 for(j=0; j<defPoints.length; j++) { 185 defName[j] = defPoints[j].match(/"[A-Za-z]*"/)[0]; 186 defName[j] = defName[j].slice(1,defName[j].length-1); 187 } 188 objName = dataLines[i].match(/"[A-Za-z0-9]*"/); 189 objName = objName[0].slice(1, objName[0].length-1); 190 erg = this.readLineProperties(dataLines,i); 191 i = erg[2]; 192 board.create('parallel', 193 [JXG.getReference(board,defName[0]),JXG.getReference(board,defName[1])], 194 {name:objName, withLabel:true, strokeColor:erg[0][0], strokeWidth:erg[0][2], dash:erg[1]}); 195 } 196 else if(dataLines[i].search(/Orthogonal\(.+/) != -1) { // Normale 197 defPoints = dataLines[i].slice(dataLines[i].search(/Parallel.+/)+11); 198 defPoints = defPoints.split(','); 199 defName = []; 200 for(j=0; j<defPoints.length; j++) { 201 defName[j] = defPoints[j].match(/"[A-Za-z]*"/)[0]; 202 defName[j] = defName[j].slice(1,defName[j].length-1); 203 } 204 objName = dataLines[i].match(/"[A-Za-z0-9]*"/); 205 objName = objName[0].slice(1, objName[0].length-1); 206 erg = this.readLineProperties(dataLines,i); 207 i = erg[2]; 208 board.create('normal', 209 [JXG.getReference(board,defName[0]),JXG.getReference(board,defName[1])], 210 {name:objName, withLabel:true, strokeColor:erg[0][0], strokeWidth:erg[0][2], dash:erg[1]}); 211 } 212 else if(dataLines[i].search(/ConicBy5\(.+/) != -1) { // Kegelschnitt durch 5 Punkte 213 defPoints = dataLines[i].slice(dataLines[i].search(/ConicBy5.+/)+9); 214 defPoints = defPoints.split(','); 215 defName = []; 216 for(j=0; j<defPoints.length; j++) { 217 defName[j] = defPoints[j].match(/"[A-Za-z]*"/)[0]; 218 defName[j] = defName[j].slice(1,defName[j].length-1); 219 } 220 objName = dataLines[i].match(/"[A-Za-z0-9]*"/); 221 objName = objName[0].slice(1, objName[0].length-1); 222 erg = this.readCircleProperties(dataLines,i); 223 i = erg[3]; 224 board.create('conic',[JXG.getReference(board,defName[0]),JXG.getReference(board,defName[1]), 225 JXG.getReference(board,defName[2]),JXG.getReference(board,defName[3]), 226 JXG.getReference(board,defName[4])], 227 {name: objName, strokeColor:erg[0][0], fillColor:erg[1], fillOpacity:erg[2], 228 strokeWidth:erg[0][2]}); 229 } 230 else if(dataLines[i].search(/ConicFoci\(.+/) != -1 || dataLines[i].search(/ConicFociH\(.+/) != -1) { // Ellipse mit Brennpunkten und Punkt auf Ellipse resp. eine solche Hyperbel (ConicFociH) 231 defPoints = dataLines[i].split(':='); 232 objName = defPoints[0].match(/"[A-Za-z0-9]*"/)[0]; 233 objName = objName.slice(1, objName.length-1); 234 defName = defPoints[1].match(/"[A-Za-z0-9]*"/g); 235 for(j=0; j<defName.length; j++) { 236 defName[j] = defName[j].slice(1,defName[j].length-1); 237 } 238 erg = this.readCircleProperties(dataLines,i); 239 if(dataLines[i].search(/ConicFociH\(.+/) != -1) { 240 board.create('hyperbola',[JXG.getReference(board,defName[0]),JXG.getReference(board,defName[1]), 241 JXG.getReference(board,defName[2])], 242 {name: objName, strokeColor:erg[0][0], fillColor:erg[1], fillOpacity:erg[2], 243 strokeWidth:erg[0][2]}); 244 } 245 else { 246 board.create('ellipse',[JXG.getReference(board,defName[0]),JXG.getReference(board,defName[1]), 247 JXG.getReference(board,defName[2])], 248 {name: objName, strokeColor:erg[0][0], fillColor:erg[1], fillOpacity:erg[2], 249 strokeWidth:erg[0][2]}); 250 } 251 i = erg[3]; 252 } 253 else if(dataLines[i].search(/ConicParabolaPL\(.+/) != -1) { // Parabel mit Brennpunkt und Leitlinie 254 defPoints = dataLines[i].slice(dataLines[i].search(/ConicParabolaPL.+/)+16); 255 defPoints = defPoints.split(','); 256 defName = []; 257 for(j=0; j<defPoints.length; j++) { 258 defName[j] = defPoints[j].match(/"[A-Za-z]*"/)[0]; 259 defName[j] = defName[j].slice(1,defName[j].length-1); 260 } 261 objName = dataLines[i].match(/"[A-Za-z0-9]*"/); 262 objName = objName[0].slice(1, objName[0].length-1); 263 erg = this.readCircleProperties(dataLines,i); 264 i = erg[3]; 265 board.create('parabola', 266 [JXG.getReference(board,defName[0]),JXG.getReference(board,defName[1])], 267 {name: objName, strokeColor:erg[0][0], fillColor:erg[1], fillOpacity:erg[2], 268 strokeWidth:erg[0][2]}); 269 } 270 else if(dataLines[i].search(/Poly\(.+/) != -1) { // Polygon 271 defPoints = dataLines[i].slice(dataLines[i].search(/Poly.+/)+5); 272 defPoints = defPoints.split(','); 273 defName = []; 274 for(j=0; j<defPoints.length; j++) { 275 defName[j] = defPoints[j].match(/"[A-Za-z]*"/)[0]; 276 defName[j] = defName[j].slice(1,defName[j].length-1); 277 defName[j] = JXG.getReference(board,defName[j]); 278 } 279 objName = dataLines[i].match(/"[A-Za-z0-9]*"/); 280 objName = objName[0].slice(1, objName[0].length-1); 281 erg = this.readCircleProperties(dataLines,i); 282 i = erg[3]; 283 poly = board.create('polygon', defName, 284 {name: objName}); 285 poly.setProperty({fillColor:erg[1], fillOpacity:erg[2]}); 286 for(j=0; j<poly.borders.length; j++) { 287 poly.borders[j].setProperty({strokeColor:erg[0][0],strokeWidth:erg[0][2]}); 288 } 289 } 290 else if(dataLines[i].search(/Arc\(.+/) != -1) { // Polygon 291 defPoints = dataLines[i].slice(dataLines[i].search(/Arc.+/)+4); 292 defPoints = defPoints.split(','); 293 defName = []; 294 for(j=0; j<defPoints.length; j++) { 295 defName[j] = defPoints[j].match(/"[A-Za-z]*"/)[0]; 296 defName[j] = defName[j].slice(1,defName[j].length-1); 297 } 298 objName = dataLines[i].match(/"[A-Za-z0-9]*"/); 299 objName = objName[0].slice(1, objName[0].length-1); 300 erg = this.readCircleProperties(dataLines,i); 301 i = erg[3]; 302 poly = board.create('circumcirclearc', [JXG.getReference(board,defName[0]),JXG.getReference(board,defName[1]), 303 JXG.getReference(board,defName[2])], 304 {name: objName, strokeColor:erg[0][0], fillColor:erg[1], fillOpacity:erg[2], 305 strokeWidth:erg[0][2]}); 306 } 307 else if(dataLines[i].search(/Through\(.+/) != -1) { // durch einen Punkt definierte Gerade 308 defPoints = dataLines[i].slice(dataLines[i].search(/Through.+/)+8); 309 defName = defPoints.match(/"[A-Za-z]*"/)[0]; 310 defName = defName.slice(1,defName.length-1); 311 pCoords = defPoints.match(/\[.*\]/)[0]; 312 pCoords = pCoords.split(','); 313 pCoords[0] = 1*(pCoords[0].slice(1,pCoords[0].search(/\+i\*/))); // Klammer mit wegschneiden 314 for(j=1; j<pCoords.length; j++) { 315 pCoords[j] = 1*(pCoords[j].slice(0,pCoords[j].search(/\+i\*/))); 316 } 317 objName = dataLines[i].match(/"[A-Za-z0-9]*"/); 318 objName = objName[0].slice(1, objName[0].length-1); 319 320 j = JXG.getReference(board,defName); 321 point = board.create('point',[j.coords.usrCoords[1]+1*pCoords[0],j.coords.usrCoords[2]+1*pCoords[1]],{visible:false}); 322 erg = this.readLineProperties(dataLines,i); 323 i = erg[2]; 324 board.create('line',[j,point], 325 {name:objName, withLabel:true, strokeColor:erg[0][0], strokeWidth:erg[0][2], dash:erg[1]}); 326 } 327 else if(dataLines[i].search(/:=Compass\(.+/) != -1) { // mit Zirkel definierter Kreis 328 defPoints = dataLines[i].slice(dataLines[i].search(/Compass.+/)+8); 329 defPoints = defPoints.split(','); 330 defName = []; 331 for(j=0; j<defPoints.length; j++) { 332 defName[j] = defPoints[j].match(/"[A-Za-z]*"/)[0]; 333 defName[j] = defName[j].slice(1,defName[j].length-1); 334 } 335 objName = dataLines[i].match(/"[A-Za-z0-9]*"/); 336 objName = objName[0].slice(1, objName[0].length-1); 337 erg = this.readCircleProperties(dataLines,i); 338 i = erg[3]; 339 defRadius = (function(el, b) { 340 return function() { 341 return JXG.getReference(b,el[0]).Dist(JXG.getReference(b,el[1])); 342 }; 343 })(defName, board); 344 board.create('circle', 345 [JXG.getReference(board,defName[2]), defRadius], 346 {name:objName, strokeColor:erg[0][0], fillColor:erg[1], fillOpacity:erg[2], 347 strokeWidth:erg[0][2]}); 348 } 349 else if(dataLines[i].search(/AngularBisector\(.+/) != -1) { // Winkelhalbierende 350 defPoints = dataLines[i].split(":="); 351 defPoints[0] = defPoints[0].split(','); 352 if(defPoints[0][0] == '{null') { 353 objName = ''; 354 } 355 else { 356 objName = defPoints[0][0].slice(2,defPoints[0][0].length-1); // { muss mit weg 357 } 358 if(defPoints[0][1] == 'null') { 359 objName2 = ''; 360 } 361 else { 362 objName2 = defPoints[0][1].slice(1,defPoints[0][1].length-1); 363 } 364 defPoints[1] = defPoints[1].match(/"[A-Za-z0-9]*"/g); 365 defName = []; 366 defName[0] = defPoints[1][0].slice(1,defPoints[1][0].length-1); 367 defName[1] = defPoints[1][1].slice(1,defPoints[1][1].length-1); 368 erg = this.readLineProperties(dataLines,i); 369 i = erg[2]; 370 if(!(objName == '' || objName2 == '')) { 371 erg2 = this.readLineProperties(dataLines,i); 372 i = erg[2]; 373 } 374 lines = board.create('bisectorlines',[JXG.getReference(board,defName[0]),JXG.getReference(board,defName[1])], 375 {name:[objName2,objName], withLabel:true}); 376 if(objName == '') { 377 lines.line2.setProperty({visible:false}); 378 lines.line1.setProperty({strokeColor:erg[0][0], strokeWidth:erg[0][2], dash:erg[1]}); 379 } 380 else { 381 if(objName2 == '') { 382 lines.line1.setProperty({visible:false}); 383 lines.line2.setProperty({strokeColor:erg[0][0], strokeWidth:erg[0][2], dash:erg[1]}); 384 } 385 else { 386 lines.line1.setProperty({strokeColor:erg[0][0], strokeWidth:erg[0][2], dash:erg[1]}); 387 lines.line2.setProperty({strokeColor:erg2[0][0], strokeWidth:erg2[0][2], dash:erg2[1]}); 388 } 389 } 390 } 391 else if(dataLines[i].search(/Meet\(.+/) != -1) { // Schnitt zweier Geraden 392 defPoints = dataLines[i].slice(dataLines[i].search(/Meet.+/)+5); 393 defPoints = defPoints.split(','); 394 defName = []; 395 for(j=0; j<defPoints.length; j++) { 396 defName[j] = defPoints[j].match(/"[A-Za-z]*"/)[0]; 397 defName[j] = defName[j].slice(1,defName[j].length-1); 398 } 399 objName = dataLines[i].match(/"[A-Za-z0-9]*"/); 400 objName = objName[0].slice(1, objName[0].length-1); 401 erg = this.readPointProperties(dataLines,i); 402 i = erg[1]; 403 board.create('intersection', 404 [JXG.getReference(board,defName[0]), JXG.getReference(board,defName[1]),0], 405 {name:objName, size:erg[0][1], fillColor:erg[0][0], strokeColor:erg[2], labelColor:erg[3]}); 406 } 407 else if(dataLines[i].search(/IntersectionConicLine\(.+/) != -1 || dataLines[i].search(/IntersectionCircleCircle\(.+/) != -1) { // Schnitt Kreis/Gerade oder Schnitt Kreis/Kreis 408 if(dataLines[i].search(/IntersectionConicLine\(.+/) != -1) { 409 k = 0; 410 j = 1; 411 } 412 else { 413 k = 1; 414 j = 0; 415 } 416 defPoints = dataLines[i].split(":="); 417 defPoints[0] = defPoints[0].split(','); 418 if(defPoints[0][0] == '{null') { 419 objName = ''; 420 } 421 else { 422 objName = defPoints[0][0].slice(2,defPoints[0][0].length-1); // { muss mit weg 423 } 424 if(defPoints[0][1] == 'null') { 425 objName2 = ''; 426 } 427 else { 428 objName2 = defPoints[0][1].slice(1,defPoints[0][1].length-1); 429 } 430 defPoints[1] = defPoints[1].match(/"[A-Za-z0-9]*"/g); 431 defName = []; 432 defName[0] = defPoints[1][0].slice(1,defPoints[1][0].length-1); 433 defName[1] = defPoints[1][1].slice(1,defPoints[1][1].length-1); 434 erg = this.readPointProperties(dataLines,i); 435 i = erg[1]; 436 if(!(objName == '' || objName2 == '')) { 437 erg2 = this.readPointProperties(dataLines,i); 438 i = erg[1]; 439 } 440 if(objName2 != '') { 441 point = board.create('intersection', 442 [JXG.getReference(board,defName[0]),JXG.getReference(board,defName[1]),j], 443 {name:objName2, size:erg[0][1], fillColor:erg[0][0], strokeColor:erg[2], labelColor:erg[3]}); 444 if(objName != '') { 445 point2 = board.create('otherintersection', 446 [JXG.getReference(board,defName[0]),JXG.getReference(board,defName[1]), point], 447 {name:objName, size:erg2[0][1], fillColor:erg2[0][0], strokeColor:erg2[2], labelColor:erg2[3]}); 448 } 449 } 450 else { 451 point = board.create('intersection', 452 [JXG.getReference(board,defName[0]),JXG.getReference(board,defName[1]),k], 453 {name:objName, size:erg[0][1], fillColor:erg[0][0], strokeColor:erg[2], labelColor:erg[3]}); 454 } 455 } 456 else if(dataLines[i].search(/setOriginX\(([0-9.]*)\)/) != -1) { 457 //alert("X= "+RegExp.$1); 458 oX = RegExp.$1; 459 } 460 else if(dataLines[i].search(/setOriginY\(([0-9.]*)\)/) != -1) { 461 //alert(RegExp.$1); 462 oY = RegExp.$1; 463 //alert("_"+oY+"_"); 464 } 465 else if(dataLines[i].search(/setScale\(([0-9.]*)\)/) != -1) { 466 //alert(RegExp.$1); 467 scale = 1*RegExp.$1/25.0; 468 //alert(scale); 469 } 470 //setScale(25.0); 471 472 } 473 board.zoomX *= scale/2.4; 474 board.zoomY *= scale/2.4; 475 oX = board.origin.scrCoords[1]*board.options.zoom.factor; 476 oY = board.origin.scrCoords[2]*board.options.zoom.factor; 477 board.origin = new JXG.Coords(JXG.COORDS_BY_SCREEN, [oX-150, oY+50],board); 478 board.updateStretch(); 479 board.applyZoom(); 480 return board; 481 }; 482 483 this.calculateColor = function(colNr) { 484 colNr = parseInt(colNr); 485 switch(colNr) { 486 case 0: return 'white'; 487 case 1: return 'black'; 488 case 2: return 'red'; 489 case 3: return 'blue'; 490 case 4: return 'green'; 491 case 5: return 'yellow'; 492 case 6: return '#ffafaf'; 493 case 7: return 'cyan'; 494 case 8: return '#ffc800'; 495 case 9: return '#199e4e'; 496 case 10: return '#b75500'; 497 case 11: return '#7700b7'; 498 case 12: return '#ff7f00'; 499 case 13: return '#03a7bc'; 500 case 14: return '#c10000'; 501 case 15: return '#808080'; 502 case 16: return '#ff4a4a'; 503 case 17: return '#faff9e'; 504 case 18: return '#b6ffaa'; 505 case 19: return '#82f2ff'; 506 case 20: return '#d4a3ff'; 507 case 21: return '#ffbd77'; 508 } 509 }; 510 511 this.readPointProperties = function(dataLines,i) { 512 var objAppearance,border, labelcolor; 513 do { 514 i = i+1; 515 } while(dataLines[i].search(/setAppearance/) == -1); 516 objAppearance = (dataLines[i].match(/\([A-Za-z,0-9\.]*\)/))[0]; 517 objAppearance = objAppearance.slice(1, objAppearance.length-1).split(','); 518 objAppearance[0] = this.calculateColor(objAppearance[0]); 519 do { 520 i = i+1; 521 } while(dataLines[i].search(/pointborder/) == -1); 522 if(dataLines[i].search(/false/) != -1) { 523 border = 'none'; 524 labelcolor = objAppearance[0]; 525 } 526 else { 527 border = 'black'; 528 labelcolor = 'black'; 529 } 530 return [objAppearance,i,border,labelcolor]; 531 }; 532 533 this.readCircleProperties = function(dataLines,i) { 534 var objAppearance,filling, fillop; 535 do { 536 i = i+1; 537 } while(dataLines[i].search(/setAppearance/) == -1); 538 objAppearance = (dataLines[i].match(/\([A-Za-z,0-9\.]*\)/))[0]; 539 objAppearance = objAppearance.slice(1, objAppearance.length-1).split(','); 540 objAppearance[0] = this.calculateColor(objAppearance[0]); 541 do { 542 i = i+1; 543 } while(dataLines[i].search(/colorfill/) == -1); 544 filling = dataLines[i].match(/"[0-9]*"/)[0]; 545 filling = filling.slice(1,filling.length-1); 546 filling = this.calculateColor(filling); 547 do { 548 i = i+1; 549 } while(dataLines[i].search(/visibilityfill|fillalpha/) == -1); 550 fillop = dataLines[i].match(/"[0-9\.]*"/)[0]; 551 fillop = fillop.slice(1,fillop.length-1); 552 if(dataLines[i].match(/visibilityfill/)) { 553 fillop = 1*fillop/10; 554 } 555 else { 556 fillop = 1*fillop; 557 } 558 return [objAppearance,filling, fillop,i]; 559 }; 560 561 this.readLineProperties = function(dataLines,i) { 562 var objAppearance,dashing; 563 do { 564 i = i+1; 565 } while(dataLines[i].search(/setAppearance/) == -1); 566 objAppearance = (dataLines[i].match(/\([A-Za-z,0-9\.]*\)/))[0]; 567 objAppearance = objAppearance.slice(1, objAppearance.length-1).split(','); 568 objAppearance[0] = this.calculateColor(objAppearance[0]); 569 do { 570 i = i+1; 571 } while(dataLines[i].search(/linedashing/) == -1); 572 if(dataLines[i].search(/false/) != -1) { 573 dashing = 0; 574 } 575 else { 576 dashing = 3; 577 } 578 return [objAppearance,dashing,i]; 579 }; 580 581 this.prepareString = function(fileStr) { 582 var i, bA = [], len; 583 if (fileStr.indexOf('<') != 0) { 584 len = fileStr.length; 585 for (i=0;i<len;i++) 586 bA[i]=JXG.Util.asciiCharCodeAt(fileStr,i); 587 // Unzip 588 fileStr = (new JXG.Util.Unzip(bA)).unzip()[0][0]; 589 } 590 //fileStr = JXG.Util.utf8Decode(fileStr); 591 //fileStr = JXG.GeogebraReader.utf8replace(fileStr); 592 return fileStr; 593 }; 594 595 this.readCinderella = function(fileStr, board){ 596 this.data = this.prepareString(fileStr); 597 board.suspendUpdate(); 598 this.parseData(board); 599 board.unsuspendUpdate(); 600 }; 601 602 }; 603