Courseplay.xml mit Script umrechnen

Mike77
2. Verwarnung
Posts: 662
Joined: Tue Nov 06, 2012 2:33 am

Courseplay.xml mit Script umrechnen

Post by Mike77 »

Moin

Ich habe ja meine Map nun in eine 4x Map eingebaut. Nun müsste ich die Courseplay.xml umrechnen, was aber bei 15000 Zeilen per Hand zu einer Lebensaufgabe mutieren könnte.
Ich denke, jemand der Skriptingtechnisch etwas mehr Sachverstand hat als ich, findet dafür doch sicher schnell eine Lösung. ;)
Die xml müsste dafür nur Zeilenweise ausgelesen werden und immer wenn in der Zeile

Code: Select all

<waypoint
vorkommt, müssen zu den beiden Werten

Code: Select all

pos="242.6666 -98.1667"
jeweils 1024 hinzuaddiert werden.
Wie könnte ich das denn nun am schnellsten und einfachsten Lösen?

Achja, bis ich die alle neu eingefahren habe, kann ich das auch einzeln per Hand umrechnen.. :/
User avatar
böserlöwe
GIANTS Software | Support Engineer
Posts: 10817
Joined: Thu Oct 01, 2009 10:09 pm
Location: Kreis Schaumburg
Contact:

Re: Courseplay.xml mit Script umrechnen

Post by böserlöwe »

Ich wäre nicht so sicher, das es immer nur die 1024 hinzu sind.
Wenn ich mich nicht irre, werden die punkte im Bereich von -1024 bis +1024 angegeben.
so ergibt sich der Umstand, das die Position dann in einem bestimmten Bereich auch mal im Positiven iwe im negativen Bereich sein könnte.
Und eine kombination von beiden würde dann das Chaos komplettieren.

meiner Meinung nach wäre es wirklich besser wenn du die Kurse noch einmal selbst auf der Map einfährst.
Klar dauert das eine Weile, aber ich denke auch das es effektiver ist, als durch die bloße Umrechnung und der eventuellen Fehlerbehebung an Zeit drauf geht.
Mike77
2. Verwarnung
Posts: 662
Joined: Tue Nov 06, 2012 2:33 am

Re: Courseplay.xml mit Script umrechnen

Post by Mike77 »

Der Origin, also "0 0 0" ist bei einer Standartmap genau in der Mitte, bei einer 4Fach Map ist er genau in dem Kreuz, in dem sich die 4 Maps in der Mitte treffen.
Je nachdem wohin man nun seine entsprechende Map verschoben hat, kommen nur 4 Kombinationen in Frage. Verschiebt man die Map nach unten rechts (wie in meinem Fall), muss bei x und y jeweils 1024 dazugerechnet werden, um wieder in der Mitte der Map zu sein. Das kommt dadurch, weil eine Map immer die Kantenlängen von 2048 hat. Ich habe das mit den Hufeisen und den Fahrzeugen Im Savegame schon gemacht.

Bei der Map unten rechts x+1024, y+1024
bei der Map unten links x-1024, y+1024
bei der Map oben links x-1024, y-1024
bei der Map oben rechts x+1024, y-1024

Das funktioniert wunderbar, sonst wäre ich auch nicht auf die Idee gekommen, das in der coursplay.xml auch so zu machen
Natürlich sind die Angaben der Koordinaten manchmal im plus und manchmal im Minus. Aber wenn man bei beiden Werten jeweils die 1024 dazurechnet, kommt man genau da hin wo man hin muss ;)
Last edited by Mike77 on Wed Nov 06, 2013 1:13 am, edited 2 times in total.
User avatar
böserlöwe
GIANTS Software | Support Engineer
Posts: 10817
Joined: Thu Oct 01, 2009 10:09 pm
Location: Kreis Schaumburg
Contact:

Re: Courseplay.xml mit Script umrechnen

Post by böserlöwe »

Ja, wenn du das so schon vorbereitet hast, ist das doch nur noch eine Aufgabe für Excel oder PHP ;)
Ich würde das nicht freiwillig machen wollen. also noch viel Spass dabei.
User avatar
webalizer
Posts: 596
Joined: Fri Feb 10, 2012 9:11 am

Re: Courseplay.xml mit Script umrechnen

Post by webalizer »

Schau dir mal bitte meine Scripte zur Änderung von Mapobjekten bzw. zur automatischen Modskalierung an.
Mit dem Foxe wirst du da am schnellsten ans Ziel kommen:
http://planet-ls.de/board/index.php?pag ... adID=13777
http://planet-ls.de/board/index.php?pag ... adID=13905
Mike77
2. Verwarnung
Posts: 662
Joined: Tue Nov 06, 2012 2:33 am

Re: Courseplay.xml mit Script umrechnen

Post by Mike77 »

Ok, der xml Editor sieht unabhängig von der Thematik hier schon sehr nützlich aus. Den werd ich mal behalten ;)
Nun zum Problem: ich bin kein Skripter. Ich weis zwar wie es Theoretisch geht, aber nicht wie man es Praktisch umsetzt.

So sieht ja die xml von Aufbau her aus:

Code: Select all

<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<XML>
<courses>
	<course name="Feld 1 abtanken" id="24" >
		<waypoint1 pos="242.6666 -98.1667" angle="-91.78" rev="0" wait="0" crossing="1"  speed="0" generated="false" turn="false" turnstart="0" turnend="0" ridgemarker="0" />
		<waypoint2 pos="246.3334 -106.6667" angle="172.71" rev="0" wait="0" crossing="0"  speed="0.0078" generated="false" turn="false" turnstart="0" turnend="0" ridgemarker="0" />
		<waypoint3 pos="255.3927 -118.6699" angle="124.04" rev="0" wait="0" crossing="0"  speed="0.01198" generated="false" turn="false" turnstart="0" turnend="0" ridgemarker="0" />
(...)
	</course>
	<course name="Feld 1 Duengen" id="13" >
		<waypoint1 pos="-600.2667 -519.6" angle="-1.84" rev="0" wait="0" crossing="1"  speed="0.00164" generated="false" turn="false" turnstart="0" turnend="0" ridgemarker="0" />
		<waypoint2 pos="-594 -519.3333" angle="47.03" rev="0" wait="0" crossing="0"  speed="0.00773" generated="false" turn="false" turnstart="0" turnend="0" ridgemarker="0" />
(...usw...)
Die Schritte wäre ja:
-suche xml Tag "waypoint" (schwierig, da jeder eine ander Zahl angehängt hat. vielleicht mit Platzhalter, also "waypoint*")
-suche attribut pos=""
-ermittle den attribut-wert
-trenne die beiden Zahlen am Leerzeichen
-addiere zu jeder der beiden Zahlen 1024 hinzu
-trage die geänderten zahlen wieder als Wert ein

Wie müsste denn da so eine *.foal aussehen?
User avatar
webalizer
Posts: 596
Joined: Fri Feb 10, 2012 9:11 am

Re: Courseplay.xml mit Script umrechnen

Post by webalizer »

Nur einmal kurz getestet, sollte aber funktionieren:

Code: Select all

//Courseplay shift
//v 0.1, 07.11.2013
//Verschieben von Courseplay Wegpunkten
//by webalizer, http://www.planet-ls.de


//Skalierfunktion mit Berücksichtigung von Exponential-Werten
change_v(str v, num scaleFactor)
{
  num n = v;
  int offset = StrFind(v,"e"); // Position von e finden
  int e = 0;
  if (offset > 0 && offset < StrLength(v) - 2)
    e = StrMid(v,offset+1);
      
  // Eigentliche Skalierung
  n = n + scaleFactor;

  // falls keine Exponentiale vorhanden, Rückgabe ohne  
  if (e == 0)
    return "" + n;

  // Rückgabe mit Exponentiale
  v = "" + n + "e";
  if (e > 0)
    v += "+";
  v += e;
  return v;
}

//Funktion zum Zerlegen von XY-String / Skalieren / XML Zurückschreiben
scale_xyz( CMarkup xmlDoc, str attribute, num scaleFactor )
{
  xmlDoc.ResetPos();
  while ( xmlDoc.FindElem("//*[@pos]") )
  	if (xmlDoc.GetAttrib(attribute)){
	  	str attribOrigin = xmlDoc.GetAttrib(attribute);
  		int str_pos_a1 = 0;
  		int str_pos_a2 = 0;
  		
  		str_pos_a1 = StrFind( attribOrigin, " ", 0);
  		str a1 = StrMid(attribOrigin, 0, str_pos_a1);

		str a2 = StrMid(attribOrigin, str_pos_a1+1);
	
		a1 = change_v(a1, scaleFactor);
		a2 = change_v(a2, scaleFactor);
		
		str attribNew = "" + a1 + " " + a2;
	
    		xmlDoc.SetAttrib( attribute, attribNew );
  	}
  	return xmlDoc;
 } 



//Hauptfunktion: Aufruf der Skalierungsfuntionen mit Uebergabe von Dokument und Attribut
main( CMarkup xmlDoc ){
	

	//Variablen eintragen
	num scaleFactor = 1024; // Skalierungsfaktor 
	//Ende Variablen eintragen
	
	xmlDoc.ResetPos();

	xmlDoc = scale_xyz( xmlDoc, "pos", scaleFactor );

  	return xmlDoc;
}
Mike77
2. Verwarnung
Posts: 662
Joined: Tue Nov 06, 2012 2:33 am

Re: Courseplay.xml mit Script umrechnen

Post by Mike77 »

Wow... Vielen Dank. Das sieht schonmal sehr vielversprechend aus. Ich hatte mir mal so Gedanken gemacht wie das Skript dazu aussehen könnte, da ich wenigstens in php keine totale Niete bin, aber das da oben is einfach kompletter Bahnhof für mich. ;)
Geht schon damit los, das ich garnicht weis, woher das Skript nun weis wo es nach den Werten suchen soll. Dachte der muss nach einem Bestimmten String suchen (eben pos=") um ihm sagen zu können das gleich danach die Werte kommen.

(EDIT: Da ich vor lauter Freude vergessen hatte den Beitrag abzuschicken, kann ich gleich noch ergänzen das es wunderbar funktioniert.
Nachdem ich das nun mit dem Skript umgerechnet und ingame getestet habe, könnte ich dich knutschen... naja, oder auch nicht, aber auf jeden Fall bin ich dir sehr dankbar. :) )

Aber eine Frage hätte ich da noch. Sehe ich das richtig, das man für x und y nicht separat den Shiftwert angeben kann?
Also mit dem Skript lassen sich die Kurse dann nur nach unten rechts bzw oben links verschieben, da bei den anderen beiden Ecken ja die x und y Werte unterschiedlich sind (einmal + einmal - )
Bzw nur nach unten rechts, weil das Skript ja immer addiert und nicht subtrahiert. Obwohl... 0 + (-1024) geht ja auch. Ergibt dann -1024 ... Kann man das irgendwie umbauen, das man die Werte separat angeben kann, oder kommt der mit dem Minus vor der Zahl dann nich klar?
User avatar
webalizer
Posts: 596
Joined: Fri Feb 10, 2012 9:11 am

Re: Courseplay.xml mit Script umrechnen

Post by webalizer »

Um da tiefer einzusteigen bzw. die Befehle zu verstehen müsstest du dich näher mit der CMarkup-Syntax auf der foxe-Seite vertraut machen.
Folgendes sucht nach beliebigen XML-Elementen, die das Attribut "pos" beinhalten. Da das in der courseplay.xml nur waypoints haben, muss man die Suche nicht weiter einschränken: FindElem("//*[@pos]")
Man kann natürlich auch x y getrennt berechnen. Öhm, und bis ich das jetzt beschrieben habe, hab ich´s selbst geändert :mrgreen: :

Code: Select all

//Courseplay shift
//v 0.2, 07.11.2013
//Verschieben von Courseplay Wegpunkten
//by webalizer, http://www.planet-ls.de


//Skalierfunktion mit Berücksichtigung von Exponential-Werten
change_v(str v, num scaleFactor)
{
  num n = v;
  int offset = StrFind(v,"e"); // Position von e finden
  int e = 0;
  if (offset > 0 && offset < StrLength(v) - 2)
    e = StrMid(v,offset+1);
      
  // Eigentliche Skalierung
  n = n + scaleFactor;

  // falls keine Exponentiale vorhanden, Rückgabe ohne  
  if (e == 0)
    return "" + n;

  // Rückgabe mit Exponentiale
  v = "" + n + "e";
  if (e > 0)
    v += "+";
  v += e;
  return v;
}

//Funktion zum Zerlegen von XY-String / Skalieren / XML Zurückschreiben
scale_xyz( CMarkup xmlDoc, str attribute, num scaleFactorX, num scaleFactorY )
{
  xmlDoc.ResetPos();
  while ( xmlDoc.FindElem("//*[@pos]") )
     if (xmlDoc.GetAttrib(attribute)){
        str attribOrigin = xmlDoc.GetAttrib(attribute);
        int str_pos_a1 = 0;
        int str_pos_a2 = 0;
        
        str_pos_a1 = StrFind( attribOrigin, " ", 0);
        str a1 = StrMid(attribOrigin, 0, str_pos_a1);

      str a2 = StrMid(attribOrigin, str_pos_a1+1);
   
      a1 = change_v(a1, scaleFactorX);
      a2 = change_v(a2, scaleFactorY);
      
      str attribNew = "" + a1 + " " + a2;
   
          xmlDoc.SetAttrib( attribute, attribNew );
     }
     return xmlDoc;
 } 



//Hauptfunktion: Aufruf der Skalierungsfuntionen mit Uebergabe von Dokument und Attribut
main( CMarkup xmlDoc ){
   

   //Variablen eintragen
   num scaleFactorX = 1024; // x-Skalierungsfaktor 
   num scaleFactorY = 1024; // y-Skalierungsfaktor 
   //Ende Variablen eintragen
   
   xmlDoc.ResetPos();

   xmlDoc = scale_xyz( xmlDoc, "pos", scaleFactorX, scaleFactorY );

     return xmlDoc;
}
Werte kannst du unten im Script anpassen.

Edit: Fehlerbereinigung 19:29 Uhr!
Mike77
2. Verwarnung
Posts: 662
Joined: Tue Nov 06, 2012 2:33 am

Re: Courseplay.xml mit Script umrechnen

Post by Mike77 »

Hmm... so funktioniert es aber leider nicht. Da kommt ein Compile Error: unknown Variabl (Text der Meldung scheint abgeschnitten zu sein)
Last edited by Mike77 on Thu Nov 07, 2013 7:39 pm, edited 2 times in total.
User avatar
webalizer
Posts: 596
Joined: Fri Feb 10, 2012 9:11 am

Re: Courseplay.xml mit Script umrechnen

Post by webalizer »

Guckst du mein Edit! Habe es selbst bemerkt aber war zu langsam ;-)
Mike77
2. Verwarnung
Posts: 662
Joined: Tue Nov 06, 2012 2:33 am

Re: Courseplay.xml mit Script umrechnen

Post by Mike77 »

ja ich bin viel zu langsam... ^^ Jetzt funktioniert das wunderbar.

Das ist ja beeindruckend. :hi:

Vielen vielen Dank dafür.
Ich hoffe das das vielleicht auch jemand anderem mal nützlich ist ;)
Post Reply