Page 1 of 1

Courseplay.xml mit Script umrechnen

Posted: Wed Nov 06, 2013 12:39 am
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.. :/

Re: Courseplay.xml mit Script umrechnen

Posted: Wed Nov 06, 2013 12:54 am
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.

Re: Courseplay.xml mit Script umrechnen

Posted: Wed Nov 06, 2013 1:05 am
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 ;)

Re: Courseplay.xml mit Script umrechnen

Posted: Wed Nov 06, 2013 1:09 am
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.

Re: Courseplay.xml mit Script umrechnen

Posted: Wed Nov 06, 2013 8:21 am
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

Re: Courseplay.xml mit Script umrechnen

Posted: Wed Nov 06, 2013 11:08 pm
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?

Re: Courseplay.xml mit Script umrechnen

Posted: Thu Nov 07, 2013 9:12 am
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;
}

Re: Courseplay.xml mit Script umrechnen

Posted: Thu Nov 07, 2013 6:37 pm
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?

Re: Courseplay.xml mit Script umrechnen

Posted: Thu Nov 07, 2013 6:52 pm
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!

Re: Courseplay.xml mit Script umrechnen

Posted: Thu Nov 07, 2013 7:33 pm
by Mike77
Hmm... so funktioniert es aber leider nicht. Da kommt ein Compile Error: unknown Variabl (Text der Meldung scheint abgeschnitten zu sein)

Re: Courseplay.xml mit Script umrechnen

Posted: Thu Nov 07, 2013 7:35 pm
by webalizer
Guckst du mein Edit! Habe es selbst bemerkt aber war zu langsam ;-)

Re: Courseplay.xml mit Script umrechnen

Posted: Thu Nov 07, 2013 7:40 pm
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 ;)