<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[GridTalk.de - Technik]]></title>
		<link>https://www.gridtalk.de/</link>
		<description><![CDATA[GridTalk.de - https://www.gridtalk.de]]></description>
		<pubDate>Wed, 08 Apr 2026 22:02:42 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Anfänger-Anleitung OpenSim Terrain]]></title>
			<link>https://www.gridtalk.de/showthread.php?tid=5282</link>
			<pubDate>Sat, 20 Dec 2025 10:56:18 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://www.gridtalk.de/member.php?action=profile&uid=998">Manfred Aabye</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.gridtalk.de/showthread.php?tid=5282</guid>
			<description><![CDATA[<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Anfänger-Anleitung: OpenSim Terrain mit ORM Terrain Generator erstellen</span></span><br />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Teil 1: Grundlagen verstehen</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Was ist eine Heightmap?</span></span><br />
<br />
Eine Heightmap (Höhenkarte) ist ein schwarz-weißes Bild, bei dem:<br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Schwarz</span> = tiefste Stelle (oft 0 Meter)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Weiß</span> = höchste Stelle (oft 100 Meter)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Grautöne</span> = Höhen dazwischen<br />
</li>
</ul>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Wichtige Maße</span></span><br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">1 OpenSim-Region</span> = 256 × 256 bis 4096 × 4096 Meter<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">1 Pixel</span> in der Heightmap = <span style="font-weight: bold;" class="mycode_b">1 Meter</span> in OpenSim<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Gängige Regiongrößen</span> (in 256er-Schritten):<br />
 <ul class="mycode_list"><li>Klein: 256 × 256 Pixel<br />
</li>
<li>Mittel: 512 × 512 oder 768 × 768 Pixel<br />
</li>
<li>Groß: 1024 × 1024 oder 1536 × 1536 Pixel<br />
</li>
<li>Sehr groß: 2048 × 2048, 3072 × 3072 oder 4096 × 4096 Pixel<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Hinweis</span>: Jede Größe in 256er-Schritten ist möglich (256, 512, 768, 1024, 1280, 1536...)<br />
  </li>
</ul>
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: red;" class="mycode_color">Wichtig im Prompt der OpenSim Konsole steht der Regionsname sollte dort Root stehen gilt alles was gemacht wird für alle Regionen.</span></span><br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Teil 2: ORM Terrain Generator in Paint.NET verwenden</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Schritt 1: Installation</span></span><br />
<br />
<ol type="1" class="mycode_list"><li>Lade das Plugin von GitHub: <a href="https://github.com/ManfredAabye/PaintNET-Plugin-ORM-Maps" target="_blank" rel="noopener" class="mycode_url">https://github.com/ManfredAabye/PaintNET...n-ORM-Maps</a><br />
</li>
<li>Installiere es in Paint.NET: kopiere die DLLs in den Effects-Ordner von Paint.NET<br />
</li>
</ol>
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.gridtalk.de/images/attachtypes/image.gif" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=11426" target="_blank" title="">PaintnetORM9.png</a> (Größe: 290,46 KB / Downloads: 54)
<!-- end: postbit_attachments_attachment --><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Schritt 2: Neue Heightmap erstellen</span></span><br />
<br />
<ol type="1" class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Datei → Neu</span> in Paint.NET<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Größe wählen</span> (in 256er-Schritten: 256, 512, 768, 1024, 1280, 1536, 2048... bis 4096):<br />
  <ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">256 × 256 Pixel</span> (kleine Region)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">512 × 512 oder 768 × 768 Pixel</span> (mittlere Region)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">1024 × 1024 oder 1536 × 1536 Pixel</span> (große Region)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">2048 × 2048 bis 4096 × 4096 Pixel</span> (sehr große Region)<br />
   </li>
</ul>
</li>
<li><span style="font-weight: bold;" class="mycode_b">Hintergrund wählen</span>:<br />
  <ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Für Wasser-Terrain</span>: RGB 40 (Wasseroberfläche)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Für Land-Terrain</span>: RGB 50-60 (10-20m über Wasser)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Standard</span>: RGB 128 (88m über Wasser - sehr hoch)<br />
   </li>
</ul>
</li>
</ol>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Schritt 3: Plugin verwenden</span></span><br />
<br />
Gehe zu <span style="font-weight: bold;" class="mycode_b">Effekte → ORM → Terrain Heightmap Generator</span><br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Plugin-Einstellungen</span></span><br />
<br />
Das Plugin hat 7 Einstellungen zur automatischen Terrain-Generierung:<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Die 7 Einstellungen</span><br />
<br />
<ol type="1" class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Zufalls-Seed</span> (0-99999)<br />
  <ul class="mycode_list"><li>Seed für die Zufallsgenerierung<br />
</li>
<li>0 = komplett zufällig<br />
</li>
<li>Gleicher Seed = gleiches Terrain (wiederholbar)<br />
   </li>
</ul>
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Inselgröße</span> (0.2-0.8)<br />
  <ul class="mycode_list"><li>Standardwert: 0.4<br />
</li>
<li>Bestimmt die Größe der generierten Insel<br />
</li>
<li>Kleinere Werte = kleinere Insel<br />
</li>
<li>Größere Werte = größere Insel<br />
   </li>
</ul>
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Berg-Intensität</span> (0.0-1.0)<br />
  <ul class="mycode_list"><li>Standardwert: 0.5<br />
</li>
<li>Wie stark ausgeprägt die Berge sind<br />
</li>
<li>0.0 = flach<br />
</li>
<li>1.0 = sehr bergig<br />
   </li>
</ul>
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Erosions-Iterationen</span> (0-10)<br />
  <ul class="mycode_list"><li>Standardwert: 3<br />
</li>
<li>Anzahl der Erosions-Durchgänge<br />
</li>
<li>Erzeugt sanftere Übergänge<br />
</li>
<li>Mehr Iterationen = weichere Landschaft<br />
   </li>
</ul>
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Fluss-Dichte</span> (0.0-1.0)<br />
  <ul class="mycode_list"><li>Standardwert: 0.3<br />
</li>
<li>Häufigkeit von Flüssen und Seen<br />
</li>
<li>0.0 = keine Flüsse<br />
</li>
<li>1.0 = viele Flüsse<br />
   </li>
</ul>
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Rausch-Skalierung</span> (1.0-10.0)<br />
  <ul class="mycode_list"><li>Standardwert: 4.0<br />
</li>
<li>Skalierung des Perlin-Noise<br />
</li>
<li>Höhere Werte = feinere Details<br />
</li>
<li>Niedrigere Werte = gröbere Strukturen<br />
   </li>
</ul>
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Rausch-Oktaven</span> (1-8)<br />
  <ul class="mycode_list"><li>Standardwert: 4<br />
</li>
<li>Anzahl der Perlin-Noise Schichten<br />
</li>
<li>Mehr Oktaven = mehr Details, aber langsamer<br />
   </li>
</ul>
</li>
</ol>
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Wasser und Berge</span></span><br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Wasser</span>: Dunklere Farben (RGB niedriger)<br />
 <ul class="mycode_list"><li>RGB 0-39 = unter Wasser (unter der Wasseroberfläche)<br />
</li>
<li>RGB 40 = Wasseroberfläche (0 Meter Höhe)<br />
  </li>
</ul>
</li>
<li><span style="font-weight: bold;" class="mycode_b">Land</span>: Hellere Farben (RGB höher als 40)<br />
 <ul class="mycode_list"><li>RGB 41 = 1 Meter über Wasser<br />
</li>
<li>RGB 255 = 215 Meter über Wasser (255 - 40 = 215)<br />
  </li>
</ul>
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Wichtig</span>: Höhe über Wasser = RGB-Wert - 40<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Praktische Werte für Anfänger</span></span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>Schwarz (0,0,0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 40 Meter unter Wasser (Meeresgrund)<br />
Dunkelgrau (40,40,40)&nbsp;&nbsp;&nbsp;&nbsp;= Wasseroberfläche (0m Höhe) Normal Null<br />
Grau (50,50,50)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 10 Meter über Wasser<br />
Grau (70,70,70)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 30 Meter über Wasser<br />
Mittelgrau (128,128,128) = 88 Meter über Wasser<br />
Hellgrau (200,200,200)&nbsp;&nbsp; = 160 Meter über Wasser<br />
Weiß (255,255,255)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 215 Meter über Wasser (höchster Punkt)</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Empfohlene Werte für OpenSim-Terrain:</span><br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Wasseroberfläche</span>: RGB 40 (0 Meter Höhe - Referenzpunkt) Normal Null<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Tiefster Punkt (Meeresgrund)</span>: RGB 0-30 (10-40 Meter unter Wasser)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Flaches Land</span>: RGB 41-45 (1-5 Meter über Wasser)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Hügel</span>: RGB 50-70 (10-30 Meter über Wasser)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Berge (empfohlen max.)</span>: RGB 70-90 (30-50 Meter über Wasser)<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Wichtig</span>: Berge über 30 Meter Höhe (RGB über 70) erscheinen in OpenSim proportional zu groß und können das Terrain verzerren. Für natürliche Landschaften wird empfohlen: RGB 40-90 (0-50 Meter über Wasser). Je größer die Region je höher können Berge sein, aber Vorsicht mit den Proportionen!<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Technische Grenze</span>: RGB 255 = 215 Meter über Wasser (möglich, aber nicht empfohlen für OpenSim)<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Schritt 4: Terrain generieren</span></span><br />
<br />
<ol type="1" class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Wähle deine Einstellungen</span> im Plugin-Dialog<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Klicke OK</span> - das Plugin generiert automatisch eine komplette Heightmap<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Nicht zufrieden?</span> Ändere die Einstellungen und probiere verschiedene Seeds<br />
</li>
</ol>
<br />
<span style="font-weight: bold;" class="mycode_b">Empfohlene Einstellungen für Anfänger:</span><br />
<ul class="mycode_list"><li>Inselgröße: 0.4<br />
</li>
<li>Berg-Intensität: 0.5<br />
</li>
<li>Erosions-Iterationen: 3-5<br />
</li>
<li>Fluss-Dichte: 0.3<br />
</li>
<li>Rausch-Skalierung: 4.0<br />
</li>
</ul>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Schritt 5: Nachbearbeitung (optional)</span></span><br />
<br />
Nutze die Standard-Paint.NET Werkzeuge für Anpassungen:<br />
<br />
<ol type="1" class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Pinsel-Werkzeug</span>: Manuell Bereiche aufhellen (Berge) oder abdunkeln (Täler)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Auswahl-Tools</span>: Bestimmte Bereiche auswählen und anpassen<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Farbverläufe</span>: Sanfte Übergänge erstellen<br />
</li>
</ol>
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Wege und Straßen mit Ebenen-Mischmodus hinzufügen</span></span><br />
<br />
Eine fortgeschrittene Technik für präzise Wege:<br />
<br />
<ol type="1" class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Neue Ebene erstellen</span>: Ebenen → Neue Ebene hinzufügen<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Weg zeichnen</span>: Mit Pinsel oder Linien-Werkzeug den Weg auf der neuen Ebene zeichnen<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Ebenen-Eigenschaften öffnen</span>: F4 oder Doppelklick auf die Ebene<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Mischmodus wählen</span>:<br />
  <ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">"Addition" oder "Aufhellen"</span>: Für erhöhte Wege/Straßen (hebt das Terrain an)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">"Subtraktion" oder "Abdunkeln"</span>: Für Flussbetten oder Gräben (senkt das Terrain ab)<br />
   </li>
</ul>
</li>
<li><span style="font-weight: bold;" class="mycode_b">Deckkraft anpassen</span>: Steuert die Intensität des Effekts (z.B. 30-50% für subtile Wege)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Ebenen zusammenführen</span>: Ebenen → Nach unten zusammenführen<br />
</li>
</ol>
<br />
<span style="font-weight: bold;" class="mycode_b">Vorteil</span>: Präzise Kontrolle über Höhenänderungen ohne das Basis-Terrain zu verändern.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Schritt 6: Weichzeichnen (wichtig!)</span></span><br />
<br />
<ol type="1" class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Effekte → Weichzeichnen → Gaußscher Weichzeichner</span><br />
</li>
<li>Radius: <span style="font-weight: bold;" class="mycode_b">1.5 - 2.0 Pixel</span><br />
</li>
<li>Zweck: Harte Kanten entfernen, natürlicheres Aussehen<br />
</li>
</ol>
<br />
<span style="font-weight: bold;" class="mycode_b">Hinweis</span>: Das Plugin hat bereits Erosions-Glättung integriert, daher kann dieser Schritt oft übersprungen werden.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Schritt 7: Exportieren</span></span><br />
<br />
<ol type="1" class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Datei → Speichern unter...</span><br />
</li>
<li>Format: <span style="font-weight: bold;" class="mycode_b">PNG</span><br />
</li>
<li>Bit-Tiefe: <span style="font-weight: bold;" class="mycode_b">24-Bit</span> (wichtig!)<br />
</li>
<li>Dateiname: z.B. <span style="font-family: courier;" class="mycode_font">mein_terrain.png</span><br />
</li>
</ol>
<br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Teil 3: Terrain in OpenSim laden</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Vorbereitung</span></span><br />
<br />
<ol type="1" class="mycode_list"><li>Speichere die PNG-Datei auf dem OpenSim-Server<br />
  <ul class="mycode_list"><li>Beispiel: <span style="font-family: courier;" class="mycode_font">/home/opensim/terrain/mein_terrain.png</span><br />
   </li>
</ul>
</li>
<li>Öffne die OpenSim-Konsole<br />
</li>
</ol>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Grundbefehl für eine Region</span></span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>terrain load /home/opensim/terrain/mein_terrain.png</code></div></div><br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Für mehrere Regionen (Beispiel 2x2 = 4 Regionen)</span></span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>terrain load /home/opensim/terrain/mein_terrain.png 2 2 0 0</code></div></div><br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Höhen überprüfen</span></span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>terrain stats</code></div></div><br />
Zeigt minimale und maximale Höhe an.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Höhen anpassen (wenn nötig)</span></span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>terrain rescale 0 40</code></div></div><br />
Setzt das Terrain auf 0-40 Meter Höhe (empfohlen für natürliche Proportionen in OpenSim).<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Tipp</span>: Verwende <span style="font-family: courier;" class="mycode_font">terrain rescale 0 50</span> als Maximum, da höhere Berge in OpenSim oft zu groß wirken.<br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Teil 4: Terrain-Befehle (Deutsche Erklärung)</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Basis-Befehle</span></span><br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain load &lt;datei&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Lädt Terrain aus einer Datei<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain load /pfad/terrain.png</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain load-tile</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Lädt einen Ausschnitt aus einer großen Datei<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain load-tile große_karte.png 0 0 256 256</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain save &lt;datei&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Speichert aktuelles Terrain<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain save /backup/terrain_backup.png</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain save-tile</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Speichert Terrain in eine größere Datei<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain save-tile gesamtkarte.png 100 100</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain fill &lt;wert&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Füllt komplettes Terrain mit einer Höhe<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain fill 20</span> (alles auf 20m)<br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain elevate &lt;wert&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Erhöht gesamtes Terrain<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain elevate 5</span> (+5 Meter)<br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain lower &lt;wert&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Senkt gesamtes Terrain<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain lower 3</span> (-3 Meter)<br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain multiply &lt;wert&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Multipliziert alle Höhen<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain multiply 1.5</span> (50% höher)<br />
</li>
</ul>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Fortgeschrittene Befehle</span></span><br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain bake</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Speichert Terrain dauerhaft<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain bake</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain revert</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Lädt gespeichertes Terrain zurück<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain revert</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain newbrushes</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Aktiviert neue Terrain-Werkzeuge<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain newbrushes on</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain show &lt;x&gt; &lt;y&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Zeigt Höhe an Position<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain show 128 128</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain stats</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Zeigt Terrain-Informationen<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain stats</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain effect &lt;effekt&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Führt Terrain-Effekt aus<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain effect smooth</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain flip &lt;x|y&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Spiegelt Terrain<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain flip x</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain rescale &lt;min&gt; &lt;max&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Skaliert Höhenbereich<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain rescale 0 30</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain min &lt;wert&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Setzt Mindesthöhe<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain min 10</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain max &lt;wert&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Setzt Maximalhöhe<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain max 50</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain modify &lt;befehl&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Bereichs-Bearbeitung<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain modify raise 10 10 20 20 5</span><br />
</li>
</ul>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Multi-Region Befehle</span></span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code># Für mehrere Regionen aus einer Datei:<br />
terrain load grosse_karte.png 4 4 0 0<br />
# Erklärung: Lädt 4x4 Regionen, startend bei Region (0,0)</code></div></div><br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Terrain-Texturen setzen</span></span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code># Textur-Höhen für Ecken setzen:<br />
set terrain heights &lt;ecke&gt; &lt;min&gt; &lt;max&gt; [x] [y]<br />
# Ecken: SW=0, NW=1, SE=2, NE=3<br />
<br />
# Beispiel: Südwest-Ecke auf 0-20 Meter setzen:<br />
set terrain heights 0 0 20<br />
<br />
# Terrain-Textur setzen:<br />
set terrain texture &lt;nummer&gt; &lt;uuid&gt;<br />
# Beispiel erste Textur setzen:<br />
set terrain texture 0 00000000-0000-0000-0000-000000000001</code></div></div><br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Teil 5: Tipps für Anfänger</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">1. Immer zuerst testen!</span></span><br />
<ul class="mycode_list"><li>Erstelle eine kleine Test-Region<br />
</li>
<li>Probiere einfache Heightmaps aus<br />
</li>
<li>Verwende <span style="font-family: courier;" class="mycode_font">terrain save</span> um Backups zu machen<br />
</li>
</ul>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">2. Höhen kontrollieren:</span></span><br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Wasseroberfläche</span>: RGB 40 (0 Meter - Referenzhöhe)<br />
</li>
<li>Technisch möglich: -40 bis +215 Meter (RGB 0-255)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Empfohlen für OpenSim</span>: RGB 40-90 (0-50 Meter über Wasser)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Grund</span>: Berge über 30 Meter (RGB &gt; 70) erscheinen proportional zu groß und verzerren das Terrain<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Formel</span>: Höhe Wasser = RGB-Wert - 40<br />
</li>
</ul>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">3. Fehlerbehebung:</span></span><br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Terrain erscheint nicht?</span> → Simulator neustarten<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Falsche Höhen?</span> → <span style="font-family: courier;" class="mycode_font">terrain rescale</span> verwenden<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Datei nicht gefunden?</span> → Vollständigen Pfad angeben<br />
</li>
</ul>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">4. Optimaler Workflow:</span></span><br />
<br />
<ol type="1" class="mycode_list"><li>In Paint.NET mit ORM-Plugin erstellen<br />
</li>
<li>Weichzeichnen (Gaußscher Filter)<br />
</li>
<li>Als 24-Bit PNG speichern<br />
</li>
<li>Auf Server kopieren<br />
</li>
<li><span style="font-family: courier;" class="mycode_font">terrain load</span> ausführen<br />
</li>
<li>Mit <span style="font-family: courier;" class="mycode_font">terrain stats</span> prüfen<br />
</li>
<li>Bei Bedarf mit <span style="font-family: courier;" class="mycode_font">terrain rescale</span> anpassen<br />
</li>
</ol>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">5. Empfohlene Einstellungen für den Anfang:</span></span><br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Bildgröße</span> (in 256er-Schritten möglich):<br />
 <ul class="mycode_list"><li>Anfänger: 256×256 Pixel<br />
</li>
<li>Fortgeschritten: 512×512, 768×768 oder 1024×1024 Pixel<br />
</li>
<li>Experten: 1536×1536, 2048×2048 oder größer bis 4096×4096 Pixel<br />
  </li>
</ul>
</li>
<li><span style="font-weight: bold;" class="mycode_b">Höhenbereich</span>: RGB 40-90 (0-50 Meter über Wasser) - optimal für OpenSim<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Wasseroberfläche</span>: RGB 40 (0 Meter Referenzhöhe)<br />
</li>
<li>Weichzeichnen: Radius 1.5-2.0<br />
</li>
<li>Export: 24-Bit PNG<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Wichtig</span>: Berge über 30-40 Meter wirken in OpenSim oft zu groß und verzerren die Proportionen!<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Hinweis</span>: Größere Regionen benötigen mehr Rechenleistung und Speicher in OpenSim!<br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Teil 6: Beispiel-Projekt</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Einfache Insel erstellen</span></span><br />
<br />
<ol type="1" class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Hintergrund</span>: Dunkelgrau RGB 40 (Wasseroberfläche = 0 Meter Höhe)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Inselform</span>: Ovale, hellere Fläche in der Mitte<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Berg in der Mitte</span>: Weißer Kreis<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Strand</span>: Hellgrauer Ring um die Insel<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Weichzeichnen</span>: Radius 2.0<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Exportieren</span>: <span style="font-family: courier;" class="mycode_font">insel.png</span><br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">In OpenSim laden</span>: <span style="font-family: courier;" class="mycode_font">terrain load /pfad/insel.png</span><br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Höhen prüfen</span>: <span style="font-family: courier;" class="mycode_font">terrain stats</span><br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Anpassen</span>: <span style="font-family: courier;" class="mycode_font">terrain rescale 0 40</span><br />
</li>
</ol>
<br />
Das Ganze ist nicht frei von Irrtümern oder Fehlern, aber in etwa kann man das als Anfänger Anleitung durchgehen lassen.]]></description>
			<content:encoded><![CDATA[<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Anfänger-Anleitung: OpenSim Terrain mit ORM Terrain Generator erstellen</span></span><br />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Teil 1: Grundlagen verstehen</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Was ist eine Heightmap?</span></span><br />
<br />
Eine Heightmap (Höhenkarte) ist ein schwarz-weißes Bild, bei dem:<br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Schwarz</span> = tiefste Stelle (oft 0 Meter)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Weiß</span> = höchste Stelle (oft 100 Meter)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Grautöne</span> = Höhen dazwischen<br />
</li>
</ul>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Wichtige Maße</span></span><br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">1 OpenSim-Region</span> = 256 × 256 bis 4096 × 4096 Meter<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">1 Pixel</span> in der Heightmap = <span style="font-weight: bold;" class="mycode_b">1 Meter</span> in OpenSim<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Gängige Regiongrößen</span> (in 256er-Schritten):<br />
 <ul class="mycode_list"><li>Klein: 256 × 256 Pixel<br />
</li>
<li>Mittel: 512 × 512 oder 768 × 768 Pixel<br />
</li>
<li>Groß: 1024 × 1024 oder 1536 × 1536 Pixel<br />
</li>
<li>Sehr groß: 2048 × 2048, 3072 × 3072 oder 4096 × 4096 Pixel<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Hinweis</span>: Jede Größe in 256er-Schritten ist möglich (256, 512, 768, 1024, 1280, 1536...)<br />
  </li>
</ul>
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: red;" class="mycode_color">Wichtig im Prompt der OpenSim Konsole steht der Regionsname sollte dort Root stehen gilt alles was gemacht wird für alle Regionen.</span></span><br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Teil 2: ORM Terrain Generator in Paint.NET verwenden</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Schritt 1: Installation</span></span><br />
<br />
<ol type="1" class="mycode_list"><li>Lade das Plugin von GitHub: <a href="https://github.com/ManfredAabye/PaintNET-Plugin-ORM-Maps" target="_blank" rel="noopener" class="mycode_url">https://github.com/ManfredAabye/PaintNET...n-ORM-Maps</a><br />
</li>
<li>Installiere es in Paint.NET: kopiere die DLLs in den Effects-Ordner von Paint.NET<br />
</li>
</ol>
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.gridtalk.de/images/attachtypes/image.gif" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=11426" target="_blank" title="">PaintnetORM9.png</a> (Größe: 290,46 KB / Downloads: 54)
<!-- end: postbit_attachments_attachment --><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Schritt 2: Neue Heightmap erstellen</span></span><br />
<br />
<ol type="1" class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Datei → Neu</span> in Paint.NET<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Größe wählen</span> (in 256er-Schritten: 256, 512, 768, 1024, 1280, 1536, 2048... bis 4096):<br />
  <ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">256 × 256 Pixel</span> (kleine Region)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">512 × 512 oder 768 × 768 Pixel</span> (mittlere Region)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">1024 × 1024 oder 1536 × 1536 Pixel</span> (große Region)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">2048 × 2048 bis 4096 × 4096 Pixel</span> (sehr große Region)<br />
   </li>
</ul>
</li>
<li><span style="font-weight: bold;" class="mycode_b">Hintergrund wählen</span>:<br />
  <ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Für Wasser-Terrain</span>: RGB 40 (Wasseroberfläche)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Für Land-Terrain</span>: RGB 50-60 (10-20m über Wasser)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Standard</span>: RGB 128 (88m über Wasser - sehr hoch)<br />
   </li>
</ul>
</li>
</ol>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Schritt 3: Plugin verwenden</span></span><br />
<br />
Gehe zu <span style="font-weight: bold;" class="mycode_b">Effekte → ORM → Terrain Heightmap Generator</span><br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Plugin-Einstellungen</span></span><br />
<br />
Das Plugin hat 7 Einstellungen zur automatischen Terrain-Generierung:<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Die 7 Einstellungen</span><br />
<br />
<ol type="1" class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Zufalls-Seed</span> (0-99999)<br />
  <ul class="mycode_list"><li>Seed für die Zufallsgenerierung<br />
</li>
<li>0 = komplett zufällig<br />
</li>
<li>Gleicher Seed = gleiches Terrain (wiederholbar)<br />
   </li>
</ul>
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Inselgröße</span> (0.2-0.8)<br />
  <ul class="mycode_list"><li>Standardwert: 0.4<br />
</li>
<li>Bestimmt die Größe der generierten Insel<br />
</li>
<li>Kleinere Werte = kleinere Insel<br />
</li>
<li>Größere Werte = größere Insel<br />
   </li>
</ul>
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Berg-Intensität</span> (0.0-1.0)<br />
  <ul class="mycode_list"><li>Standardwert: 0.5<br />
</li>
<li>Wie stark ausgeprägt die Berge sind<br />
</li>
<li>0.0 = flach<br />
</li>
<li>1.0 = sehr bergig<br />
   </li>
</ul>
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Erosions-Iterationen</span> (0-10)<br />
  <ul class="mycode_list"><li>Standardwert: 3<br />
</li>
<li>Anzahl der Erosions-Durchgänge<br />
</li>
<li>Erzeugt sanftere Übergänge<br />
</li>
<li>Mehr Iterationen = weichere Landschaft<br />
   </li>
</ul>
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Fluss-Dichte</span> (0.0-1.0)<br />
  <ul class="mycode_list"><li>Standardwert: 0.3<br />
</li>
<li>Häufigkeit von Flüssen und Seen<br />
</li>
<li>0.0 = keine Flüsse<br />
</li>
<li>1.0 = viele Flüsse<br />
   </li>
</ul>
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Rausch-Skalierung</span> (1.0-10.0)<br />
  <ul class="mycode_list"><li>Standardwert: 4.0<br />
</li>
<li>Skalierung des Perlin-Noise<br />
</li>
<li>Höhere Werte = feinere Details<br />
</li>
<li>Niedrigere Werte = gröbere Strukturen<br />
   </li>
</ul>
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Rausch-Oktaven</span> (1-8)<br />
  <ul class="mycode_list"><li>Standardwert: 4<br />
</li>
<li>Anzahl der Perlin-Noise Schichten<br />
</li>
<li>Mehr Oktaven = mehr Details, aber langsamer<br />
   </li>
</ul>
</li>
</ol>
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Wasser und Berge</span></span><br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Wasser</span>: Dunklere Farben (RGB niedriger)<br />
 <ul class="mycode_list"><li>RGB 0-39 = unter Wasser (unter der Wasseroberfläche)<br />
</li>
<li>RGB 40 = Wasseroberfläche (0 Meter Höhe)<br />
  </li>
</ul>
</li>
<li><span style="font-weight: bold;" class="mycode_b">Land</span>: Hellere Farben (RGB höher als 40)<br />
 <ul class="mycode_list"><li>RGB 41 = 1 Meter über Wasser<br />
</li>
<li>RGB 255 = 215 Meter über Wasser (255 - 40 = 215)<br />
  </li>
</ul>
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Wichtig</span>: Höhe über Wasser = RGB-Wert - 40<br />
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Praktische Werte für Anfänger</span></span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>Schwarz (0,0,0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 40 Meter unter Wasser (Meeresgrund)<br />
Dunkelgrau (40,40,40)&nbsp;&nbsp;&nbsp;&nbsp;= Wasseroberfläche (0m Höhe) Normal Null<br />
Grau (50,50,50)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 10 Meter über Wasser<br />
Grau (70,70,70)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 30 Meter über Wasser<br />
Mittelgrau (128,128,128) = 88 Meter über Wasser<br />
Hellgrau (200,200,200)&nbsp;&nbsp; = 160 Meter über Wasser<br />
Weiß (255,255,255)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 215 Meter über Wasser (höchster Punkt)</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Empfohlene Werte für OpenSim-Terrain:</span><br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Wasseroberfläche</span>: RGB 40 (0 Meter Höhe - Referenzpunkt) Normal Null<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Tiefster Punkt (Meeresgrund)</span>: RGB 0-30 (10-40 Meter unter Wasser)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Flaches Land</span>: RGB 41-45 (1-5 Meter über Wasser)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Hügel</span>: RGB 50-70 (10-30 Meter über Wasser)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Berge (empfohlen max.)</span>: RGB 70-90 (30-50 Meter über Wasser)<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Wichtig</span>: Berge über 30 Meter Höhe (RGB über 70) erscheinen in OpenSim proportional zu groß und können das Terrain verzerren. Für natürliche Landschaften wird empfohlen: RGB 40-90 (0-50 Meter über Wasser). Je größer die Region je höher können Berge sein, aber Vorsicht mit den Proportionen!<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Technische Grenze</span>: RGB 255 = 215 Meter über Wasser (möglich, aber nicht empfohlen für OpenSim)<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Schritt 4: Terrain generieren</span></span><br />
<br />
<ol type="1" class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Wähle deine Einstellungen</span> im Plugin-Dialog<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Klicke OK</span> - das Plugin generiert automatisch eine komplette Heightmap<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Nicht zufrieden?</span> Ändere die Einstellungen und probiere verschiedene Seeds<br />
</li>
</ol>
<br />
<span style="font-weight: bold;" class="mycode_b">Empfohlene Einstellungen für Anfänger:</span><br />
<ul class="mycode_list"><li>Inselgröße: 0.4<br />
</li>
<li>Berg-Intensität: 0.5<br />
</li>
<li>Erosions-Iterationen: 3-5<br />
</li>
<li>Fluss-Dichte: 0.3<br />
</li>
<li>Rausch-Skalierung: 4.0<br />
</li>
</ul>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Schritt 5: Nachbearbeitung (optional)</span></span><br />
<br />
Nutze die Standard-Paint.NET Werkzeuge für Anpassungen:<br />
<br />
<ol type="1" class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Pinsel-Werkzeug</span>: Manuell Bereiche aufhellen (Berge) oder abdunkeln (Täler)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Auswahl-Tools</span>: Bestimmte Bereiche auswählen und anpassen<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Farbverläufe</span>: Sanfte Übergänge erstellen<br />
</li>
</ol>
<br />
<span style="font-size: medium;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Wege und Straßen mit Ebenen-Mischmodus hinzufügen</span></span><br />
<br />
Eine fortgeschrittene Technik für präzise Wege:<br />
<br />
<ol type="1" class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Neue Ebene erstellen</span>: Ebenen → Neue Ebene hinzufügen<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Weg zeichnen</span>: Mit Pinsel oder Linien-Werkzeug den Weg auf der neuen Ebene zeichnen<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Ebenen-Eigenschaften öffnen</span>: F4 oder Doppelklick auf die Ebene<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Mischmodus wählen</span>:<br />
  <ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">"Addition" oder "Aufhellen"</span>: Für erhöhte Wege/Straßen (hebt das Terrain an)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">"Subtraktion" oder "Abdunkeln"</span>: Für Flussbetten oder Gräben (senkt das Terrain ab)<br />
   </li>
</ul>
</li>
<li><span style="font-weight: bold;" class="mycode_b">Deckkraft anpassen</span>: Steuert die Intensität des Effekts (z.B. 30-50% für subtile Wege)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Ebenen zusammenführen</span>: Ebenen → Nach unten zusammenführen<br />
</li>
</ol>
<br />
<span style="font-weight: bold;" class="mycode_b">Vorteil</span>: Präzise Kontrolle über Höhenänderungen ohne das Basis-Terrain zu verändern.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Schritt 6: Weichzeichnen (wichtig!)</span></span><br />
<br />
<ol type="1" class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Effekte → Weichzeichnen → Gaußscher Weichzeichner</span><br />
</li>
<li>Radius: <span style="font-weight: bold;" class="mycode_b">1.5 - 2.0 Pixel</span><br />
</li>
<li>Zweck: Harte Kanten entfernen, natürlicheres Aussehen<br />
</li>
</ol>
<br />
<span style="font-weight: bold;" class="mycode_b">Hinweis</span>: Das Plugin hat bereits Erosions-Glättung integriert, daher kann dieser Schritt oft übersprungen werden.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Schritt 7: Exportieren</span></span><br />
<br />
<ol type="1" class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Datei → Speichern unter...</span><br />
</li>
<li>Format: <span style="font-weight: bold;" class="mycode_b">PNG</span><br />
</li>
<li>Bit-Tiefe: <span style="font-weight: bold;" class="mycode_b">24-Bit</span> (wichtig!)<br />
</li>
<li>Dateiname: z.B. <span style="font-family: courier;" class="mycode_font">mein_terrain.png</span><br />
</li>
</ol>
<br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Teil 3: Terrain in OpenSim laden</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Vorbereitung</span></span><br />
<br />
<ol type="1" class="mycode_list"><li>Speichere die PNG-Datei auf dem OpenSim-Server<br />
  <ul class="mycode_list"><li>Beispiel: <span style="font-family: courier;" class="mycode_font">/home/opensim/terrain/mein_terrain.png</span><br />
   </li>
</ul>
</li>
<li>Öffne die OpenSim-Konsole<br />
</li>
</ol>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Grundbefehl für eine Region</span></span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>terrain load /home/opensim/terrain/mein_terrain.png</code></div></div><br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Für mehrere Regionen (Beispiel 2x2 = 4 Regionen)</span></span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>terrain load /home/opensim/terrain/mein_terrain.png 2 2 0 0</code></div></div><br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Höhen überprüfen</span></span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>terrain stats</code></div></div><br />
Zeigt minimale und maximale Höhe an.<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Höhen anpassen (wenn nötig)</span></span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>terrain rescale 0 40</code></div></div><br />
Setzt das Terrain auf 0-40 Meter Höhe (empfohlen für natürliche Proportionen in OpenSim).<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Tipp</span>: Verwende <span style="font-family: courier;" class="mycode_font">terrain rescale 0 50</span> als Maximum, da höhere Berge in OpenSim oft zu groß wirken.<br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Teil 4: Terrain-Befehle (Deutsche Erklärung)</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Basis-Befehle</span></span><br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain load &lt;datei&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Lädt Terrain aus einer Datei<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain load /pfad/terrain.png</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain load-tile</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Lädt einen Ausschnitt aus einer großen Datei<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain load-tile große_karte.png 0 0 256 256</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain save &lt;datei&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Speichert aktuelles Terrain<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain save /backup/terrain_backup.png</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain save-tile</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Speichert Terrain in eine größere Datei<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain save-tile gesamtkarte.png 100 100</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain fill &lt;wert&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Füllt komplettes Terrain mit einer Höhe<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain fill 20</span> (alles auf 20m)<br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain elevate &lt;wert&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Erhöht gesamtes Terrain<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain elevate 5</span> (+5 Meter)<br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain lower &lt;wert&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Senkt gesamtes Terrain<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain lower 3</span> (-3 Meter)<br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain multiply &lt;wert&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Multipliziert alle Höhen<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain multiply 1.5</span> (50% höher)<br />
</li>
</ul>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Fortgeschrittene Befehle</span></span><br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain bake</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Speichert Terrain dauerhaft<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain bake</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain revert</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Lädt gespeichertes Terrain zurück<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain revert</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain newbrushes</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Aktiviert neue Terrain-Werkzeuge<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain newbrushes on</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain show &lt;x&gt; &lt;y&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Zeigt Höhe an Position<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain show 128 128</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain stats</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Zeigt Terrain-Informationen<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain stats</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain effect &lt;effekt&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Führt Terrain-Effekt aus<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain effect smooth</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain flip &lt;x|y&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Spiegelt Terrain<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain flip x</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain rescale &lt;min&gt; &lt;max&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Skaliert Höhenbereich<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain rescale 0 30</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain min &lt;wert&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Setzt Mindesthöhe<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain min 10</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain max &lt;wert&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Setzt Maximalhöhe<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain max 50</span><br />
<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Befehl:</span> <span style="font-family: courier;" class="mycode_font">terrain modify &lt;befehl&gt;</span><br />
<span style="font-weight: bold;" class="mycode_b">Erklärung:</span> Bereichs-Bearbeitung<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span> <span style="font-family: courier;" class="mycode_font">terrain modify raise 10 10 20 20 5</span><br />
</li>
</ul>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Multi-Region Befehle</span></span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code># Für mehrere Regionen aus einer Datei:<br />
terrain load grosse_karte.png 4 4 0 0<br />
# Erklärung: Lädt 4x4 Regionen, startend bei Region (0,0)</code></div></div><br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Terrain-Texturen setzen</span></span><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code># Textur-Höhen für Ecken setzen:<br />
set terrain heights &lt;ecke&gt; &lt;min&gt; &lt;max&gt; [x] [y]<br />
# Ecken: SW=0, NW=1, SE=2, NE=3<br />
<br />
# Beispiel: Südwest-Ecke auf 0-20 Meter setzen:<br />
set terrain heights 0 0 20<br />
<br />
# Terrain-Textur setzen:<br />
set terrain texture &lt;nummer&gt; &lt;uuid&gt;<br />
# Beispiel erste Textur setzen:<br />
set terrain texture 0 00000000-0000-0000-0000-000000000001</code></div></div><br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Teil 5: Tipps für Anfänger</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">1. Immer zuerst testen!</span></span><br />
<ul class="mycode_list"><li>Erstelle eine kleine Test-Region<br />
</li>
<li>Probiere einfache Heightmaps aus<br />
</li>
<li>Verwende <span style="font-family: courier;" class="mycode_font">terrain save</span> um Backups zu machen<br />
</li>
</ul>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">2. Höhen kontrollieren:</span></span><br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Wasseroberfläche</span>: RGB 40 (0 Meter - Referenzhöhe)<br />
</li>
<li>Technisch möglich: -40 bis +215 Meter (RGB 0-255)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Empfohlen für OpenSim</span>: RGB 40-90 (0-50 Meter über Wasser)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Grund</span>: Berge über 30 Meter (RGB &gt; 70) erscheinen proportional zu groß und verzerren das Terrain<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Formel</span>: Höhe Wasser = RGB-Wert - 40<br />
</li>
</ul>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">3. Fehlerbehebung:</span></span><br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Terrain erscheint nicht?</span> → Simulator neustarten<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Falsche Höhen?</span> → <span style="font-family: courier;" class="mycode_font">terrain rescale</span> verwenden<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Datei nicht gefunden?</span> → Vollständigen Pfad angeben<br />
</li>
</ul>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">4. Optimaler Workflow:</span></span><br />
<br />
<ol type="1" class="mycode_list"><li>In Paint.NET mit ORM-Plugin erstellen<br />
</li>
<li>Weichzeichnen (Gaußscher Filter)<br />
</li>
<li>Als 24-Bit PNG speichern<br />
</li>
<li>Auf Server kopieren<br />
</li>
<li><span style="font-family: courier;" class="mycode_font">terrain load</span> ausführen<br />
</li>
<li>Mit <span style="font-family: courier;" class="mycode_font">terrain stats</span> prüfen<br />
</li>
<li>Bei Bedarf mit <span style="font-family: courier;" class="mycode_font">terrain rescale</span> anpassen<br />
</li>
</ol>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">5. Empfohlene Einstellungen für den Anfang:</span></span><br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Bildgröße</span> (in 256er-Schritten möglich):<br />
 <ul class="mycode_list"><li>Anfänger: 256×256 Pixel<br />
</li>
<li>Fortgeschritten: 512×512, 768×768 oder 1024×1024 Pixel<br />
</li>
<li>Experten: 1536×1536, 2048×2048 oder größer bis 4096×4096 Pixel<br />
  </li>
</ul>
</li>
<li><span style="font-weight: bold;" class="mycode_b">Höhenbereich</span>: RGB 40-90 (0-50 Meter über Wasser) - optimal für OpenSim<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Wasseroberfläche</span>: RGB 40 (0 Meter Referenzhöhe)<br />
</li>
<li>Weichzeichnen: Radius 1.5-2.0<br />
</li>
<li>Export: 24-Bit PNG<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Wichtig</span>: Berge über 30-40 Meter wirken in OpenSim oft zu groß und verzerren die Proportionen!<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Hinweis</span>: Größere Regionen benötigen mehr Rechenleistung und Speicher in OpenSim!<br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Teil 6: Beispiel-Projekt</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Einfache Insel erstellen</span></span><br />
<br />
<ol type="1" class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Hintergrund</span>: Dunkelgrau RGB 40 (Wasseroberfläche = 0 Meter Höhe)<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Inselform</span>: Ovale, hellere Fläche in der Mitte<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Berg in der Mitte</span>: Weißer Kreis<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Strand</span>: Hellgrauer Ring um die Insel<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Weichzeichnen</span>: Radius 2.0<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Exportieren</span>: <span style="font-family: courier;" class="mycode_font">insel.png</span><br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">In OpenSim laden</span>: <span style="font-family: courier;" class="mycode_font">terrain load /pfad/insel.png</span><br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Höhen prüfen</span>: <span style="font-family: courier;" class="mycode_font">terrain stats</span><br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Anpassen</span>: <span style="font-family: courier;" class="mycode_font">terrain rescale 0 40</span><br />
</li>
</ol>
<br />
Das Ganze ist nicht frei von Irrtümern oder Fehlern, aber in etwa kann man das als Anfänger Anleitung durchgehen lassen.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[OpenSim (O)RM Map Generator]]></title>
			<link>https://www.gridtalk.de/showthread.php?tid=5236</link>
			<pubDate>Sun, 30 Nov 2025 13:53:45 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://www.gridtalk.de/member.php?action=profile&uid=998">Manfred Aabye</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.gridtalk.de/showthread.php?tid=5236</guid>
			<description><![CDATA[<span style="font-size: xx-large;" class="mycode_size">OpenSim (O)RM Map Generator</span><br />
ORM Materialien spiegeln die eigenschaft eines Materials wieder.<br />
Beispiel: Jeans Stoff kann für mehrere Jeans, Schuhe oder Mobillar genutzt werden egal welche Farbe diese Objekte haben es zählt nur die Grundstruktur.<br />
<br />
Funktion: Programm starten - Ordner auswählen der Texturen - von zum Beispiel <a href="https://freepbr.com/" target="_blank" rel="noopener" class="mycode_url">freepbr</a> enthält - dann generieren - und sie werden alle gespeichert.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Python Beispiel:</span><br />
<div class="codeblock phpcodeblock"><div class="title">PHP-Code:</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">import&nbsp;os<br />import&nbsp;tkinter&nbsp;</span><span style="color: #007700">as&nbsp;</span><span style="color: #0000BB">tk<br />from&nbsp;tkinter&nbsp;import&nbsp;filedialog</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">messagebox</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">ttk<br />from&nbsp;PIL&nbsp;import&nbsp;Image<br />import&nbsp;glob<br />import&nbsp;threading<br /><br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">ORMGeneratorGUI</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">def&nbsp;__init__</span><span style="color: #007700">(</span><span style="color: #0000BB">self</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">root</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">root&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">root<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self</span><span style="color: #007700">.</span><span style="color: #0000BB">root</span><span style="color: #007700">.</span><span style="color: #0000BB">title</span><span style="color: #007700">(</span><span style="color: #DD0000">"OpenSim&nbsp;(O)RM&nbsp;Map&nbsp;Generator"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">root</span><span style="color: #007700">.</span><span style="color: #0000BB">geometry</span><span style="color: #007700">(</span><span style="color: #DD0000">"600x400"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Variablen<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">input_dir&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">StringVar</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">output_dir&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">StringVar</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">progress&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">DoubleVar</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">status&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">StringVar</span><span style="color: #007700">(</span><span style="color: #0000BB">value</span><span style="color: #007700">=</span><span style="color: #DD0000">"Bereit"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">setup_ui</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">def&nbsp;setup_ui</span><span style="color: #007700">(</span><span style="color: #0000BB">self</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Hauptframe<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">main_frame&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Frame</span><span style="color: #007700">(</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">root</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">padding</span><span style="color: #007700">=</span><span style="color: #DD0000">"10"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">.</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #DD0000">"nsew"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Root-Fenster&nbsp;Grid-Konfiguration<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">root</span><span style="color: #007700">.</span><span style="color: #0000BB">columnconfigure</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">weight</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">root</span><span style="color: #007700">.</span><span style="color: #0000BB">rowconfigure</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">weight</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Titel<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">title_label&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Label</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"OpenSim&nbsp;(O)RM&nbsp;Map&nbsp;Generator"</span><span style="color: #007700">,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">font</span><span style="color: #007700">=(</span><span style="color: #DD0000">"Arial"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">16</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"bold"</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">title_label</span><span style="color: #007700">.</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">columnspan</span><span style="color: #007700">=</span><span style="color: #0000BB">3</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=(</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">20</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Eingabe-Verzeichnis&nbsp;Auswahl<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Label</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"Eingabe-Verzeichnis:"</span><span style="color: #007700">).</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">W</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Entry</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">textvariable</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">width</span><span style="color: #007700">=</span><span style="color: #0000BB">50</span><span style="color: #007700">).</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">padx</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Button</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"Durchsuchen"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">command</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">browse_input_dir</span><span style="color: #007700">).</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">2</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Ausgabe-Verzeichnis&nbsp;Auswahl<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Label</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"Ausgabe-Verzeichnis:"</span><span style="color: #007700">).</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">2</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">W</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Entry</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">textvariable</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">output_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">width</span><span style="color: #007700">=</span><span style="color: #0000BB">50</span><span style="color: #007700">).</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">2</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">padx</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Button</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"Durchsuchen"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">command</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">browse_output_dir</span><span style="color: #007700">).</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">2</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">2</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Optionen<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">options_frame&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">LabelFrame</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"Optionen"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">padding</span><span style="color: #007700">=</span><span style="color: #DD0000">"5"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">options_frame</span><span style="color: #007700">.</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">3</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">columnspan</span><span style="color: #007700">=</span><span style="color: #0000BB">3</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #DD0000">"ew"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">10</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">use_height_for_ao&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">BooleanVar</span><span style="color: #007700">(</span><span style="color: #0000BB">value</span><span style="color: #007700">=</span><span style="color: #0000BB">True</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Checkbutton</span><span style="color: #007700">(</span><span style="color: #0000BB">options_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"Height&nbsp;Map&nbsp;für&nbsp;AO&nbsp;verwenden&nbsp;(falls&nbsp;AO&nbsp;fehlt)"</span><span style="color: #007700">,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">variable</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">use_height_for_ao</span><span style="color: #007700">).</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">W</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">overwrite_existing&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">BooleanVar</span><span style="color: #007700">(</span><span style="color: #0000BB">value</span><span style="color: #007700">=</span><span style="color: #0000BB">False</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Checkbutton</span><span style="color: #007700">(</span><span style="color: #0000BB">options_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"Existierende&nbsp;ORM-Maps&nbsp;überschreiben"</span><span style="color: #007700">,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">variable</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">overwrite_existing</span><span style="color: #007700">).</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">W</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Fortschrittsbalken<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Label</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"Fortschritt:"</span><span style="color: #007700">).</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">4</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">W</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=(</span><span style="color: #0000BB">10</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">progress_bar&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Progressbar</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">variable</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">progress</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">length</span><span style="color: #007700">=</span><span style="color: #0000BB">500</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">progress_bar</span><span style="color: #007700">.</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">columnspan</span><span style="color: #007700">=</span><span style="color: #0000BB">3</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #DD0000">"ew"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Status-Anzeige<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">status_label&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Label</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">textvariable</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">status</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">status_label</span><span style="color: #007700">.</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">6</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">columnspan</span><span style="color: #007700">=</span><span style="color: #0000BB">3</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Buttons<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">button_frame&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Frame</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">button_frame</span><span style="color: #007700">.</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">7</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">columnspan</span><span style="color: #007700">=</span><span style="color: #0000BB">3</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">20</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Button</span><span style="color: #007700">(</span><span style="color: #0000BB">button_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"ORM-Maps&nbsp;generieren"</span><span style="color: #007700">,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">command</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">start_generation</span><span style="color: #007700">).</span><span style="color: #0000BB">pack</span><span style="color: #007700">(</span><span style="color: #0000BB">side</span><span style="color: #007700">=</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">LEFT</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">padx</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Button</span><span style="color: #007700">(</span><span style="color: #0000BB">button_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"Beenden"</span><span style="color: #007700">,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">command</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">root</span><span style="color: #007700">.</span><span style="color: #0000BB">quit</span><span style="color: #007700">).</span><span style="color: #0000BB">pack</span><span style="color: #007700">(</span><span style="color: #0000BB">side</span><span style="color: #007700">=</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">LEFT</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">padx</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Log-Ausgabe<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">log_frame&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">LabelFrame</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"Log"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">padding</span><span style="color: #007700">=</span><span style="color: #DD0000">"5"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">log_frame</span><span style="color: #007700">.</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">8</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">columnspan</span><span style="color: #007700">=</span><span style="color: #0000BB">3</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #DD0000">"nsew"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">10</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log_text&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">Text</span><span style="color: #007700">(</span><span style="color: #0000BB">log_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">height</span><span style="color: #007700">=</span><span style="color: #0000BB">8</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">width</span><span style="color: #007700">=</span><span style="color: #0000BB">70</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">scrollbar&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Scrollbar</span><span style="color: #007700">(</span><span style="color: #0000BB">log_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">orient</span><span style="color: #007700">=</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">VERTICAL</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">command</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log_text</span><span style="color: #007700">.</span><span style="color: #0000BB">yview</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log_text</span><span style="color: #007700">.</span><span style="color: #0000BB">configure</span><span style="color: #007700">(</span><span style="color: #0000BB">yscrollcommand</span><span style="color: #007700">=</span><span style="color: #0000BB">scrollbar</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log_text</span><span style="color: #007700">.</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #DD0000">"nsew"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">scrollbar</span><span style="color: #007700">.</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #DD0000">"ns"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Grid-Konfiguration<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">.</span><span style="color: #0000BB">columnconfigure</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">weight</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">log_frame</span><span style="color: #007700">.</span><span style="color: #0000BB">columnconfigure</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">weight</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">log_frame</span><span style="color: #007700">.</span><span style="color: #0000BB">rowconfigure</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">weight</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">.</span><span style="color: #0000BB">rowconfigure</span><span style="color: #007700">(</span><span style="color: #0000BB">8</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">weight</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">def&nbsp;browse_input_dir</span><span style="color: #007700">(</span><span style="color: #0000BB">self</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">directory&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">filedialog</span><span style="color: #007700">.</span><span style="color: #0000BB">askdirectory</span><span style="color: #007700">(</span><span style="color: #0000BB">title</span><span style="color: #007700">=</span><span style="color: #DD0000">"Eingabe-Verzeichnis&nbsp;auswählen"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">directory</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #0000BB">directory</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Automatisch&nbsp;Output-Verzeichnis&nbsp;vorschlagen<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if&nbsp;</span><span style="color: #0000BB">not&nbsp;self</span><span style="color: #007700">.</span><span style="color: #0000BB">output_dir</span><span style="color: #007700">.</span><span style="color: #0000BB">get</span><span style="color: #007700">():<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">output_dir</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">join</span><span style="color: #007700">(</span><span style="color: #0000BB">directory</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"ORM_Maps"</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">def&nbsp;browse_output_dir</span><span style="color: #007700">(</span><span style="color: #0000BB">self</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">directory&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">filedialog</span><span style="color: #007700">.</span><span style="color: #0000BB">askdirectory</span><span style="color: #007700">(</span><span style="color: #0000BB">title</span><span style="color: #007700">=</span><span style="color: #DD0000">"Ausgabe-Verzeichnis&nbsp;auswählen"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">directory</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">output_dir</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #0000BB">directory</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">def&nbsp;log</span><span style="color: #007700">(</span><span style="color: #0000BB">self</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">message</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log_text</span><span style="color: #007700">.</span><span style="color: #0000BB">insert</span><span style="color: #007700">(</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">END</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">message&nbsp;</span><span style="color: #007700">+&nbsp;</span><span style="color: #DD0000">"&#092;n"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log_text</span><span style="color: #007700">.</span><span style="color: #0000BB">see</span><span style="color: #007700">(</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">END</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">root</span><span style="color: #007700">.</span><span style="color: #0000BB">update_idletasks</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">def&nbsp;start_generation</span><span style="color: #007700">(</span><span style="color: #0000BB">self</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">not&nbsp;self</span><span style="color: #007700">.</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">.</span><span style="color: #0000BB">get</span><span style="color: #007700">()&nbsp;or&nbsp;</span><span style="color: #0000BB">not&nbsp;self</span><span style="color: #007700">.</span><span style="color: #0000BB">output_dir</span><span style="color: #007700">.</span><span style="color: #0000BB">get</span><span style="color: #007700">():<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">messagebox</span><span style="color: #007700">.</span><span style="color: #0000BB">showerror</span><span style="color: #007700">(</span><span style="color: #DD0000">"Fehler"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"Bitte&nbsp;Eingabe-&nbsp;und&nbsp;Ausgabe-Verzeichnis&nbsp;auswählen!"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;In&nbsp;separatem&nbsp;Thread&nbsp;ausführen,&nbsp;um&nbsp;GUI&nbsp;nicht&nbsp;zu&nbsp;blockieren<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">thread&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">threading</span><span style="color: #007700">.</span><span style="color: #0000BB">Thread</span><span style="color: #007700">(</span><span style="color: #0000BB">target</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">generate_orm_maps</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">thread</span><span style="color: #007700">.</span><span style="color: #0000BB">daemon&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">True<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread</span><span style="color: #007700">.</span><span style="color: #0000BB">start</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">def&nbsp;generate_orm_maps</span><span style="color: #007700">(</span><span style="color: #0000BB">self</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">input_dir&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">.</span><span style="color: #0000BB">get</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">output_dir&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">output_dir</span><span style="color: #007700">.</span><span style="color: #0000BB">get</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">status</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #DD0000">"Suche&nbsp;Texturen..."</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">progress</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log_text</span><span style="color: #007700">.</span><span style="color: #0000BB">delete</span><span style="color: #007700">(</span><span style="color: #0000BB">1.0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">END</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Alle&nbsp;Albedo-Texturen&nbsp;finden&nbsp;(case-insensitive&nbsp;und&nbsp;mit&nbsp;Unterordnern)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">albedo_files&nbsp;</span><span style="color: #007700">=&nbsp;[]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;</span><span style="color: #0000BB">pattern&nbsp;in&nbsp;</span><span style="color: #007700">[</span><span style="color: #DD0000">"*_albedo.png"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"*_Albedo.png"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"*_ALBEDO.png"</span><span style="color: #007700">]:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">albedo_files</span><span style="color: #007700">.</span><span style="color: #0000BB">extend</span><span style="color: #007700">(</span><span style="color: #0000BB">glob</span><span style="color: #007700">.</span><span style="color: #0000BB">glob</span><span style="color: #007700">(</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">join</span><span style="color: #007700">(</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pattern</span><span style="color: #007700">)))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">albedo_files</span><span style="color: #007700">.</span><span style="color: #0000BB">extend</span><span style="color: #007700">(</span><span style="color: #0000BB">glob</span><span style="color: #007700">.</span><span style="color: #0000BB">glob</span><span style="color: #007700">(</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">join</span><span style="color: #007700">(</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"**"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pattern</span><span style="color: #007700">),&nbsp;</span><span style="color: #0000BB">recursive</span><span style="color: #007700">=</span><span style="color: #0000BB">True</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Duplikate&nbsp;entfernen<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">albedo_files&nbsp;</span><span style="color: #007700">=&nbsp;list(</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #0000BB">albedo_files</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">not&nbsp;albedo_files</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #DD0000">"Keine&nbsp;_albedo.png&nbsp;Dateien&nbsp;gefunden!"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"Durchsuchtes&nbsp;Verzeichnis:&nbsp;{input_dir}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Zeige&nbsp;verfügbare&nbsp;PNG-Dateien&nbsp;zur&nbsp;Diagnose<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">all_pngs&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">glob</span><span style="color: #007700">.</span><span style="color: #0000BB">glob</span><span style="color: #007700">(</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">join</span><span style="color: #007700">(</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"*.png"</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">all_pngs</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"&#092;nGefundene&nbsp;PNG-Dateien&nbsp;({len(all_pngs)}):"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;</span><span style="color: #0000BB">png&nbsp;in&nbsp;all_pngs</span><span style="color: #007700">[:</span><span style="color: #0000BB">5</span><span style="color: #007700">]:&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Zeige&nbsp;erste&nbsp;5<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"&nbsp;&nbsp;-&nbsp;{os.path.basename(png)}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">len</span><span style="color: #007700">(</span><span style="color: #0000BB">all_pngs</span><span style="color: #007700">)&nbsp;&gt;&nbsp;</span><span style="color: #0000BB">5</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"&nbsp;&nbsp;...&nbsp;und&nbsp;{len(all_pngs)&nbsp;-&nbsp;5}&nbsp;weitere"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">status</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #DD0000">"Fehler:&nbsp;Keine&nbsp;Texturen&nbsp;gefunden"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"Gefunden:&nbsp;{len(albedo_files)}&nbsp;Textur-Sets"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #DD0000">"="&nbsp;</span><span style="color: #007700">*&nbsp;</span><span style="color: #0000BB">50</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">processed&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errors&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">for&nbsp;</span><span style="color: #0000BB">i</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">albedo_file&nbsp;in&nbsp;enumerate</span><span style="color: #007700">(</span><span style="color: #0000BB">albedo_files</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">base_name&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">basename</span><span style="color: #007700">(</span><span style="color: #0000BB">albedo_file</span><span style="color: #007700">).</span><span style="color: #0000BB">replace</span><span style="color: #007700">(</span><span style="color: #DD0000">"_albedo.png"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">""</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Fortschritt&nbsp;aktualisieren<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">progress_percent&nbsp;</span><span style="color: #007700">=&nbsp;(</span><span style="color: #0000BB">i&nbsp;</span><span style="color: #007700">/&nbsp;</span><span style="color: #0000BB">len</span><span style="color: #007700">(</span><span style="color: #0000BB">albedo_files</span><span style="color: #007700">))&nbsp;*&nbsp;</span><span style="color: #0000BB">100<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self</span><span style="color: #007700">.</span><span style="color: #0000BB">progress</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #0000BB">progress_percent</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">status</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"Verarbeite:&nbsp;{base_name}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;ORM-Map&nbsp;generieren<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">success&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">create_single_orm_map</span><span style="color: #007700">(</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">output_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">base_name</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">success</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">processed&nbsp;</span><span style="color: #007700">+=&nbsp;</span><span style="color: #0000BB">1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">else:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">errors&nbsp;</span><span style="color: #007700">+=&nbsp;</span><span style="color: #0000BB">1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Abschluss<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">progress</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #0000BB">100</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">status</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #DD0000">"Fertig!"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #DD0000">"="&nbsp;</span><span style="color: #007700">*&nbsp;</span><span style="color: #0000BB">50</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"Erfolgreich&nbsp;verarbeitet:&nbsp;{processed}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"Fehler:&nbsp;{errors}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"ORM-Maps&nbsp;gespeichert&nbsp;in:&nbsp;{output_dir}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">messagebox</span><span style="color: #007700">.</span><span style="color: #0000BB">showinfo</span><span style="color: #007700">(</span><span style="color: #DD0000">"Fertig"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"Verarbeitung&nbsp;abgeschlossen!&#092;nErfolgreich:&nbsp;{processed}&#092;nFehler:&nbsp;{errors}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">except&nbsp;Exception&nbsp;</span><span style="color: #007700">as&nbsp;</span><span style="color: #0000BB">e</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"FEHLER:&nbsp;{str(e)}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">status</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #DD0000">"Fehler&nbsp;aufgetreten"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">messagebox</span><span style="color: #007700">.</span><span style="color: #0000BB">showerror</span><span style="color: #007700">(</span><span style="color: #DD0000">"Fehler"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"Ein&nbsp;Fehler&nbsp;ist&nbsp;aufgetreten:&#092;n{str(e)}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">def&nbsp;create_single_orm_map</span><span style="color: #007700">(</span><span style="color: #0000BB">self</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">output_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">base_name</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Datei-Pfade<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ao_file&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">join</span><span style="color: #007700">(</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"{base_name}_ao.png"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">roughness_file&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">join</span><span style="color: #007700">(</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"{base_name}_roughness.png"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">metallic_file&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">join</span><span style="color: #007700">(</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"{base_name}_metallic.png"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">height_file&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">join</span><span style="color: #007700">(</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"{base_name}_height.png"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Output-Pfad<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">output_file&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">join</span><span style="color: #007700">(</span><span style="color: #0000BB">output_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"{base_name}_ORM.png"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Überspringen&nbsp;falls&nbsp;bereits&nbsp;existiert<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if&nbsp;</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">exists</span><span style="color: #007700">(</span><span style="color: #0000BB">output_file</span><span style="color: #007700">)&nbsp;and&nbsp;</span><span style="color: #0000BB">not&nbsp;self</span><span style="color: #007700">.</span><span style="color: #0000BB">overwrite_existing</span><span style="color: #007700">.</span><span style="color: #0000BB">get</span><span style="color: #007700">():<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"Übersprungen&nbsp;(existiert):&nbsp;{base_name}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">True<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Falls&nbsp;AO&nbsp;fehlt&nbsp;und&nbsp;Height&nbsp;Map&nbsp;verwendet&nbsp;werden&nbsp;soll<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">use_height_for_ao</span><span style="color: #007700">.</span><span style="color: #0000BB">get</span><span style="color: #007700">()&nbsp;and&nbsp;</span><span style="color: #0000BB">not&nbsp;os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">exists</span><span style="color: #007700">(</span><span style="color: #0000BB">ao_file</span><span style="color: #007700">)&nbsp;and&nbsp;</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">exists</span><span style="color: #007700">(</span><span style="color: #0000BB">height_file</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"&nbsp;&nbsp;Verwende&nbsp;Height&nbsp;Map&nbsp;für&nbsp;AO:&nbsp;{base_name}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ao_file&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">height_file<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Überprüfen&nbsp;ob&nbsp;alle&nbsp;benötigten&nbsp;Dateien&nbsp;existieren<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">missing_files&nbsp;</span><span style="color: #007700">=&nbsp;[]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;</span><span style="color: #0000BB">file_path&nbsp;in&nbsp;</span><span style="color: #007700">[</span><span style="color: #0000BB">ao_file</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">roughness_file</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">metallic_file</span><span style="color: #007700">]:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">not&nbsp;os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">exists</span><span style="color: #007700">(</span><span style="color: #0000BB">file_path</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">missing_files</span><span style="color: #007700">.</span><span style="color: #0000BB">append</span><span style="color: #007700">(</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">basename</span><span style="color: #007700">(</span><span style="color: #0000BB">file_path</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">missing_files</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"FEHLER&nbsp;{base_name}:&nbsp;Fehlende&nbsp;Dateien&nbsp;-&nbsp;{',&nbsp;'.join(missing_files)}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">False<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Bilder&nbsp;laden&nbsp;und&nbsp;verarbeiten<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ao_img&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">Image</span><span style="color: #007700">.</span><span style="color: #0000BB">open</span><span style="color: #007700">(</span><span style="color: #0000BB">ao_file</span><span style="color: #007700">).</span><span style="color: #0000BB">convert</span><span style="color: #007700">(</span><span style="color: #DD0000">"L"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">roughness_img&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">Image</span><span style="color: #007700">.</span><span style="color: #0000BB">open</span><span style="color: #007700">(</span><span style="color: #0000BB">roughness_file</span><span style="color: #007700">).</span><span style="color: #0000BB">convert</span><span style="color: #007700">(</span><span style="color: #DD0000">"L"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">metallic_img&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">Image</span><span style="color: #007700">.</span><span style="color: #0000BB">open</span><span style="color: #007700">(</span><span style="color: #0000BB">metallic_file</span><span style="color: #007700">).</span><span style="color: #0000BB">convert</span><span style="color: #007700">(</span><span style="color: #DD0000">"L"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Auf&nbsp;gemeinsame&nbsp;Größe&nbsp;bringen<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">sizes&nbsp;</span><span style="color: #007700">=&nbsp;[</span><span style="color: #0000BB">img</span><span style="color: #007700">.</span><span style="color: #0000BB">size&nbsp;</span><span style="color: #007700">for&nbsp;</span><span style="color: #0000BB">img&nbsp;in&nbsp;</span><span style="color: #007700">[</span><span style="color: #0000BB">ao_img</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">roughness_img</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">metallic_img</span><span style="color: #007700">]]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">target_size&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">max</span><span style="color: #007700">(</span><span style="color: #0000BB">sizes</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">key</span><span style="color: #007700">=</span><span style="color: #0000BB">lambda&nbsp;x</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">x</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]&nbsp;*&nbsp;</span><span style="color: #0000BB">x</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">ao_img</span><span style="color: #007700">.</span><span style="color: #0000BB">size&nbsp;</span><span style="color: #007700">!=&nbsp;</span><span style="color: #0000BB">target_size</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ao_img&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ao_img</span><span style="color: #007700">.</span><span style="color: #0000BB">resize</span><span style="color: #007700">(</span><span style="color: #0000BB">target_size</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">Image</span><span style="color: #007700">.</span><span style="color: #0000BB">Resampling</span><span style="color: #007700">.</span><span style="color: #0000BB">LANCZOS</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">roughness_img</span><span style="color: #007700">.</span><span style="color: #0000BB">size&nbsp;</span><span style="color: #007700">!=&nbsp;</span><span style="color: #0000BB">target_size</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">roughness_img&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">roughness_img</span><span style="color: #007700">.</span><span style="color: #0000BB">resize</span><span style="color: #007700">(</span><span style="color: #0000BB">target_size</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">Image</span><span style="color: #007700">.</span><span style="color: #0000BB">Resampling</span><span style="color: #007700">.</span><span style="color: #0000BB">LANCZOS</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">metallic_img</span><span style="color: #007700">.</span><span style="color: #0000BB">size&nbsp;</span><span style="color: #007700">!=&nbsp;</span><span style="color: #0000BB">target_size</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">metallic_img&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">metallic_img</span><span style="color: #007700">.</span><span style="color: #0000BB">resize</span><span style="color: #007700">(</span><span style="color: #0000BB">target_size</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">Image</span><span style="color: #007700">.</span><span style="color: #0000BB">Resampling</span><span style="color: #007700">.</span><span style="color: #0000BB">LANCZOS</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;(O)RM&nbsp;Map&nbsp;kombinieren<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">orm_map&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">Image</span><span style="color: #007700">.</span><span style="color: #0000BB">merge</span><span style="color: #007700">(</span><span style="color: #DD0000">"RGB"</span><span style="color: #007700">,&nbsp;(</span><span style="color: #0000BB">ao_img</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">roughness_img</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">metallic_img</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Speichern<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">makedirs</span><span style="color: #007700">(</span><span style="color: #0000BB">output_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">exist_ok</span><span style="color: #007700">=</span><span style="color: #0000BB">True</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">orm_map</span><span style="color: #007700">.</span><span style="color: #0000BB">save</span><span style="color: #007700">(</span><span style="color: #0000BB">output_file</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"PNG"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"ERFOLG:&nbsp;{base_name}&nbsp;({target_size[0]}x{target_size[1]})"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">True<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except&nbsp;Exception&nbsp;</span><span style="color: #007700">as&nbsp;</span><span style="color: #0000BB">e</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"FEHLER&nbsp;{base_name}:&nbsp;{str(e)}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">False<br /><br />def&nbsp;main</span><span style="color: #007700">():<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">root&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">Tk</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ORMGeneratorGUI</span><span style="color: #007700">(</span><span style="color: #0000BB">root</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">root</span><span style="color: #007700">.</span><span style="color: #0000BB">mainloop</span><span style="color: #007700">()<br /><br />if&nbsp;</span><span style="color: #0000BB">__name__&nbsp;</span><span style="color: #007700">==&nbsp;</span><span style="color: #DD0000">"__main__"</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">main</span><span style="color: #007700">()&nbsp;<br /></span></code></div></div></div><br />
Gemischt angezeigt kommt natürlich etwas heraus was merkwürdig aussieht und erst in RGB zerlegt sinn ergibt.<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.gridtalk.de/images/attachtypes/image.gif" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=11235" target="_blank" title="">jeans-fabric_ORM.png</a> (Größe: 532,03 KB / Downloads: 84)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<span style="font-size: xx-large;" class="mycode_size">OpenSim (O)RM Map Generator</span><br />
ORM Materialien spiegeln die eigenschaft eines Materials wieder.<br />
Beispiel: Jeans Stoff kann für mehrere Jeans, Schuhe oder Mobillar genutzt werden egal welche Farbe diese Objekte haben es zählt nur die Grundstruktur.<br />
<br />
Funktion: Programm starten - Ordner auswählen der Texturen - von zum Beispiel <a href="https://freepbr.com/" target="_blank" rel="noopener" class="mycode_url">freepbr</a> enthält - dann generieren - und sie werden alle gespeichert.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Python Beispiel:</span><br />
<div class="codeblock phpcodeblock"><div class="title">PHP-Code:</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">import&nbsp;os<br />import&nbsp;tkinter&nbsp;</span><span style="color: #007700">as&nbsp;</span><span style="color: #0000BB">tk<br />from&nbsp;tkinter&nbsp;import&nbsp;filedialog</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">messagebox</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">ttk<br />from&nbsp;PIL&nbsp;import&nbsp;Image<br />import&nbsp;glob<br />import&nbsp;threading<br /><br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">ORMGeneratorGUI</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">def&nbsp;__init__</span><span style="color: #007700">(</span><span style="color: #0000BB">self</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">root</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">root&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">root<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self</span><span style="color: #007700">.</span><span style="color: #0000BB">root</span><span style="color: #007700">.</span><span style="color: #0000BB">title</span><span style="color: #007700">(</span><span style="color: #DD0000">"OpenSim&nbsp;(O)RM&nbsp;Map&nbsp;Generator"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">root</span><span style="color: #007700">.</span><span style="color: #0000BB">geometry</span><span style="color: #007700">(</span><span style="color: #DD0000">"600x400"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Variablen<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">input_dir&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">StringVar</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">output_dir&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">StringVar</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">progress&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">DoubleVar</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">status&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">StringVar</span><span style="color: #007700">(</span><span style="color: #0000BB">value</span><span style="color: #007700">=</span><span style="color: #DD0000">"Bereit"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">setup_ui</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">def&nbsp;setup_ui</span><span style="color: #007700">(</span><span style="color: #0000BB">self</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Hauptframe<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">main_frame&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Frame</span><span style="color: #007700">(</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">root</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">padding</span><span style="color: #007700">=</span><span style="color: #DD0000">"10"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">.</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #DD0000">"nsew"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Root-Fenster&nbsp;Grid-Konfiguration<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">root</span><span style="color: #007700">.</span><span style="color: #0000BB">columnconfigure</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">weight</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">root</span><span style="color: #007700">.</span><span style="color: #0000BB">rowconfigure</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">weight</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Titel<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">title_label&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Label</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"OpenSim&nbsp;(O)RM&nbsp;Map&nbsp;Generator"</span><span style="color: #007700">,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">font</span><span style="color: #007700">=(</span><span style="color: #DD0000">"Arial"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">16</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"bold"</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">title_label</span><span style="color: #007700">.</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">columnspan</span><span style="color: #007700">=</span><span style="color: #0000BB">3</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=(</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">20</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Eingabe-Verzeichnis&nbsp;Auswahl<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Label</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"Eingabe-Verzeichnis:"</span><span style="color: #007700">).</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">W</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Entry</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">textvariable</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">width</span><span style="color: #007700">=</span><span style="color: #0000BB">50</span><span style="color: #007700">).</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">padx</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Button</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"Durchsuchen"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">command</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">browse_input_dir</span><span style="color: #007700">).</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">2</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Ausgabe-Verzeichnis&nbsp;Auswahl<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Label</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"Ausgabe-Verzeichnis:"</span><span style="color: #007700">).</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">2</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">W</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Entry</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">textvariable</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">output_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">width</span><span style="color: #007700">=</span><span style="color: #0000BB">50</span><span style="color: #007700">).</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">2</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">padx</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Button</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"Durchsuchen"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">command</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">browse_output_dir</span><span style="color: #007700">).</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">2</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">2</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Optionen<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">options_frame&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">LabelFrame</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"Optionen"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">padding</span><span style="color: #007700">=</span><span style="color: #DD0000">"5"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">options_frame</span><span style="color: #007700">.</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">3</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">columnspan</span><span style="color: #007700">=</span><span style="color: #0000BB">3</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #DD0000">"ew"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">10</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">use_height_for_ao&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">BooleanVar</span><span style="color: #007700">(</span><span style="color: #0000BB">value</span><span style="color: #007700">=</span><span style="color: #0000BB">True</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Checkbutton</span><span style="color: #007700">(</span><span style="color: #0000BB">options_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"Height&nbsp;Map&nbsp;für&nbsp;AO&nbsp;verwenden&nbsp;(falls&nbsp;AO&nbsp;fehlt)"</span><span style="color: #007700">,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">variable</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">use_height_for_ao</span><span style="color: #007700">).</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">W</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">overwrite_existing&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">BooleanVar</span><span style="color: #007700">(</span><span style="color: #0000BB">value</span><span style="color: #007700">=</span><span style="color: #0000BB">False</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Checkbutton</span><span style="color: #007700">(</span><span style="color: #0000BB">options_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"Existierende&nbsp;ORM-Maps&nbsp;überschreiben"</span><span style="color: #007700">,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">variable</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">overwrite_existing</span><span style="color: #007700">).</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">W</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Fortschrittsbalken<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Label</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"Fortschritt:"</span><span style="color: #007700">).</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">4</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">W</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=(</span><span style="color: #0000BB">10</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">progress_bar&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Progressbar</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">variable</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">progress</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">length</span><span style="color: #007700">=</span><span style="color: #0000BB">500</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">progress_bar</span><span style="color: #007700">.</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">columnspan</span><span style="color: #007700">=</span><span style="color: #0000BB">3</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #DD0000">"ew"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Status-Anzeige<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">status_label&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Label</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">textvariable</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">status</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">status_label</span><span style="color: #007700">.</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">6</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">columnspan</span><span style="color: #007700">=</span><span style="color: #0000BB">3</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Buttons<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">button_frame&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Frame</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">button_frame</span><span style="color: #007700">.</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">7</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">columnspan</span><span style="color: #007700">=</span><span style="color: #0000BB">3</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">20</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Button</span><span style="color: #007700">(</span><span style="color: #0000BB">button_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"ORM-Maps&nbsp;generieren"</span><span style="color: #007700">,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">command</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">start_generation</span><span style="color: #007700">).</span><span style="color: #0000BB">pack</span><span style="color: #007700">(</span><span style="color: #0000BB">side</span><span style="color: #007700">=</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">LEFT</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">padx</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Button</span><span style="color: #007700">(</span><span style="color: #0000BB">button_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"Beenden"</span><span style="color: #007700">,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">command</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">root</span><span style="color: #007700">.</span><span style="color: #0000BB">quit</span><span style="color: #007700">).</span><span style="color: #0000BB">pack</span><span style="color: #007700">(</span><span style="color: #0000BB">side</span><span style="color: #007700">=</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">LEFT</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">padx</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Log-Ausgabe<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">log_frame&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">LabelFrame</span><span style="color: #007700">(</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">text</span><span style="color: #007700">=</span><span style="color: #DD0000">"Log"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">padding</span><span style="color: #007700">=</span><span style="color: #DD0000">"5"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">log_frame</span><span style="color: #007700">.</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">8</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">columnspan</span><span style="color: #007700">=</span><span style="color: #0000BB">3</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #DD0000">"nsew"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pady</span><span style="color: #007700">=</span><span style="color: #0000BB">10</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log_text&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">Text</span><span style="color: #007700">(</span><span style="color: #0000BB">log_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">height</span><span style="color: #007700">=</span><span style="color: #0000BB">8</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">width</span><span style="color: #007700">=</span><span style="color: #0000BB">70</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">scrollbar&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ttk</span><span style="color: #007700">.</span><span style="color: #0000BB">Scrollbar</span><span style="color: #007700">(</span><span style="color: #0000BB">log_frame</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">orient</span><span style="color: #007700">=</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">VERTICAL</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">command</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log_text</span><span style="color: #007700">.</span><span style="color: #0000BB">yview</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log_text</span><span style="color: #007700">.</span><span style="color: #0000BB">configure</span><span style="color: #007700">(</span><span style="color: #0000BB">yscrollcommand</span><span style="color: #007700">=</span><span style="color: #0000BB">scrollbar</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log_text</span><span style="color: #007700">.</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #DD0000">"nsew"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">scrollbar</span><span style="color: #007700">.</span><span style="color: #0000BB">grid</span><span style="color: #007700">(</span><span style="color: #0000BB">row</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">column</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">sticky</span><span style="color: #007700">=</span><span style="color: #DD0000">"ns"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Grid-Konfiguration<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">.</span><span style="color: #0000BB">columnconfigure</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">weight</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">log_frame</span><span style="color: #007700">.</span><span style="color: #0000BB">columnconfigure</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">weight</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">log_frame</span><span style="color: #007700">.</span><span style="color: #0000BB">rowconfigure</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">weight</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">main_frame</span><span style="color: #007700">.</span><span style="color: #0000BB">rowconfigure</span><span style="color: #007700">(</span><span style="color: #0000BB">8</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">weight</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">def&nbsp;browse_input_dir</span><span style="color: #007700">(</span><span style="color: #0000BB">self</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">directory&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">filedialog</span><span style="color: #007700">.</span><span style="color: #0000BB">askdirectory</span><span style="color: #007700">(</span><span style="color: #0000BB">title</span><span style="color: #007700">=</span><span style="color: #DD0000">"Eingabe-Verzeichnis&nbsp;auswählen"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">directory</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #0000BB">directory</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Automatisch&nbsp;Output-Verzeichnis&nbsp;vorschlagen<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if&nbsp;</span><span style="color: #0000BB">not&nbsp;self</span><span style="color: #007700">.</span><span style="color: #0000BB">output_dir</span><span style="color: #007700">.</span><span style="color: #0000BB">get</span><span style="color: #007700">():<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">output_dir</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">join</span><span style="color: #007700">(</span><span style="color: #0000BB">directory</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"ORM_Maps"</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">def&nbsp;browse_output_dir</span><span style="color: #007700">(</span><span style="color: #0000BB">self</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">directory&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">filedialog</span><span style="color: #007700">.</span><span style="color: #0000BB">askdirectory</span><span style="color: #007700">(</span><span style="color: #0000BB">title</span><span style="color: #007700">=</span><span style="color: #DD0000">"Ausgabe-Verzeichnis&nbsp;auswählen"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">directory</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">output_dir</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #0000BB">directory</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">def&nbsp;log</span><span style="color: #007700">(</span><span style="color: #0000BB">self</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">message</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log_text</span><span style="color: #007700">.</span><span style="color: #0000BB">insert</span><span style="color: #007700">(</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">END</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">message&nbsp;</span><span style="color: #007700">+&nbsp;</span><span style="color: #DD0000">"&#092;n"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log_text</span><span style="color: #007700">.</span><span style="color: #0000BB">see</span><span style="color: #007700">(</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">END</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">root</span><span style="color: #007700">.</span><span style="color: #0000BB">update_idletasks</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">def&nbsp;start_generation</span><span style="color: #007700">(</span><span style="color: #0000BB">self</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">not&nbsp;self</span><span style="color: #007700">.</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">.</span><span style="color: #0000BB">get</span><span style="color: #007700">()&nbsp;or&nbsp;</span><span style="color: #0000BB">not&nbsp;self</span><span style="color: #007700">.</span><span style="color: #0000BB">output_dir</span><span style="color: #007700">.</span><span style="color: #0000BB">get</span><span style="color: #007700">():<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">messagebox</span><span style="color: #007700">.</span><span style="color: #0000BB">showerror</span><span style="color: #007700">(</span><span style="color: #DD0000">"Fehler"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"Bitte&nbsp;Eingabe-&nbsp;und&nbsp;Ausgabe-Verzeichnis&nbsp;auswählen!"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;In&nbsp;separatem&nbsp;Thread&nbsp;ausführen,&nbsp;um&nbsp;GUI&nbsp;nicht&nbsp;zu&nbsp;blockieren<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">thread&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">threading</span><span style="color: #007700">.</span><span style="color: #0000BB">Thread</span><span style="color: #007700">(</span><span style="color: #0000BB">target</span><span style="color: #007700">=</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">generate_orm_maps</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">thread</span><span style="color: #007700">.</span><span style="color: #0000BB">daemon&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">True<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread</span><span style="color: #007700">.</span><span style="color: #0000BB">start</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">def&nbsp;generate_orm_maps</span><span style="color: #007700">(</span><span style="color: #0000BB">self</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">input_dir&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">.</span><span style="color: #0000BB">get</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">output_dir&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">output_dir</span><span style="color: #007700">.</span><span style="color: #0000BB">get</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">status</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #DD0000">"Suche&nbsp;Texturen..."</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">progress</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log_text</span><span style="color: #007700">.</span><span style="color: #0000BB">delete</span><span style="color: #007700">(</span><span style="color: #0000BB">1.0</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">END</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Alle&nbsp;Albedo-Texturen&nbsp;finden&nbsp;(case-insensitive&nbsp;und&nbsp;mit&nbsp;Unterordnern)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">albedo_files&nbsp;</span><span style="color: #007700">=&nbsp;[]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;</span><span style="color: #0000BB">pattern&nbsp;in&nbsp;</span><span style="color: #007700">[</span><span style="color: #DD0000">"*_albedo.png"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"*_Albedo.png"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"*_ALBEDO.png"</span><span style="color: #007700">]:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">albedo_files</span><span style="color: #007700">.</span><span style="color: #0000BB">extend</span><span style="color: #007700">(</span><span style="color: #0000BB">glob</span><span style="color: #007700">.</span><span style="color: #0000BB">glob</span><span style="color: #007700">(</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">join</span><span style="color: #007700">(</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pattern</span><span style="color: #007700">)))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">albedo_files</span><span style="color: #007700">.</span><span style="color: #0000BB">extend</span><span style="color: #007700">(</span><span style="color: #0000BB">glob</span><span style="color: #007700">.</span><span style="color: #0000BB">glob</span><span style="color: #007700">(</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">join</span><span style="color: #007700">(</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"**"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">pattern</span><span style="color: #007700">),&nbsp;</span><span style="color: #0000BB">recursive</span><span style="color: #007700">=</span><span style="color: #0000BB">True</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Duplikate&nbsp;entfernen<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">albedo_files&nbsp;</span><span style="color: #007700">=&nbsp;list(</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #0000BB">albedo_files</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">not&nbsp;albedo_files</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #DD0000">"Keine&nbsp;_albedo.png&nbsp;Dateien&nbsp;gefunden!"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"Durchsuchtes&nbsp;Verzeichnis:&nbsp;{input_dir}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Zeige&nbsp;verfügbare&nbsp;PNG-Dateien&nbsp;zur&nbsp;Diagnose<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">all_pngs&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">glob</span><span style="color: #007700">.</span><span style="color: #0000BB">glob</span><span style="color: #007700">(</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">join</span><span style="color: #007700">(</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"*.png"</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">all_pngs</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"&#092;nGefundene&nbsp;PNG-Dateien&nbsp;({len(all_pngs)}):"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;</span><span style="color: #0000BB">png&nbsp;in&nbsp;all_pngs</span><span style="color: #007700">[:</span><span style="color: #0000BB">5</span><span style="color: #007700">]:&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Zeige&nbsp;erste&nbsp;5<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"&nbsp;&nbsp;-&nbsp;{os.path.basename(png)}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">len</span><span style="color: #007700">(</span><span style="color: #0000BB">all_pngs</span><span style="color: #007700">)&nbsp;&gt;&nbsp;</span><span style="color: #0000BB">5</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"&nbsp;&nbsp;...&nbsp;und&nbsp;{len(all_pngs)&nbsp;-&nbsp;5}&nbsp;weitere"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">status</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #DD0000">"Fehler:&nbsp;Keine&nbsp;Texturen&nbsp;gefunden"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"Gefunden:&nbsp;{len(albedo_files)}&nbsp;Textur-Sets"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #DD0000">"="&nbsp;</span><span style="color: #007700">*&nbsp;</span><span style="color: #0000BB">50</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">processed&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errors&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">for&nbsp;</span><span style="color: #0000BB">i</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">albedo_file&nbsp;in&nbsp;enumerate</span><span style="color: #007700">(</span><span style="color: #0000BB">albedo_files</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">base_name&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">basename</span><span style="color: #007700">(</span><span style="color: #0000BB">albedo_file</span><span style="color: #007700">).</span><span style="color: #0000BB">replace</span><span style="color: #007700">(</span><span style="color: #DD0000">"_albedo.png"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">""</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Fortschritt&nbsp;aktualisieren<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">progress_percent&nbsp;</span><span style="color: #007700">=&nbsp;(</span><span style="color: #0000BB">i&nbsp;</span><span style="color: #007700">/&nbsp;</span><span style="color: #0000BB">len</span><span style="color: #007700">(</span><span style="color: #0000BB">albedo_files</span><span style="color: #007700">))&nbsp;*&nbsp;</span><span style="color: #0000BB">100<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self</span><span style="color: #007700">.</span><span style="color: #0000BB">progress</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #0000BB">progress_percent</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">status</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"Verarbeite:&nbsp;{base_name}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;ORM-Map&nbsp;generieren<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">success&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">create_single_orm_map</span><span style="color: #007700">(</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">output_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">base_name</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">success</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">processed&nbsp;</span><span style="color: #007700">+=&nbsp;</span><span style="color: #0000BB">1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">else:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">errors&nbsp;</span><span style="color: #007700">+=&nbsp;</span><span style="color: #0000BB">1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Abschluss<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">progress</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #0000BB">100</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">status</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #DD0000">"Fertig!"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #DD0000">"="&nbsp;</span><span style="color: #007700">*&nbsp;</span><span style="color: #0000BB">50</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"Erfolgreich&nbsp;verarbeitet:&nbsp;{processed}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"Fehler:&nbsp;{errors}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"ORM-Maps&nbsp;gespeichert&nbsp;in:&nbsp;{output_dir}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">messagebox</span><span style="color: #007700">.</span><span style="color: #0000BB">showinfo</span><span style="color: #007700">(</span><span style="color: #DD0000">"Fertig"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"Verarbeitung&nbsp;abgeschlossen!&#092;nErfolgreich:&nbsp;{processed}&#092;nFehler:&nbsp;{errors}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">except&nbsp;Exception&nbsp;</span><span style="color: #007700">as&nbsp;</span><span style="color: #0000BB">e</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"FEHLER:&nbsp;{str(e)}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">status</span><span style="color: #007700">.</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #DD0000">"Fehler&nbsp;aufgetreten"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">messagebox</span><span style="color: #007700">.</span><span style="color: #0000BB">showerror</span><span style="color: #007700">(</span><span style="color: #DD0000">"Fehler"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"Ein&nbsp;Fehler&nbsp;ist&nbsp;aufgetreten:&#092;n{str(e)}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">def&nbsp;create_single_orm_map</span><span style="color: #007700">(</span><span style="color: #0000BB">self</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">output_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">base_name</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Datei-Pfade<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ao_file&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">join</span><span style="color: #007700">(</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"{base_name}_ao.png"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">roughness_file&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">join</span><span style="color: #007700">(</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"{base_name}_roughness.png"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">metallic_file&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">join</span><span style="color: #007700">(</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"{base_name}_metallic.png"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">height_file&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">join</span><span style="color: #007700">(</span><span style="color: #0000BB">input_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"{base_name}_height.png"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Output-Pfad<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">output_file&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">join</span><span style="color: #007700">(</span><span style="color: #0000BB">output_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"{base_name}_ORM.png"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Überspringen&nbsp;falls&nbsp;bereits&nbsp;existiert<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if&nbsp;</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">exists</span><span style="color: #007700">(</span><span style="color: #0000BB">output_file</span><span style="color: #007700">)&nbsp;and&nbsp;</span><span style="color: #0000BB">not&nbsp;self</span><span style="color: #007700">.</span><span style="color: #0000BB">overwrite_existing</span><span style="color: #007700">.</span><span style="color: #0000BB">get</span><span style="color: #007700">():<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"Übersprungen&nbsp;(existiert):&nbsp;{base_name}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">True<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Falls&nbsp;AO&nbsp;fehlt&nbsp;und&nbsp;Height&nbsp;Map&nbsp;verwendet&nbsp;werden&nbsp;soll<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">use_height_for_ao</span><span style="color: #007700">.</span><span style="color: #0000BB">get</span><span style="color: #007700">()&nbsp;and&nbsp;</span><span style="color: #0000BB">not&nbsp;os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">exists</span><span style="color: #007700">(</span><span style="color: #0000BB">ao_file</span><span style="color: #007700">)&nbsp;and&nbsp;</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">exists</span><span style="color: #007700">(</span><span style="color: #0000BB">height_file</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"&nbsp;&nbsp;Verwende&nbsp;Height&nbsp;Map&nbsp;für&nbsp;AO:&nbsp;{base_name}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ao_file&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">height_file<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Überprüfen&nbsp;ob&nbsp;alle&nbsp;benötigten&nbsp;Dateien&nbsp;existieren<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">missing_files&nbsp;</span><span style="color: #007700">=&nbsp;[]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;</span><span style="color: #0000BB">file_path&nbsp;in&nbsp;</span><span style="color: #007700">[</span><span style="color: #0000BB">ao_file</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">roughness_file</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">metallic_file</span><span style="color: #007700">]:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">not&nbsp;os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">exists</span><span style="color: #007700">(</span><span style="color: #0000BB">file_path</span><span style="color: #007700">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">missing_files</span><span style="color: #007700">.</span><span style="color: #0000BB">append</span><span style="color: #007700">(</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">path</span><span style="color: #007700">.</span><span style="color: #0000BB">basename</span><span style="color: #007700">(</span><span style="color: #0000BB">file_path</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">missing_files</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"FEHLER&nbsp;{base_name}:&nbsp;Fehlende&nbsp;Dateien&nbsp;-&nbsp;{',&nbsp;'.join(missing_files)}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">False<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Bilder&nbsp;laden&nbsp;und&nbsp;verarbeiten<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ao_img&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">Image</span><span style="color: #007700">.</span><span style="color: #0000BB">open</span><span style="color: #007700">(</span><span style="color: #0000BB">ao_file</span><span style="color: #007700">).</span><span style="color: #0000BB">convert</span><span style="color: #007700">(</span><span style="color: #DD0000">"L"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">roughness_img&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">Image</span><span style="color: #007700">.</span><span style="color: #0000BB">open</span><span style="color: #007700">(</span><span style="color: #0000BB">roughness_file</span><span style="color: #007700">).</span><span style="color: #0000BB">convert</span><span style="color: #007700">(</span><span style="color: #DD0000">"L"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">metallic_img&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">Image</span><span style="color: #007700">.</span><span style="color: #0000BB">open</span><span style="color: #007700">(</span><span style="color: #0000BB">metallic_file</span><span style="color: #007700">).</span><span style="color: #0000BB">convert</span><span style="color: #007700">(</span><span style="color: #DD0000">"L"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Auf&nbsp;gemeinsame&nbsp;Größe&nbsp;bringen<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">sizes&nbsp;</span><span style="color: #007700">=&nbsp;[</span><span style="color: #0000BB">img</span><span style="color: #007700">.</span><span style="color: #0000BB">size&nbsp;</span><span style="color: #007700">for&nbsp;</span><span style="color: #0000BB">img&nbsp;in&nbsp;</span><span style="color: #007700">[</span><span style="color: #0000BB">ao_img</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">roughness_img</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">metallic_img</span><span style="color: #007700">]]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">target_size&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">max</span><span style="color: #007700">(</span><span style="color: #0000BB">sizes</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">key</span><span style="color: #007700">=</span><span style="color: #0000BB">lambda&nbsp;x</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">x</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]&nbsp;*&nbsp;</span><span style="color: #0000BB">x</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">ao_img</span><span style="color: #007700">.</span><span style="color: #0000BB">size&nbsp;</span><span style="color: #007700">!=&nbsp;</span><span style="color: #0000BB">target_size</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ao_img&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ao_img</span><span style="color: #007700">.</span><span style="color: #0000BB">resize</span><span style="color: #007700">(</span><span style="color: #0000BB">target_size</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">Image</span><span style="color: #007700">.</span><span style="color: #0000BB">Resampling</span><span style="color: #007700">.</span><span style="color: #0000BB">LANCZOS</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">roughness_img</span><span style="color: #007700">.</span><span style="color: #0000BB">size&nbsp;</span><span style="color: #007700">!=&nbsp;</span><span style="color: #0000BB">target_size</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">roughness_img&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">roughness_img</span><span style="color: #007700">.</span><span style="color: #0000BB">resize</span><span style="color: #007700">(</span><span style="color: #0000BB">target_size</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">Image</span><span style="color: #007700">.</span><span style="color: #0000BB">Resampling</span><span style="color: #007700">.</span><span style="color: #0000BB">LANCZOS</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;</span><span style="color: #0000BB">metallic_img</span><span style="color: #007700">.</span><span style="color: #0000BB">size&nbsp;</span><span style="color: #007700">!=&nbsp;</span><span style="color: #0000BB">target_size</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">metallic_img&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">metallic_img</span><span style="color: #007700">.</span><span style="color: #0000BB">resize</span><span style="color: #007700">(</span><span style="color: #0000BB">target_size</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">Image</span><span style="color: #007700">.</span><span style="color: #0000BB">Resampling</span><span style="color: #007700">.</span><span style="color: #0000BB">LANCZOS</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;(O)RM&nbsp;Map&nbsp;kombinieren<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">orm_map&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">Image</span><span style="color: #007700">.</span><span style="color: #0000BB">merge</span><span style="color: #007700">(</span><span style="color: #DD0000">"RGB"</span><span style="color: #007700">,&nbsp;(</span><span style="color: #0000BB">ao_img</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">roughness_img</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">metallic_img</span><span style="color: #007700">))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">#&nbsp;Speichern<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">os</span><span style="color: #007700">.</span><span style="color: #0000BB">makedirs</span><span style="color: #007700">(</span><span style="color: #0000BB">output_dir</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">exist_ok</span><span style="color: #007700">=</span><span style="color: #0000BB">True</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">orm_map</span><span style="color: #007700">.</span><span style="color: #0000BB">save</span><span style="color: #007700">(</span><span style="color: #0000BB">output_file</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"PNG"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"ERFOLG:&nbsp;{base_name}&nbsp;({target_size[0]}x{target_size[1]})"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">True<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except&nbsp;Exception&nbsp;</span><span style="color: #007700">as&nbsp;</span><span style="color: #0000BB">e</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">self</span><span style="color: #007700">.</span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">f</span><span style="color: #DD0000">"FEHLER&nbsp;{base_name}:&nbsp;{str(e)}"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">False<br /><br />def&nbsp;main</span><span style="color: #007700">():<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">root&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">tk</span><span style="color: #007700">.</span><span style="color: #0000BB">Tk</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ORMGeneratorGUI</span><span style="color: #007700">(</span><span style="color: #0000BB">root</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">root</span><span style="color: #007700">.</span><span style="color: #0000BB">mainloop</span><span style="color: #007700">()<br /><br />if&nbsp;</span><span style="color: #0000BB">__name__&nbsp;</span><span style="color: #007700">==&nbsp;</span><span style="color: #DD0000">"__main__"</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">main</span><span style="color: #007700">()&nbsp;<br /></span></code></div></div></div><br />
Gemischt angezeigt kommt natürlich etwas heraus was merkwürdig aussieht und erst in RGB zerlegt sinn ergibt.<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.gridtalk.de/images/attachtypes/image.gif" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=11235" target="_blank" title="">jeans-fabric_ORM.png</a> (Größe: 532,03 KB / Downloads: 84)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[PBR Terrain Texture]]></title>
			<link>https://www.gridtalk.de/showthread.php?tid=5234</link>
			<pubDate>Fri, 28 Nov 2025 13:34:41 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://www.gridtalk.de/member.php?action=profile&uid=1341">Kalkofe</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.gridtalk.de/showthread.php?tid=5234</guid>
			<description><![CDATA[Hallo zusammen, kann mir bitte jemand erklären wie ich eine PBR Terraintexture einrichte?<br />
Habe von hier Schneexturen geladen: <a href="https://freepbr.com/product/crusted-snow2/" target="_blank" rel="noopener" class="mycode_url">https://freepbr.com/product/crusted-snow2/</a><br />
<br />
Ich aktiviere dann in den Einstellungen unter Terrain "PBR metallische Unebenheit", aber <br />
es klappt nicht. Vielleicht hat von euch jemand eine Lösung. Danke.<br />
<br />
Ich nutze den Firestorm 7.2.2 (79439) in OSG, OpenSim 0.9.3.1 Nessie Dev OpenSim 0.9.3.1 Nessie]]></description>
			<content:encoded><![CDATA[Hallo zusammen, kann mir bitte jemand erklären wie ich eine PBR Terraintexture einrichte?<br />
Habe von hier Schneexturen geladen: <a href="https://freepbr.com/product/crusted-snow2/" target="_blank" rel="noopener" class="mycode_url">https://freepbr.com/product/crusted-snow2/</a><br />
<br />
Ich aktiviere dann in den Einstellungen unter Terrain "PBR metallische Unebenheit", aber <br />
es klappt nicht. Vielleicht hat von euch jemand eine Lösung. Danke.<br />
<br />
Ich nutze den Firestorm 7.2.2 (79439) in OSG, OpenSim 0.9.3.1 Nessie Dev OpenSim 0.9.3.1 Nessie]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[diva-distribution 0.9.3.1 Dev Alpha]]></title>
			<link>https://www.gridtalk.de/showthread.php?tid=5215</link>
			<pubDate>Thu, 06 Nov 2025 18:21:47 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://www.gridtalk.de/member.php?action=profile&uid=998">Manfred Aabye</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.gridtalk.de/showthread.php?tid=5215</guid>
			<description><![CDATA[<span style="font-size: xx-large;" class="mycode_size">diva-distribution 0.9.3.1 Dev Alpha</span><br />
<br />
Erster test Dotnet 8.0<br />
<br />
<a href="https://github.com/ManfredAabye/diva-distribution/releases" target="_blank" rel="noopener" class="mycode_url">Github Download</a>]]></description>
			<content:encoded><![CDATA[<span style="font-size: xx-large;" class="mycode_size">diva-distribution 0.9.3.1 Dev Alpha</span><br />
<br />
Erster test Dotnet 8.0<br />
<br />
<a href="https://github.com/ManfredAabye/diva-distribution/releases" target="_blank" rel="noopener" class="mycode_url">Github Download</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Animation Overrider]]></title>
			<link>https://www.gridtalk.de/showthread.php?tid=5205</link>
			<pubDate>Thu, 30 Oct 2025 08:53:15 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://www.gridtalk.de/member.php?action=profile&uid=1502">Xenos Yifu</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.gridtalk.de/showthread.php?tid=5205</guid>
			<description><![CDATA[Moin, da ich es leid bin das meine "Anzieh AOs" auf vielen Grids/ Regionen nicht funktionieren,<br />
habe ich nun den Viewer eigenen AO gefüllt und eingestellt.<br />
Walk und Standings funktionieren tadellos, überall.<br />
Einzig schlecht, beim Einloggen steh ich da mit Newbie Fingerstellung, die gespreizten Finger.<br />
Das lässt sich zwar beheben, in dem ich kurz ein Hands Hud nutze, aber das ist ja auch nicht das Gelbe vom Ei. <img src="https://www.gridtalk.de/images/smilies/wink.gif" alt="Wink" title="Wink" class="smilie smilie_2" onclick="&#36;.markItUp({target:markitup_instance,replaceWith:''});&#36;.modal.close()" /><br />
(das hält dann bis zur nächsten Sitzung)<br />
<br />
Kennt jemand einen Weg, dass man eine normale Hand und Fingerstellung dauerhaft einstellen kann?]]></description>
			<content:encoded><![CDATA[Moin, da ich es leid bin das meine "Anzieh AOs" auf vielen Grids/ Regionen nicht funktionieren,<br />
habe ich nun den Viewer eigenen AO gefüllt und eingestellt.<br />
Walk und Standings funktionieren tadellos, überall.<br />
Einzig schlecht, beim Einloggen steh ich da mit Newbie Fingerstellung, die gespreizten Finger.<br />
Das lässt sich zwar beheben, in dem ich kurz ein Hands Hud nutze, aber das ist ja auch nicht das Gelbe vom Ei. <img src="https://www.gridtalk.de/images/smilies/wink.gif" alt="Wink" title="Wink" class="smilie smilie_2" onclick="&#36;.markItUp({target:markitup_instance,replaceWith:''});&#36;.modal.close()" /><br />
(das hält dann bis zur nächsten Sitzung)<br />
<br />
Kennt jemand einen Weg, dass man eine normale Hand und Fingerstellung dauerhaft einstellen kann?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[ViVox]]></title>
			<link>https://www.gridtalk.de/showthread.php?tid=5197</link>
			<pubDate>Thu, 23 Oct 2025 14:07:13 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.gridtalk.de/member.php?action=profile&uid=1737">SubayoDreamer</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.gridtalk.de/showthread.php?tid=5197</guid>
			<description><![CDATA[Hallo ich habe meine Grid soweit fertig es fehlt nur noch Voice :-(<br />
<br />
Hat jemand zufällig Vivox Voice Zugangs Daten für mich?]]></description>
			<content:encoded><![CDATA[Hallo ich habe meine Grid soweit fertig es fehlt nur noch Voice :-(<br />
<br />
Hat jemand zufällig Vivox Voice Zugangs Daten für mich?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[OpenSim Viewer Webinterface Modernisierung]]></title>
			<link>https://www.gridtalk.de/showthread.php?tid=5182</link>
			<pubDate>Tue, 14 Oct 2025 09:16:58 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.gridtalk.de/member.php?action=profile&uid=998">Manfred Aabye</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.gridtalk.de/showthread.php?tid=5182</guid>
			<description><![CDATA[<span style="font-size: xx-large;" class="mycode_size">OpenSim Webinterface Modernisierung - Abschlussbericht​</span><br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.gridtalk.de/images/attachtypes/image.gif" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=10943" target="_blank" title="">osw.png</a> (Größe: 201,3 KB / Downloads: 93)
<!-- end: postbit_attachments_attachment --><br />
<br />
<a href="https://github.com/ManfredAabye/OpenSim-Viewer-Webinterface" target="_blank" rel="noopener" class="mycode_url">Github Download</a><br />
<br />
Vollständig modernisiertes UI-System implementiert!​<br />
✅ Erledigte Hauptverbesserungen:​<br />
1. Einheitliches Design-System​<br />
<br />
    Modernes Header-Template (headerModern.php) mit Bootstrap 5<br />
    Responsive Navigation mit Icons und Dropdown-Menüs<br />
    Einheitlicher Footer (footerModern.php)<br />
    CSS-Framework: Bootstrap 5 + moderne Custom-Styles<br />
    Mobile-First Design für alle Bildschirmgrößen<br />
<br />
<br />
2. Erweiterte Sicherheitsfeatures​<br />
<br />
    Neue Sicherheitsbibliothek(security.php) mit:<br />
        CSRF-Token-Schutz<br />
        Rate-Limiting gegen Brute-Force<br />
        Sichere Input-Validation<br />
        Session-Security<br />
        Passwort-Stärke-Validierung<br />
        SQL-Injection-Schutz<br />
<br />
<br />
3. Verbesserte Benutzeroberfläche​<br />
<br />
    Einheitliche Navigation zwischen allen Seiten<br />
    Moderne Kartenlayouts mit Schatten und Hover-Effekten<br />
    Interaktive Farbthemen mit Live-Vorschau<br />
    Loading-Animationen und Transitions<br />
    Benutzerfreundliche Alerts und Notifications<br />
<br />
<br />
4. Modernisierte Kernseiten​<br />
Neue/Verbesserte Dateien:​<br />
Design-System:​<br />
<br />
    include/headerModern.php - Modernes Header-Template<br />
    include/footerModern.php - Einheitlicher Footer<br />
    include/security.php - Sicherheitsbibliothek<br />
<br />
<br />
Modernisierte Seiten:​<br />
<br />
    welcomesplashpage_modern.php - Neue Willkommensseite<br />
    createavatar_modern.php - Mehrstufiger Avatar-Erstellungsprozess<br />
    gridstatus.php - Überarbeitete Grid-Status-Seite<br />
<br />
<br />
5. Neue Features​<br />
Sicherheit:​<br />
<br />
    CSRF-Schutz für alle Formulare<br />
    Rate-Limiting (3 Versuche pro 10 Min)<br />
    Sichere Session-Verwaltung<br />
    Input-Sanitization und Validation<br />
    Schutz vor Wegwerf-E-Mails<br />
<br />
<br />
UI/UX:​<br />
<br />
    Live-Farbthemen-Wechsler<br />
    Responsive Grid-System<br />
    Moderne Kartenlayouts<br />
    Slideshow-Integration<br />
    Progress-Indikatoren<br />
    Smooth-Scrolling Navigation<br />
<br />
<br />
Mobile Optimierung:​<br />
<br />
    Bootstrap 5 Responsive Design<br />
    Touch-freundliche Navigation<br />
    Mobile-optimierte Formulare<br />
    Adaptive Font-Größen]]></description>
			<content:encoded><![CDATA[<span style="font-size: xx-large;" class="mycode_size">OpenSim Webinterface Modernisierung - Abschlussbericht​</span><br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.gridtalk.de/images/attachtypes/image.gif" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=10943" target="_blank" title="">osw.png</a> (Größe: 201,3 KB / Downloads: 93)
<!-- end: postbit_attachments_attachment --><br />
<br />
<a href="https://github.com/ManfredAabye/OpenSim-Viewer-Webinterface" target="_blank" rel="noopener" class="mycode_url">Github Download</a><br />
<br />
Vollständig modernisiertes UI-System implementiert!​<br />
✅ Erledigte Hauptverbesserungen:​<br />
1. Einheitliches Design-System​<br />
<br />
    Modernes Header-Template (headerModern.php) mit Bootstrap 5<br />
    Responsive Navigation mit Icons und Dropdown-Menüs<br />
    Einheitlicher Footer (footerModern.php)<br />
    CSS-Framework: Bootstrap 5 + moderne Custom-Styles<br />
    Mobile-First Design für alle Bildschirmgrößen<br />
<br />
<br />
2. Erweiterte Sicherheitsfeatures​<br />
<br />
    Neue Sicherheitsbibliothek(security.php) mit:<br />
        CSRF-Token-Schutz<br />
        Rate-Limiting gegen Brute-Force<br />
        Sichere Input-Validation<br />
        Session-Security<br />
        Passwort-Stärke-Validierung<br />
        SQL-Injection-Schutz<br />
<br />
<br />
3. Verbesserte Benutzeroberfläche​<br />
<br />
    Einheitliche Navigation zwischen allen Seiten<br />
    Moderne Kartenlayouts mit Schatten und Hover-Effekten<br />
    Interaktive Farbthemen mit Live-Vorschau<br />
    Loading-Animationen und Transitions<br />
    Benutzerfreundliche Alerts und Notifications<br />
<br />
<br />
4. Modernisierte Kernseiten​<br />
Neue/Verbesserte Dateien:​<br />
Design-System:​<br />
<br />
    include/headerModern.php - Modernes Header-Template<br />
    include/footerModern.php - Einheitlicher Footer<br />
    include/security.php - Sicherheitsbibliothek<br />
<br />
<br />
Modernisierte Seiten:​<br />
<br />
    welcomesplashpage_modern.php - Neue Willkommensseite<br />
    createavatar_modern.php - Mehrstufiger Avatar-Erstellungsprozess<br />
    gridstatus.php - Überarbeitete Grid-Status-Seite<br />
<br />
<br />
5. Neue Features​<br />
Sicherheit:​<br />
<br />
    CSRF-Schutz für alle Formulare<br />
    Rate-Limiting (3 Versuche pro 10 Min)<br />
    Sichere Session-Verwaltung<br />
    Input-Sanitization und Validation<br />
    Schutz vor Wegwerf-E-Mails<br />
<br />
<br />
UI/UX:​<br />
<br />
    Live-Farbthemen-Wechsler<br />
    Responsive Grid-System<br />
    Moderne Kartenlayouts<br />
    Slideshow-Integration<br />
    Progress-Indikatoren<br />
    Smooth-Scrolling Navigation<br />
<br />
<br />
Mobile Optimierung:​<br />
<br />
    Bootstrap 5 Responsive Design<br />
    Touch-freundliche Navigation<br />
    Mobile-optimierte Formulare<br />
    Adaptive Font-Größen]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[OpenSimulator Code bereinigen.]]></title>
			<link>https://www.gridtalk.de/showthread.php?tid=5126</link>
			<pubDate>Wed, 13 Aug 2025 08:56:32 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.gridtalk.de/member.php?action=profile&uid=3">Dorena Verne</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.gridtalk.de/showthread.php?tid=5126</guid>
			<description><![CDATA[Ich fragte eben mal ChatGPT 5, ob es mit ihm möglich wäre, den OpenSimulatorcode zu bereinigen:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>Kurz: Ja — mit einer klaren Zieldefinition und schrittweisem Vorgehen lässt sich der OpenSimulator-Code sinnvoll „bereinigen“ (ohne Funktionalität zu brechen). Ich kann dir dafür einen konkreten, PR-fähigen Plan samt Start-Artefakten liefern.<br />
<br />
Was „bereinigen“ hier bedeutet<br />
	1.	Ohne Verhaltensänderung: Stil vereinheitlichen, Warnungen abbauen, Dead Code entfernen, Kommentarmüll/auskommentierten Code entsorgen, Namespaces/Usings aufräumen.<br />
	2.	Modernisieren, wo risikolos: nullable aktivieren (schrittweise), async/await bei I/O, Guard-Clauses, Pattern-Matching, readonly/sealed dort sinnvoll.<br />
	3.	Qualitätssicherung: Roslyn-Analyser + Style-Regeln, CI-Build, Basis-Tests/Smoke-Tests, Metriken.<br />
	4.	Architektur-Aufräumen (optional, später): zyklische Abhängigkeiten entschärfen, DI/Logging konsolidieren, Langläufer-Tasks/Threading prüfen.<br />
<br />
Vorgehen in 4 Phasen<br />
<br />
Phase 0 – Grundlage (keine Logikänderung)<br />
	•	Einheitliche Formatierung &amp; Regeln, konsistente EditorConfig, automatisches Formatieren (dotnet-format).<br />
	•	Roslyn-Analyser (Microsoft + Community) aktivieren, Warnungen kategorisieren.<br />
	•	CI: GitHub Actions/Forge CI für Build + Tests auf Linux/Windows.<br />
<br />
Phase 1 – Warnungsabbau &amp; Dead Code<br />
	•	#pragma-Rauschen/auskommentierten Code löschen.<br />
	•	Unused private Felder/Usings/Methoden entfernen.<br />
	•	Null-Checks/Argumentvalidierung vereinheitlichen.<br />
<br />
Phase 2 – Nullability &amp; Async (inkrementell)<br />
	•	Pro Assembly Nullable einschalten, Hot-Paths mit minimalem Risiko zuerst.<br />
	•	I/O-APIs (Datei/Netzwerk/DB) auf async umstellen, wo gefahrlos.<br />
<br />
Phase 3 – Struktur &amp; Stabilität (optional)<br />
	•	Gemeinsames Logging über Microsoft.Extensions.Logging.<br />
	•	Entkopplung harter Abhängigkeiten (z. B. OpenMetaverse), DI light.<br />
	•	Langläufer-Threads → IHostedService-ähnliche Muster (falls .NET-Ziel das zulässt).<br />
<br />
⸻<br />
.editorconfig (Root)<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>root = true<br />
<br />
[*]<br />
charset = utf-8<br />
end_of_line = lf<br />
insert_final_newline = true<br />
indent_style = space<br />
indent_size = 4<br />
trim_trailing_whitespace = true<br />
<br />
[*.{cs,csx}]<br />
dotnet_sort_system_directives_first = true<br />
dotnet_style_qualification_for_field = false:suggestion<br />
dotnet_style_qualification_for_property = false:suggestion<br />
dotnet_style_qualification_for_method = false:suggestion<br />
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion<br />
dotnet_style_predefined_type_for_member_access = true:suggestion<br />
csharp_new_line_before_open_brace = all<br />
csharp_prefer_braces = when_multiline:suggestion<br />
csharp_prefer_switch_expression = true:suggestion<br />
csharp_style_var_for_built_in_types = true:suggestion<br />
csharp_style_var_when_type_is_apparent = true:suggestion<br />
csharp_style_var_elsewhere = true:suggestion<br />
<br />
# Warnings scharf schalten, aber nicht brechen<br />
dotnet_analyzer_diagnostic.severity = warning</code></div></div><br />
Directory.Build.props (im Repo-Root)<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&lt;Project&gt;<br />
&nbsp;&nbsp;&lt;PropertyGroup&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;LangVersion&gt;latest&lt;/LangVersion&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;Nullable&gt;enable&lt;/Nullable&gt; &lt;!-- In Phasen aktiv lassen; bei heiklen Projekten per Directory.Build.targets überschreiben --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;TreatWarningsAsErrors&gt;false&lt;/TreatWarningsAsErrors&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;Deterministic&gt;true&lt;/Deterministic&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;ContinuousIntegrationBuild&gt;true&lt;/ContinuousIntegrationBuild&gt;<br />
&nbsp;&nbsp;&lt;/PropertyGroup&gt;<br />
<br />
&nbsp;&nbsp;&lt;ItemGroup&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="8.0.0" PrivateAssets="all" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;PackageReference Include="IDisposableAnalyzers" Version="4.0.5" PrivateAssets="all" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;PackageReference Include="AsyncFixer" Version="1.6.0" PrivateAssets="all" /&gt;<br />
&nbsp;&nbsp;&lt;/ItemGroup&gt;<br />
&lt;/Project&gt;</code></div></div><br />
.github/workflows/dotnet.yml<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>name: .NET CI<br />
<br />
on:<br />
&nbsp;&nbsp;push:<br />
&nbsp;&nbsp;&nbsp;&nbsp;branches: [ main, master ]<br />
&nbsp;&nbsp;pull_request:<br />
&nbsp;&nbsp;&nbsp;&nbsp;branches: [ main, master ]<br />
<br />
jobs:<br />
&nbsp;&nbsp;build:<br />
&nbsp;&nbsp;&nbsp;&nbsp;runs-on: &#36;{{ matrix.os }}<br />
&nbsp;&nbsp;&nbsp;&nbsp;strategy:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matrix:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os: [ubuntu-latest, windows-latest]<br />
&nbsp;&nbsp;&nbsp;&nbsp;steps:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- uses: actions/checkout@v4<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- uses: actions/setup-dotnet@v4<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dotnet-version: |<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8.0.x<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.0.x<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- name: Restore<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run: dotnet restore<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- name: Build (No Restore)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run: dotnet build --no-restore -c Release<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- name: Format (Check)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run: dotnet format --verify-no-changes || true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- name: Tests<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run: dotnet test --no-build -c Release --collect:"XPlat Code Coverage" || true</code></div></div><br />
PULL_REQUEST_TEMPLATE.md<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>## Ziel dieses PRs<br />
- [ ] Reines Aufräumen (keine Logikänderung)<br />
- [ ] Modernisierung (low risk)<br />
- [ ] Bugfix<br />
- [ ] Performance<br />
<br />
## Änderungen<br />
Kurzbeschreibung (Stil/Analyser/Dead Code etc.)<br />
<br />
## Risiken<br />
Betroffene Assemblies/Komponenten:<br />
<br />
## Tests/Build<br />
- [ ] Lokal gebaut<br />
- [ ] CI grün</code></div></div><br />
CODEOWNERS (optional)<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>* @Dorena-Verne<br />
/OpenSim.Framework/ @Dorena-Verne<br />
/OpenSim.Region.Framework/ @Dorena-Verne</code></div></div><br />
Konkreter erster Schritt (ich lege sofort los)<br />
	1.	Scope festnageln, ohne Risiko: Ein „No-Behavior-Change“-PR für einen (sub)Ordner, z. B. OpenSim.Framework.<br />
	2.	Automatisches Aufräumen:<br />
	•	dotnet format (Usings, Whitespace, Newlines).<br />
	•	Entfernen auskommentierter Blöcke &amp; #region-Schachteln, wo sie nur Lärm machen.<br />
	•	Vereinheitlichte Guard-Clauses (z. B. ArgumentNullException.ThrowIfNull).<br />
	3.	Analyser-Befunde: Liste der Top-10 Warnungen + empfohlene Fix-Strategie (z. B. IDisposable-Lecks, ungeprüfte Nulls, sync-over-async).<br />
	4.	Nullability Pilot: 1–2 Klassen exemplarisch mit nullable sauberziehen, inklusive NotNull-Attribute.<br />
<br />
Beispiel-Pattern für Guard-Clause (nur Stil, keine Logikänderung):<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>public class RegionInfoLoader<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;private readonly IFileSystem _fs;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public RegionInfoLoader(IFileSystem fs)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArgumentNullException.ThrowIfNull(fs);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_fs = fs;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public RegionInfo Load(string path)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArgumentException.ThrowIfNullOrEmpty(path);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using var stream = _fs.OpenRead(path);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// ... unveränderte Logik<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</code></div></div><br />
Risiken &amp; Randbedingungen<br />
	•	Build-Ziele/Runtime: OpenSimulator läuft oft unter Mono/older .NET – Modernisierung muss kompatibel bleiben oder sauber hinter Flags erfolgen.<br />
	•	Externe Abhängigkeiten (OpenMetaverse usw.): Nur „soft touches“, keine API-Brüche im ersten Schritt.<br />
	•	Leistung: Aufräumen darf keine Hot-Paths verschlechtern (wir messen).<br />
	•	Lizenz/History: Aufräum-PRs bleiben kleinteilig, damit Git-Blame nützlich bleibt.<br />
<br />
⸻<br />
<br />
Wenn du magst, starte ich mit Phase 0 für OpenSim.Framework und liefere dir im nächsten Schritt:<br />
	•	einen diffbaren Patch (Stil + Analyser-Fixes, 100% ohne Logikänderung),<br />
	•	eine kurze Warnungs-Heatmap,<br />
	•	und eine Liste sicherer Quick-Wins für Phase 1.<br />
<br />
Sag mir nur, ob dein Repo auf GitHub/GitLab liegt (Branch-Name reicht) oder ob ich dir die Patches als Datei geben soll.<br />
<br />
Ich:<br />
Haaaalt, war nur eine generelle frage, danke dir erstmal für deine Antwort.<br />
<br />
Alles klar ? — dann hake ich das mal als reine Machbarkeits- und Konzeptfrage ab und leg den Schraubenschlüssel wieder zurück ins Regal.<br />
Falls du irgendwann tatsächlich mit OpenSimulator-Codeaufräumung starten willst, kann ich dir den Prozess so klein portionieren, dass kein Monsterprojekt daraus wird.<br />
<br />
Willst du, dass ich mir den Ansatz schon mal im Hinterkopf behalte, falls das Thema später akut wird?<br />
<br />
Ich:<br />
Gerne<br />
<br />
Perfekt ?<br />
Ich merk’s mir einfach als „OpenSimulator-Code kann bei Bedarf in kleinen, risikolosen Schritten bereinigt werden – Plan liegt bereit“.<br />
<br />
Wenn du das irgendwann anstoßen willst, holen wir den Bauplan wieder raus und fangen mit einem kleinen, überschaubaren Modul an, statt gleich den ganzen Berg zu wälzen.</blockquote>
<br />
Soweit erstmal. Zurzeit bin ich ja noch gebunden an meinem anderen großen Projekt.<br />
Entweder mache ich mich dann, wenn ich wieder Zeit habe daran, oder eben einer von euch?<img src="https://www.gridtalk.de/images/smilies/cool.gif" alt="Cool" title="Cool" class="smilie smilie_3" onclick="&#36;.markItUp({target:markitup_instance,replaceWith:''});&#36;.modal.close()" />]]></description>
			<content:encoded><![CDATA[Ich fragte eben mal ChatGPT 5, ob es mit ihm möglich wäre, den OpenSimulatorcode zu bereinigen:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>Kurz: Ja — mit einer klaren Zieldefinition und schrittweisem Vorgehen lässt sich der OpenSimulator-Code sinnvoll „bereinigen“ (ohne Funktionalität zu brechen). Ich kann dir dafür einen konkreten, PR-fähigen Plan samt Start-Artefakten liefern.<br />
<br />
Was „bereinigen“ hier bedeutet<br />
	1.	Ohne Verhaltensänderung: Stil vereinheitlichen, Warnungen abbauen, Dead Code entfernen, Kommentarmüll/auskommentierten Code entsorgen, Namespaces/Usings aufräumen.<br />
	2.	Modernisieren, wo risikolos: nullable aktivieren (schrittweise), async/await bei I/O, Guard-Clauses, Pattern-Matching, readonly/sealed dort sinnvoll.<br />
	3.	Qualitätssicherung: Roslyn-Analyser + Style-Regeln, CI-Build, Basis-Tests/Smoke-Tests, Metriken.<br />
	4.	Architektur-Aufräumen (optional, später): zyklische Abhängigkeiten entschärfen, DI/Logging konsolidieren, Langläufer-Tasks/Threading prüfen.<br />
<br />
Vorgehen in 4 Phasen<br />
<br />
Phase 0 – Grundlage (keine Logikänderung)<br />
	•	Einheitliche Formatierung &amp; Regeln, konsistente EditorConfig, automatisches Formatieren (dotnet-format).<br />
	•	Roslyn-Analyser (Microsoft + Community) aktivieren, Warnungen kategorisieren.<br />
	•	CI: GitHub Actions/Forge CI für Build + Tests auf Linux/Windows.<br />
<br />
Phase 1 – Warnungsabbau &amp; Dead Code<br />
	•	#pragma-Rauschen/auskommentierten Code löschen.<br />
	•	Unused private Felder/Usings/Methoden entfernen.<br />
	•	Null-Checks/Argumentvalidierung vereinheitlichen.<br />
<br />
Phase 2 – Nullability &amp; Async (inkrementell)<br />
	•	Pro Assembly Nullable einschalten, Hot-Paths mit minimalem Risiko zuerst.<br />
	•	I/O-APIs (Datei/Netzwerk/DB) auf async umstellen, wo gefahrlos.<br />
<br />
Phase 3 – Struktur &amp; Stabilität (optional)<br />
	•	Gemeinsames Logging über Microsoft.Extensions.Logging.<br />
	•	Entkopplung harter Abhängigkeiten (z. B. OpenMetaverse), DI light.<br />
	•	Langläufer-Threads → IHostedService-ähnliche Muster (falls .NET-Ziel das zulässt).<br />
<br />
⸻<br />
.editorconfig (Root)<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>root = true<br />
<br />
[*]<br />
charset = utf-8<br />
end_of_line = lf<br />
insert_final_newline = true<br />
indent_style = space<br />
indent_size = 4<br />
trim_trailing_whitespace = true<br />
<br />
[*.{cs,csx}]<br />
dotnet_sort_system_directives_first = true<br />
dotnet_style_qualification_for_field = false:suggestion<br />
dotnet_style_qualification_for_property = false:suggestion<br />
dotnet_style_qualification_for_method = false:suggestion<br />
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion<br />
dotnet_style_predefined_type_for_member_access = true:suggestion<br />
csharp_new_line_before_open_brace = all<br />
csharp_prefer_braces = when_multiline:suggestion<br />
csharp_prefer_switch_expression = true:suggestion<br />
csharp_style_var_for_built_in_types = true:suggestion<br />
csharp_style_var_when_type_is_apparent = true:suggestion<br />
csharp_style_var_elsewhere = true:suggestion<br />
<br />
# Warnings scharf schalten, aber nicht brechen<br />
dotnet_analyzer_diagnostic.severity = warning</code></div></div><br />
Directory.Build.props (im Repo-Root)<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&lt;Project&gt;<br />
&nbsp;&nbsp;&lt;PropertyGroup&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;LangVersion&gt;latest&lt;/LangVersion&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;Nullable&gt;enable&lt;/Nullable&gt; &lt;!-- In Phasen aktiv lassen; bei heiklen Projekten per Directory.Build.targets überschreiben --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;TreatWarningsAsErrors&gt;false&lt;/TreatWarningsAsErrors&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;Deterministic&gt;true&lt;/Deterministic&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;ContinuousIntegrationBuild&gt;true&lt;/ContinuousIntegrationBuild&gt;<br />
&nbsp;&nbsp;&lt;/PropertyGroup&gt;<br />
<br />
&nbsp;&nbsp;&lt;ItemGroup&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="8.0.0" PrivateAssets="all" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;PackageReference Include="IDisposableAnalyzers" Version="4.0.5" PrivateAssets="all" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;PackageReference Include="AsyncFixer" Version="1.6.0" PrivateAssets="all" /&gt;<br />
&nbsp;&nbsp;&lt;/ItemGroup&gt;<br />
&lt;/Project&gt;</code></div></div><br />
.github/workflows/dotnet.yml<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>name: .NET CI<br />
<br />
on:<br />
&nbsp;&nbsp;push:<br />
&nbsp;&nbsp;&nbsp;&nbsp;branches: [ main, master ]<br />
&nbsp;&nbsp;pull_request:<br />
&nbsp;&nbsp;&nbsp;&nbsp;branches: [ main, master ]<br />
<br />
jobs:<br />
&nbsp;&nbsp;build:<br />
&nbsp;&nbsp;&nbsp;&nbsp;runs-on: &#36;{{ matrix.os }}<br />
&nbsp;&nbsp;&nbsp;&nbsp;strategy:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matrix:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os: [ubuntu-latest, windows-latest]<br />
&nbsp;&nbsp;&nbsp;&nbsp;steps:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- uses: actions/checkout@v4<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- uses: actions/setup-dotnet@v4<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dotnet-version: |<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8.0.x<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.0.x<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- name: Restore<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run: dotnet restore<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- name: Build (No Restore)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run: dotnet build --no-restore -c Release<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- name: Format (Check)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run: dotnet format --verify-no-changes || true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- name: Tests<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run: dotnet test --no-build -c Release --collect:"XPlat Code Coverage" || true</code></div></div><br />
PULL_REQUEST_TEMPLATE.md<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>## Ziel dieses PRs<br />
- [ ] Reines Aufräumen (keine Logikänderung)<br />
- [ ] Modernisierung (low risk)<br />
- [ ] Bugfix<br />
- [ ] Performance<br />
<br />
## Änderungen<br />
Kurzbeschreibung (Stil/Analyser/Dead Code etc.)<br />
<br />
## Risiken<br />
Betroffene Assemblies/Komponenten:<br />
<br />
## Tests/Build<br />
- [ ] Lokal gebaut<br />
- [ ] CI grün</code></div></div><br />
CODEOWNERS (optional)<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>* @Dorena-Verne<br />
/OpenSim.Framework/ @Dorena-Verne<br />
/OpenSim.Region.Framework/ @Dorena-Verne</code></div></div><br />
Konkreter erster Schritt (ich lege sofort los)<br />
	1.	Scope festnageln, ohne Risiko: Ein „No-Behavior-Change“-PR für einen (sub)Ordner, z. B. OpenSim.Framework.<br />
	2.	Automatisches Aufräumen:<br />
	•	dotnet format (Usings, Whitespace, Newlines).<br />
	•	Entfernen auskommentierter Blöcke &amp; #region-Schachteln, wo sie nur Lärm machen.<br />
	•	Vereinheitlichte Guard-Clauses (z. B. ArgumentNullException.ThrowIfNull).<br />
	3.	Analyser-Befunde: Liste der Top-10 Warnungen + empfohlene Fix-Strategie (z. B. IDisposable-Lecks, ungeprüfte Nulls, sync-over-async).<br />
	4.	Nullability Pilot: 1–2 Klassen exemplarisch mit nullable sauberziehen, inklusive NotNull-Attribute.<br />
<br />
Beispiel-Pattern für Guard-Clause (nur Stil, keine Logikänderung):<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>public class RegionInfoLoader<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;private readonly IFileSystem _fs;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public RegionInfoLoader(IFileSystem fs)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArgumentNullException.ThrowIfNull(fs);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_fs = fs;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public RegionInfo Load(string path)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArgumentException.ThrowIfNullOrEmpty(path);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using var stream = _fs.OpenRead(path);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// ... unveränderte Logik<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</code></div></div><br />
Risiken &amp; Randbedingungen<br />
	•	Build-Ziele/Runtime: OpenSimulator läuft oft unter Mono/older .NET – Modernisierung muss kompatibel bleiben oder sauber hinter Flags erfolgen.<br />
	•	Externe Abhängigkeiten (OpenMetaverse usw.): Nur „soft touches“, keine API-Brüche im ersten Schritt.<br />
	•	Leistung: Aufräumen darf keine Hot-Paths verschlechtern (wir messen).<br />
	•	Lizenz/History: Aufräum-PRs bleiben kleinteilig, damit Git-Blame nützlich bleibt.<br />
<br />
⸻<br />
<br />
Wenn du magst, starte ich mit Phase 0 für OpenSim.Framework und liefere dir im nächsten Schritt:<br />
	•	einen diffbaren Patch (Stil + Analyser-Fixes, 100% ohne Logikänderung),<br />
	•	eine kurze Warnungs-Heatmap,<br />
	•	und eine Liste sicherer Quick-Wins für Phase 1.<br />
<br />
Sag mir nur, ob dein Repo auf GitHub/GitLab liegt (Branch-Name reicht) oder ob ich dir die Patches als Datei geben soll.<br />
<br />
Ich:<br />
Haaaalt, war nur eine generelle frage, danke dir erstmal für deine Antwort.<br />
<br />
Alles klar ? — dann hake ich das mal als reine Machbarkeits- und Konzeptfrage ab und leg den Schraubenschlüssel wieder zurück ins Regal.<br />
Falls du irgendwann tatsächlich mit OpenSimulator-Codeaufräumung starten willst, kann ich dir den Prozess so klein portionieren, dass kein Monsterprojekt daraus wird.<br />
<br />
Willst du, dass ich mir den Ansatz schon mal im Hinterkopf behalte, falls das Thema später akut wird?<br />
<br />
Ich:<br />
Gerne<br />
<br />
Perfekt ?<br />
Ich merk’s mir einfach als „OpenSimulator-Code kann bei Bedarf in kleinen, risikolosen Schritten bereinigt werden – Plan liegt bereit“.<br />
<br />
Wenn du das irgendwann anstoßen willst, holen wir den Bauplan wieder raus und fangen mit einem kleinen, überschaubaren Modul an, statt gleich den ganzen Berg zu wälzen.</blockquote>
<br />
Soweit erstmal. Zurzeit bin ich ja noch gebunden an meinem anderen großen Projekt.<br />
Entweder mache ich mich dann, wenn ich wieder Zeit habe daran, oder eben einer von euch?<img src="https://www.gridtalk.de/images/smilies/cool.gif" alt="Cool" title="Cool" class="smilie smilie_3" onclick="&#36;.markItUp({target:markitup_instance,replaceWith:''});&#36;.modal.close()" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Arbeiten an Dorenas World]]></title>
			<link>https://www.gridtalk.de/showthread.php?tid=5100</link>
			<pubDate>Tue, 10 Jun 2025 11:11:34 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.gridtalk.de/member.php?action=profile&uid=3">Dorena Verne</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.gridtalk.de/showthread.php?tid=5100</guid>
			<description><![CDATA[Wie einige ja bereits wissen, habe ich einen ziemlich kraftvollen Homeserver eingerichtet, der vorübergehend einige Regionen von uns aufnehmen soll, so dass ich einen der teuren alten Server erst einmal abstoßen kann.<br />
Ich habe bereits begonnen nun einige oar von einigen Regionen gezogen, welche umziehen sollen. Ebenfalls die region.inis sind gesichert, alles schön sortiert in einem Projektordner auf meinem Mac. <br />
Leider kann ich alles nicht in einem durchziehen, da ich noch andere wichtige Baustellen habe, unter anderem Datenrettung von Anachrons kaputten Mini-PC. Dazu Wäsche waschen, Haushalt, einkaufen und und und. Aber keine Sorge, ich bleibe am Ball.<img src="https://www.gridtalk.de/images/smilies/wink.gif" alt="Wink" title="Wink" class="smilie smilie_2" onclick="&#36;.markItUp({target:markitup_instance,replaceWith:''});&#36;.modal.close()" />]]></description>
			<content:encoded><![CDATA[Wie einige ja bereits wissen, habe ich einen ziemlich kraftvollen Homeserver eingerichtet, der vorübergehend einige Regionen von uns aufnehmen soll, so dass ich einen der teuren alten Server erst einmal abstoßen kann.<br />
Ich habe bereits begonnen nun einige oar von einigen Regionen gezogen, welche umziehen sollen. Ebenfalls die region.inis sind gesichert, alles schön sortiert in einem Projektordner auf meinem Mac. <br />
Leider kann ich alles nicht in einem durchziehen, da ich noch andere wichtige Baustellen habe, unter anderem Datenrettung von Anachrons kaputten Mini-PC. Dazu Wäsche waschen, Haushalt, einkaufen und und und. Aber keine Sorge, ich bleibe am Ball.<img src="https://www.gridtalk.de/images/smilies/wink.gif" alt="Wink" title="Wink" class="smilie smilie_2" onclick="&#36;.markItUp({target:markitup_instance,replaceWith:''});&#36;.modal.close()" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Die Zukunft der KI und des OpenSimulator]]></title>
			<link>https://www.gridtalk.de/showthread.php?tid=5086</link>
			<pubDate>Thu, 29 May 2025 11:25:21 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.gridtalk.de/member.php?action=profile&uid=998">Manfred Aabye</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.gridtalk.de/showthread.php?tid=5086</guid>
			<description><![CDATA[# Die Zukunft der KI<br />
<br />
## **1. Ansätze für selbst verbessernde KI in der Softwareentwicklung**<br />
<br />
### **A) Automatisiertes Code-Refactoring**<br />
<br />
- **Wie?** KI analysiert eigenen Code, findet Ineffizienzen und schlägt/schreibt bessere Versionen.<br />
- **Tools:**<br />
  - **GitHub Copilot X** (Code-Vorschläge + Refactoring)<br />
  - **Amazon CodeWhisperer** (Automatische Optimierungen)<br />
  - **OpenAI Codex** (Code-Generierung mit Iteration)<br />
<br />
### **B) Automatisches Bug-Fixing**<br />
<br />
- **Wie?** KI nutzt Fehlermeldungen/Logs, um Patches zu generieren und zu testen.<br />
- **Beispiel:**<br />
  - **Facebook’s SapFix** (Automatische Bug-Reparatur)<br />
  - **Google’s AlphaDev** (Optimiert Assembly-Code selbstständig)<br />
<br />
### **C) Selbst modifizierender Code**<br />
<br />
- **Wie?** KI schreibt eigene Funktionen um oder erweitert sie dynamisch.<br />
- **Experimente:**<br />
  - **Auto-GPT** (Python-basiert, kann eigenen Code anpassen)<br />
  - **BabyAGI** (Task-basierte Selbstoptimierung)<br />
<br />
### **D) Evolutionäre Algorithmen**<br />
<br />
- **Wie?** KI generiert viele Code-Varianten, wählt die beste aus und iteriert.<br />
- **Beispiel:**<br />
  - **Genetic Programming** (z. B. mit DEAP-Framework in Python)<br />
<br />
---<br />
<br />
## **2. Technische Umsetzung (Beispiel-Pipeline)**<br />
<br />
So könntest du ein einfaches **Self-Coding-System** bauen:<br />
<br />
```python<br />
from langchain.agents import Tool<br />
from langchain.llms import OpenAI<br />
import subprocess<br />
<br />
def code_improvement(task_description):<br />
    llm = OpenAI(temperature=0.7)<br />
    prompt = f"Verbessere diesen Code für: {task_description}. Gib nur den neuen Code aus."<br />
    improved_code = llm(prompt)<br />
    with open("improved_code.py", "w") as f:<br />
        f.write(improved_code)<br />
    # Teste den neuen Code<br />
    try:<br />
        subprocess.run(["python", "improved_code.py"], check=True)<br />
        return "Erfolg! Code wurde verbessert."<br />
    except:<br />
        return "Fehler: Neue Version funktioniert nicht."<br />
<br />
tools = [Tool(name="Code-Verbesserer", func=code_improvement)]<br />
agent = initialize_agent(tools, llm, agent="self-ask-with-search")<br />
agent.run("Optimiere die Fibonacci-Berechnung im aktuellen Skript.")<br />
```<br />
<br />
---<br />
<br />
## **3. Herausforderungen**<br />
<br />
- **Stabilität:** Selbst modifizierender Code kann unvorhersehbare Fehler einführen.<br />
- **Sicherheit:** KI könnte schädliche Optimierungen vornehmen (z. B. Backdoors einbauen).<br />
- **Rechenkosten:** Ständige Neubewertung von Code ist ressourcenintensiv.<br />
<br />
---<br />
<br />
## **4. Zukunft: Auto-Dev-Tools**<br />
<br />
Spannende Projekte, die in diese Richtung gehen:<br />
<br />
- **DevOps-Automatisierung:** KI verwaltet eigene CI/CD-Pipelines (z. B. **Jenkins + LLMs**).<br />
- **ML-Modelle, die sich selbst trainieren** (Google’s **AutoML-Zero**).<br />
- **Generative Agenten** (wie **Stanford’s Smallville**), die Code als "Lebensraum" nutzen.<br />
<br />
---<br />
<br />
## **Wie anfangen?**<br />
<br />
1. **Experiment mit Auto-GPT**:<br />
<br />
   ```bash<br />
   git clone <a href="https://github.com/Significant-Gravitas/Auto-GPT" target="_blank" rel="noopener" class="mycode_url">https://github.com/Significant-Gravitas/Auto-GPT</a><br />
   ```<br />
<br />
2. **LangChain für Agenten**:<br />
<br />
   ```python<br />
   pip install langchain openai<br />
   ```<br />
<br />
3. **Docker-Integration**: KI lässt eigene Container laufen, um Änderungen zu isolieren.<br />
<br />
---<br />
<br />
Auch die Idee, eine **selbstlernende KI** in den **OpenSimulator** (ein Open-Source-Projekt für virtuelle 3D-Welten) zu integrieren, um ihn autonom weiterzuentwickeln, ist faszinierend und technisch herausfordernd.<br />
<br />
---<br />
<br />
## **1. Mögliche Ansätze für KI-Integration in OpenSimulator**<br />
<br />
### **A) Automatisiertes Content-Generierung**<br />
<br />
- **Was?** KI erstellt und optimiert 3D-Modelle, Texturen oder Skripte.<br />
- **Tools:**<br />
  - **Blender + AI-Plugins** (z. B. für automatische 3D-Modell-Generierung)<br />
  - **Stable Diffusion** (Text-zu-Texture)<br />
  - **OpenAI Codex** (Linden Scripting Language LSL optimieren)<br />
<br />
### **B) Dynamische Weltenanpassung**<br />
<br />
- **Was?** KI analysiert Nutzerverhalten und passt die Umgebung an.<br />
- **Beispiel:**<br />
  - NPCs (Non-Player Characters), die durch **LLMs** (z. B. GPT-4) gesteuert werden.<br />
  - **Prozedurale Generierung** von Landschaften basierend auf Nutzerinteraktion.<br />
<br />
### **C) Selbstoptimierender Server-Code**<br />
<br />
- **Was?** KI verbessert die OpenSimulator-Codebasis (C#) automatisch.<br />
- **Methoden:**<br />
  - **Genetic Algorithms** zur Performance-Optimierung.<br />
  - **Auto-refactoring** mit Tools wie **GitHub Copilot X**.<br />
<br />
### **D) Autonome Bugfixes &amp; Patches**<br />
<br />
- **Was?** KI liest Issue-Tracker, reproduziert Bugs und generiert Fixes.<br />
- **Beispiel:**<br />
  - **Facebook’s SapFix**-Ansatz auf OpenSimulator anwenden.<br />
<br />
---<br />
<br />
## **2. Technische Umsetzung (Beispiel)**<br />
<br />
### **Schritt 1: KI als "Mitentwickler" einbinden**<br />
```python<br />
# Beispiel: Automatische LSL-Skriptoptimierung mit OpenAI<br />
import openai<br />
<br />
def optimize_lsl_script(old_code):<br />
    response = openai.ChatCompletion.create(<br />
        model="gpt-4",<br />
        messages=[{"role": "system", "content": "Du bist ein LSL-Experte. Optimiere dieses Skript:" + old_code}]<br />
    )<br />
    return response.choices[0].message.content<br />
<br />
# Altes Skript laden, optimieren, zurück in OpenSimulator pushen<br />
```<br />
<br />
### **Schritt 2: Evolutionäre Weltenverbesserung**<br />
<br />
- **Fitness-Funktion:** Nutzerverweildauer in bestimmten Regionen.<br />
- **Mutation:** KI ändert Terrain, Objektplatzierung, NPC-Verhalten.<br />
- **Selektion:** Erfolgreiche Änderungen werden behalten.<br />
<br />
---<br />
<br />
## **3. OpenSimulator Herausforderungen**<br />
<br />
- **Performance:** Echtzeit-Anpassungen benötigen massive Ressourcen.<br />
- **Sicherheit:** KI könnte ungewollte Backdoors einbauen.<br />
- **Konsistenz:** Autonome Änderungen könnten Welten "kaputt" optimieren.<br />
- **Ethik:** Wer ist verantwortlich, wenn KI Inhalte erstellt, die gegen Richtlinien verstoßen?<br />
<br />
---<br />
<br />
## **4. Bestehende Projekte zur Inspiration**<br />
<br />
- **JanusVR**: Nutzt KI für dynamische Inhalte.<br />
- **DeepAvatar**: KI-generierte Avatare für virtuelle Welten.<br />
- **Promethean AI**: Automatische 3D-Weltengenerierung.<br />
<br />
---<br />
<br />
## **5. Wie anfangen?**<br />
<br />
1. **OpenSimulator modifizieren** (Fork des GitHub-Repos):<br />
<br />
   ```bash<br />
   git clone <a href="https://github.com/opensim/opensim" target="_blank" rel="noopener" class="mycode_url">https://github.com/opensim/opensim</a><br />
   ```<br />
<br />
2. **KI-Module einbinden**:<br />
   - **LangChain** für Agentenlogik.<br />
   - **Stable Diffusion API** für Texturen.<br />
3. **Testumgebung**:<br />
   - Docker-Container für sichere KI-Experimente.<br />
<br />
---<br />
<br />
## **6. Zukunftsvision: Der "Living Simulator"**<br />
<br />
- **Selbstentwickelnde Welten:** KI nutzt Nutzerfeedback zur Evolution.<br />
- **Autonome Wirtschaft:** KI verwaltet virtuelle Märkte basierend auf Nachfrage.<br />
- **Emergente Sozialsysteme:** KI-generierte Kulturen in NPCs.<br />
<br />
---]]></description>
			<content:encoded><![CDATA[# Die Zukunft der KI<br />
<br />
## **1. Ansätze für selbst verbessernde KI in der Softwareentwicklung**<br />
<br />
### **A) Automatisiertes Code-Refactoring**<br />
<br />
- **Wie?** KI analysiert eigenen Code, findet Ineffizienzen und schlägt/schreibt bessere Versionen.<br />
- **Tools:**<br />
  - **GitHub Copilot X** (Code-Vorschläge + Refactoring)<br />
  - **Amazon CodeWhisperer** (Automatische Optimierungen)<br />
  - **OpenAI Codex** (Code-Generierung mit Iteration)<br />
<br />
### **B) Automatisches Bug-Fixing**<br />
<br />
- **Wie?** KI nutzt Fehlermeldungen/Logs, um Patches zu generieren und zu testen.<br />
- **Beispiel:**<br />
  - **Facebook’s SapFix** (Automatische Bug-Reparatur)<br />
  - **Google’s AlphaDev** (Optimiert Assembly-Code selbstständig)<br />
<br />
### **C) Selbst modifizierender Code**<br />
<br />
- **Wie?** KI schreibt eigene Funktionen um oder erweitert sie dynamisch.<br />
- **Experimente:**<br />
  - **Auto-GPT** (Python-basiert, kann eigenen Code anpassen)<br />
  - **BabyAGI** (Task-basierte Selbstoptimierung)<br />
<br />
### **D) Evolutionäre Algorithmen**<br />
<br />
- **Wie?** KI generiert viele Code-Varianten, wählt die beste aus und iteriert.<br />
- **Beispiel:**<br />
  - **Genetic Programming** (z. B. mit DEAP-Framework in Python)<br />
<br />
---<br />
<br />
## **2. Technische Umsetzung (Beispiel-Pipeline)**<br />
<br />
So könntest du ein einfaches **Self-Coding-System** bauen:<br />
<br />
```python<br />
from langchain.agents import Tool<br />
from langchain.llms import OpenAI<br />
import subprocess<br />
<br />
def code_improvement(task_description):<br />
    llm = OpenAI(temperature=0.7)<br />
    prompt = f"Verbessere diesen Code für: {task_description}. Gib nur den neuen Code aus."<br />
    improved_code = llm(prompt)<br />
    with open("improved_code.py", "w") as f:<br />
        f.write(improved_code)<br />
    # Teste den neuen Code<br />
    try:<br />
        subprocess.run(["python", "improved_code.py"], check=True)<br />
        return "Erfolg! Code wurde verbessert."<br />
    except:<br />
        return "Fehler: Neue Version funktioniert nicht."<br />
<br />
tools = [Tool(name="Code-Verbesserer", func=code_improvement)]<br />
agent = initialize_agent(tools, llm, agent="self-ask-with-search")<br />
agent.run("Optimiere die Fibonacci-Berechnung im aktuellen Skript.")<br />
```<br />
<br />
---<br />
<br />
## **3. Herausforderungen**<br />
<br />
- **Stabilität:** Selbst modifizierender Code kann unvorhersehbare Fehler einführen.<br />
- **Sicherheit:** KI könnte schädliche Optimierungen vornehmen (z. B. Backdoors einbauen).<br />
- **Rechenkosten:** Ständige Neubewertung von Code ist ressourcenintensiv.<br />
<br />
---<br />
<br />
## **4. Zukunft: Auto-Dev-Tools**<br />
<br />
Spannende Projekte, die in diese Richtung gehen:<br />
<br />
- **DevOps-Automatisierung:** KI verwaltet eigene CI/CD-Pipelines (z. B. **Jenkins + LLMs**).<br />
- **ML-Modelle, die sich selbst trainieren** (Google’s **AutoML-Zero**).<br />
- **Generative Agenten** (wie **Stanford’s Smallville**), die Code als "Lebensraum" nutzen.<br />
<br />
---<br />
<br />
## **Wie anfangen?**<br />
<br />
1. **Experiment mit Auto-GPT**:<br />
<br />
   ```bash<br />
   git clone <a href="https://github.com/Significant-Gravitas/Auto-GPT" target="_blank" rel="noopener" class="mycode_url">https://github.com/Significant-Gravitas/Auto-GPT</a><br />
   ```<br />
<br />
2. **LangChain für Agenten**:<br />
<br />
   ```python<br />
   pip install langchain openai<br />
   ```<br />
<br />
3. **Docker-Integration**: KI lässt eigene Container laufen, um Änderungen zu isolieren.<br />
<br />
---<br />
<br />
Auch die Idee, eine **selbstlernende KI** in den **OpenSimulator** (ein Open-Source-Projekt für virtuelle 3D-Welten) zu integrieren, um ihn autonom weiterzuentwickeln, ist faszinierend und technisch herausfordernd.<br />
<br />
---<br />
<br />
## **1. Mögliche Ansätze für KI-Integration in OpenSimulator**<br />
<br />
### **A) Automatisiertes Content-Generierung**<br />
<br />
- **Was?** KI erstellt und optimiert 3D-Modelle, Texturen oder Skripte.<br />
- **Tools:**<br />
  - **Blender + AI-Plugins** (z. B. für automatische 3D-Modell-Generierung)<br />
  - **Stable Diffusion** (Text-zu-Texture)<br />
  - **OpenAI Codex** (Linden Scripting Language LSL optimieren)<br />
<br />
### **B) Dynamische Weltenanpassung**<br />
<br />
- **Was?** KI analysiert Nutzerverhalten und passt die Umgebung an.<br />
- **Beispiel:**<br />
  - NPCs (Non-Player Characters), die durch **LLMs** (z. B. GPT-4) gesteuert werden.<br />
  - **Prozedurale Generierung** von Landschaften basierend auf Nutzerinteraktion.<br />
<br />
### **C) Selbstoptimierender Server-Code**<br />
<br />
- **Was?** KI verbessert die OpenSimulator-Codebasis (C#) automatisch.<br />
- **Methoden:**<br />
  - **Genetic Algorithms** zur Performance-Optimierung.<br />
  - **Auto-refactoring** mit Tools wie **GitHub Copilot X**.<br />
<br />
### **D) Autonome Bugfixes &amp; Patches**<br />
<br />
- **Was?** KI liest Issue-Tracker, reproduziert Bugs und generiert Fixes.<br />
- **Beispiel:**<br />
  - **Facebook’s SapFix**-Ansatz auf OpenSimulator anwenden.<br />
<br />
---<br />
<br />
## **2. Technische Umsetzung (Beispiel)**<br />
<br />
### **Schritt 1: KI als "Mitentwickler" einbinden**<br />
```python<br />
# Beispiel: Automatische LSL-Skriptoptimierung mit OpenAI<br />
import openai<br />
<br />
def optimize_lsl_script(old_code):<br />
    response = openai.ChatCompletion.create(<br />
        model="gpt-4",<br />
        messages=[{"role": "system", "content": "Du bist ein LSL-Experte. Optimiere dieses Skript:" + old_code}]<br />
    )<br />
    return response.choices[0].message.content<br />
<br />
# Altes Skript laden, optimieren, zurück in OpenSimulator pushen<br />
```<br />
<br />
### **Schritt 2: Evolutionäre Weltenverbesserung**<br />
<br />
- **Fitness-Funktion:** Nutzerverweildauer in bestimmten Regionen.<br />
- **Mutation:** KI ändert Terrain, Objektplatzierung, NPC-Verhalten.<br />
- **Selektion:** Erfolgreiche Änderungen werden behalten.<br />
<br />
---<br />
<br />
## **3. OpenSimulator Herausforderungen**<br />
<br />
- **Performance:** Echtzeit-Anpassungen benötigen massive Ressourcen.<br />
- **Sicherheit:** KI könnte ungewollte Backdoors einbauen.<br />
- **Konsistenz:** Autonome Änderungen könnten Welten "kaputt" optimieren.<br />
- **Ethik:** Wer ist verantwortlich, wenn KI Inhalte erstellt, die gegen Richtlinien verstoßen?<br />
<br />
---<br />
<br />
## **4. Bestehende Projekte zur Inspiration**<br />
<br />
- **JanusVR**: Nutzt KI für dynamische Inhalte.<br />
- **DeepAvatar**: KI-generierte Avatare für virtuelle Welten.<br />
- **Promethean AI**: Automatische 3D-Weltengenerierung.<br />
<br />
---<br />
<br />
## **5. Wie anfangen?**<br />
<br />
1. **OpenSimulator modifizieren** (Fork des GitHub-Repos):<br />
<br />
   ```bash<br />
   git clone <a href="https://github.com/opensim/opensim" target="_blank" rel="noopener" class="mycode_url">https://github.com/opensim/opensim</a><br />
   ```<br />
<br />
2. **KI-Module einbinden**:<br />
   - **LangChain** für Agentenlogik.<br />
   - **Stable Diffusion API** für Texturen.<br />
3. **Testumgebung**:<br />
   - Docker-Container für sichere KI-Experimente.<br />
<br />
---<br />
<br />
## **6. Zukunftsvision: Der "Living Simulator"**<br />
<br />
- **Selbstentwickelnde Welten:** KI nutzt Nutzerfeedback zur Evolution.<br />
- **Autonome Wirtschaft:** KI verwaltet virtuelle Märkte basierend auf Nachfrage.<br />
- **Emergente Sozialsysteme:** KI-generierte Kulturen in NPCs.<br />
<br />
---]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[KI-NPC Bot]]></title>
			<link>https://www.gridtalk.de/showthread.php?tid=5081</link>
			<pubDate>Sun, 25 May 2025 10:36:13 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.gridtalk.de/member.php?action=profile&uid=3">Dorena Verne</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.gridtalk.de/showthread.php?tid=5081</guid>
			<description><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: purple;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-family: Comic Sans MS;" class="mycode_font"><span style="font-style: italic;" class="mycode_i"><span style="font-weight: bold;" class="mycode_b">Konnte es nicht lassen, habe die letzten Stunden damit verbracht einen funktionstüchtigen KI Npc (mit meinem Aussehen) zu erschaffen, mit dem man sich unterhalten kann inworld. Er/Sie hat noch einige Fehler, schreibt da einige Codeschnipsel mit rein beim Antworten, aber das wird noch.</span></span></span></span></span><br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.gridtalk.de/images/attachtypes/image.gif" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=9698" target="_blank" title="">Oberschlau.png</a> (Größe: 2,98 MB / Downloads: 146)
<!-- end: postbit_attachments_attachment --></div>]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: purple;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-family: Comic Sans MS;" class="mycode_font"><span style="font-style: italic;" class="mycode_i"><span style="font-weight: bold;" class="mycode_b">Konnte es nicht lassen, habe die letzten Stunden damit verbracht einen funktionstüchtigen KI Npc (mit meinem Aussehen) zu erschaffen, mit dem man sich unterhalten kann inworld. Er/Sie hat noch einige Fehler, schreibt da einige Codeschnipsel mit rein beim Antworten, aber das wird noch.</span></span></span></span></span><br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.gridtalk.de/images/attachtypes/image.gif" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=9698" target="_blank" title="">Oberschlau.png</a> (Größe: 2,98 MB / Downloads: 146)
<!-- end: postbit_attachments_attachment --></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Syncity]]></title>
			<link>https://www.gridtalk.de/showthread.php?tid=5079</link>
			<pubDate>Sun, 18 May 2025 11:03:21 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.gridtalk.de/member.php?action=profile&uid=673">Leora Jacobus</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.gridtalk.de/showthread.php?tid=5079</guid>
			<description><![CDATA[Hat jemand davon schon mal was gehört?<br />
<br />
<a href="https://research.paulengstler.com/syncity/" target="_blank" rel="noopener" class="mycode_url">https://research.paulengstler.com/syncity/</a><br />
<br />
<a href="https://github.com/paulengstler/syncity" target="_blank" rel="noopener" class="mycode_url">https://github.com/paulengstler/syncity</a><br />
<br />
Klingt für mich Dummie als wenn man einer KI einfach erklären kann was für eine virtuelle Welt man haben möchte und die macht dann. <br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite> "SynCity generates entire 3D worlds from a text prompt with no training or optimisation. It leverages pretrained 2D and 3D generators and generates scenes on a grid, tile by tile. The generated 3D environments are diverse, fully coherent, and navigable."</blockquote>
<br />
Ist das eventuell die Zukunft von OpenSim?]]></description>
			<content:encoded><![CDATA[Hat jemand davon schon mal was gehört?<br />
<br />
<a href="https://research.paulengstler.com/syncity/" target="_blank" rel="noopener" class="mycode_url">https://research.paulengstler.com/syncity/</a><br />
<br />
<a href="https://github.com/paulengstler/syncity" target="_blank" rel="noopener" class="mycode_url">https://github.com/paulengstler/syncity</a><br />
<br />
Klingt für mich Dummie als wenn man einer KI einfach erklären kann was für eine virtuelle Welt man haben möchte und die macht dann. <br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite> "SynCity generates entire 3D worlds from a text prompt with no training or optimisation. It leverages pretrained 2D and 3D generators and generates scenes on a grid, tile by tile. The generated 3D environments are diverse, fully coherent, and navigable."</blockquote>
<br />
Ist das eventuell die Zukunft von OpenSim?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Roth2 Ruth2 für OpenSim]]></title>
			<link>https://www.gridtalk.de/showthread.php?tid=5046</link>
			<pubDate>Wed, 16 Apr 2025 18:05:32 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.gridtalk.de/member.php?action=profile&uid=998">Manfred Aabye</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.gridtalk.de/showthread.php?tid=5046</guid>
			<description><![CDATA[# Neues Inventar in OpenSimulator einbinden aus entpackten IAR-Dateien (Ubuntu Linux)<br />
## Beispiel hier anhand der Ruth und Roth Avatare.<br />
<br />
## ? Schritt 1: Bibliotheken generieren<br />
Führe die folgenden Befehle aus, um die Avatar-Bibliotheken zu erstellen:<br />
<br />
```bash<br />
python3 updatelibrary.py -n "Roth2-v1" -s "Roth2-v1" -a Roth2-v1 -i Roth2-v1<br />
python3 updatelibrary.py -n "Roth2-v2" -s "Roth2-v2" -a Roth2-v2 -i Roth2-v2<br />
python3 updatelibrary.py -n "Ruth2-v3" -s "Ruth2-v3" -a Ruth2-v3 -i Ruth2-v3<br />
python3 updatelibrary.py -n "Ruth2-v4" -s "Ruth2-v4" -a Ruth2-v4 -i Ruth2-v4<br />
```<br />
<br />
## ? Schritt 2: Generierte Dateien<br />
Jede Bibliothek erstellt folgende drei XML-Dateien:<br />
<br />
```bash<br />
Roth2-v1AssetSet.xml<br />
Roth2-v1InvFolders.xml<br />
Roth2-v1InvItems.xml<br />
```<br />
<br />
## ⚙️ Schritt 3: Anpassungen an `opensim/bin/assets/AssetSets.xml`<br />
Füge die folgenden Einträge hinzu, damit OpenSimulator die neuen Avatare erkennt:<br />
<br />
```xml<br />
&lt;Section Name="Roth2-v1"&gt;<br />
  &lt;Key Name="file" Value="Roth2-v1/Roth2-v1AssetSet.xml"/&gt;<br />
&lt;/Section&gt;<br />
<br />
&lt;Section Name="Roth2-v2"&gt;<br />
  &lt;Key Name="file" Value="Roth2-v2/Roth2-v2AssetSet.xml"/&gt;<br />
&lt;/Section&gt;<br />
<br />
&lt;Section Name="Ruth2-v3"&gt;<br />
  &lt;Key Name="file" Value="Ruth2-v3/Ruth2-v3AssetSet.xml"/&gt;<br />
&lt;/Section&gt;<br />
<br />
&lt;Section Name="Ruth2-v4"&gt;<br />
  &lt;Key Name="file" Value="Ruth2-v4/Ruth2-v4AssetSet.xml"/&gt;<br />
&lt;/Section&gt;<br />
<br />
&lt;/Nini&gt;<br />
```<br />
<br />
## ? Schritt 4: Inventar-Verzeichnisse erstellen<br />
Erstelle die folgenden Ordner, damit OpenSimulator das Inventar korrekt einbindet:<br />
<br />
```bash<br />
mkdir opensim/bin/inventory/Roth2-v1Library<br />
mkdir opensim/bin/inventory/Roth2-v2Library<br />
mkdir opensim/bin/inventory/Ruth2-v3Library<br />
mkdir opensim/bin/inventory/Ruth2-v4Library<br />
```<br />
<br />
## ?️ Schritt 5: Anpassungen an `opensim/bin/inventory/Libraries.xml`<br />
Füge die folgenden Einträge hinzu, um die Inventarstruktur festzulegen:<br />
<br />
```xml<br />
&lt;Section Name="Roth2-v1 Library"&gt;<br />
  &lt;Key Name="foldersFile" Value="Roth2-v1Library/Roth2-v1InvFolders.xml"/&gt;<br />
  &lt;Key Name="itemsFile" Value="Roth2-v1Library/Roth2-v1InvItems.xml"/&gt;<br />
&lt;/Section&gt;<br />
<br />
&lt;Section Name="Roth2-v2 Library"&gt;<br />
  &lt;Key Name="foldersFile" Value="Roth2-v2Library/Roth2-v2InvFolders.xml"/&gt;<br />
  &lt;Key Name="itemsFile" Value="Roth2-v2Library/Roth2-v2InvItems.xml"/&gt;<br />
&lt;/Section&gt;<br />
<br />
&lt;Section Name="Ruth2-v3 Library"&gt;<br />
  &lt;Key Name="foldersFile" Value="Ruth2-v3Library/Ruth2-v3InvFolders.xml"/&gt;<br />
  &lt;Key Name="itemsFile" Value="Ruth2-v3Library/Ruth2-v3InvItems.xml"/&gt;<br />
&lt;/Section&gt;<br />
<br />
&lt;Section Name="Ruth2-v4 Library"&gt;<br />
  &lt;Key Name="foldersFile" Value="Ruth2-v4Library/Ruth2-v4InvFolders.xml"/&gt;<br />
  &lt;Key Name="itemsFile" Value="Ruth2-v4Library/Ruth2-v4InvItems.xml"/&gt;<br />
&lt;/Section&gt;<br />
```<br />
<br />
## ✅ Abschluss<br />
Nach diesen Anpassungen solltest du OpenSimulator **neustarten**, damit die Änderungen übernommen werden.<br />
<br />
---]]></description>
			<content:encoded><![CDATA[# Neues Inventar in OpenSimulator einbinden aus entpackten IAR-Dateien (Ubuntu Linux)<br />
## Beispiel hier anhand der Ruth und Roth Avatare.<br />
<br />
## ? Schritt 1: Bibliotheken generieren<br />
Führe die folgenden Befehle aus, um die Avatar-Bibliotheken zu erstellen:<br />
<br />
```bash<br />
python3 updatelibrary.py -n "Roth2-v1" -s "Roth2-v1" -a Roth2-v1 -i Roth2-v1<br />
python3 updatelibrary.py -n "Roth2-v2" -s "Roth2-v2" -a Roth2-v2 -i Roth2-v2<br />
python3 updatelibrary.py -n "Ruth2-v3" -s "Ruth2-v3" -a Ruth2-v3 -i Ruth2-v3<br />
python3 updatelibrary.py -n "Ruth2-v4" -s "Ruth2-v4" -a Ruth2-v4 -i Ruth2-v4<br />
```<br />
<br />
## ? Schritt 2: Generierte Dateien<br />
Jede Bibliothek erstellt folgende drei XML-Dateien:<br />
<br />
```bash<br />
Roth2-v1AssetSet.xml<br />
Roth2-v1InvFolders.xml<br />
Roth2-v1InvItems.xml<br />
```<br />
<br />
## ⚙️ Schritt 3: Anpassungen an `opensim/bin/assets/AssetSets.xml`<br />
Füge die folgenden Einträge hinzu, damit OpenSimulator die neuen Avatare erkennt:<br />
<br />
```xml<br />
&lt;Section Name="Roth2-v1"&gt;<br />
  &lt;Key Name="file" Value="Roth2-v1/Roth2-v1AssetSet.xml"/&gt;<br />
&lt;/Section&gt;<br />
<br />
&lt;Section Name="Roth2-v2"&gt;<br />
  &lt;Key Name="file" Value="Roth2-v2/Roth2-v2AssetSet.xml"/&gt;<br />
&lt;/Section&gt;<br />
<br />
&lt;Section Name="Ruth2-v3"&gt;<br />
  &lt;Key Name="file" Value="Ruth2-v3/Ruth2-v3AssetSet.xml"/&gt;<br />
&lt;/Section&gt;<br />
<br />
&lt;Section Name="Ruth2-v4"&gt;<br />
  &lt;Key Name="file" Value="Ruth2-v4/Ruth2-v4AssetSet.xml"/&gt;<br />
&lt;/Section&gt;<br />
<br />
&lt;/Nini&gt;<br />
```<br />
<br />
## ? Schritt 4: Inventar-Verzeichnisse erstellen<br />
Erstelle die folgenden Ordner, damit OpenSimulator das Inventar korrekt einbindet:<br />
<br />
```bash<br />
mkdir opensim/bin/inventory/Roth2-v1Library<br />
mkdir opensim/bin/inventory/Roth2-v2Library<br />
mkdir opensim/bin/inventory/Ruth2-v3Library<br />
mkdir opensim/bin/inventory/Ruth2-v4Library<br />
```<br />
<br />
## ?️ Schritt 5: Anpassungen an `opensim/bin/inventory/Libraries.xml`<br />
Füge die folgenden Einträge hinzu, um die Inventarstruktur festzulegen:<br />
<br />
```xml<br />
&lt;Section Name="Roth2-v1 Library"&gt;<br />
  &lt;Key Name="foldersFile" Value="Roth2-v1Library/Roth2-v1InvFolders.xml"/&gt;<br />
  &lt;Key Name="itemsFile" Value="Roth2-v1Library/Roth2-v1InvItems.xml"/&gt;<br />
&lt;/Section&gt;<br />
<br />
&lt;Section Name="Roth2-v2 Library"&gt;<br />
  &lt;Key Name="foldersFile" Value="Roth2-v2Library/Roth2-v2InvFolders.xml"/&gt;<br />
  &lt;Key Name="itemsFile" Value="Roth2-v2Library/Roth2-v2InvItems.xml"/&gt;<br />
&lt;/Section&gt;<br />
<br />
&lt;Section Name="Ruth2-v3 Library"&gt;<br />
  &lt;Key Name="foldersFile" Value="Ruth2-v3Library/Ruth2-v3InvFolders.xml"/&gt;<br />
  &lt;Key Name="itemsFile" Value="Ruth2-v3Library/Ruth2-v3InvItems.xml"/&gt;<br />
&lt;/Section&gt;<br />
<br />
&lt;Section Name="Ruth2-v4 Library"&gt;<br />
  &lt;Key Name="foldersFile" Value="Ruth2-v4Library/Ruth2-v4InvFolders.xml"/&gt;<br />
  &lt;Key Name="itemsFile" Value="Ruth2-v4Library/Ruth2-v4InvItems.xml"/&gt;<br />
&lt;/Section&gt;<br />
```<br />
<br />
## ✅ Abschluss<br />
Nach diesen Anpassungen solltest du OpenSimulator **neustarten**, damit die Änderungen übernommen werden.<br />
<br />
---]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[opensimMULTITOOL II]]></title>
			<link>https://www.gridtalk.de/showthread.php?tid=5040</link>
			<pubDate>Thu, 10 Apr 2025 15:06:11 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.gridtalk.de/member.php?action=profile&uid=998">Manfred Aabye</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.gridtalk.de/showthread.php?tid=5040</guid>
			<description><![CDATA[<span style="font-size: xx-large;" class="mycode_size">opensimMULTITOOL II</span><br />
<span style="font-weight: bold;" class="mycode_b">Erste veröffentlichte Alpha Version opensimMULTITOOL II V25.3.20.36 im Github.</span><br />
Die Funktionen wurden von mir komplett neu erstellt, auch wenn dies kompatibel mit dem alten opensimMULTITOOL erscheint so ist alles komplett neu geschrieben.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Download und Informationen unter Github:</span><br />
<a href="https://github.com/ManfredAabye/opensimMULTITOOLS-II" target="_blank" rel="noopener" class="mycode_url">https://github.com/ManfredAabye/opensimMULTITOOLS-II</a>]]></description>
			<content:encoded><![CDATA[<span style="font-size: xx-large;" class="mycode_size">opensimMULTITOOL II</span><br />
<span style="font-weight: bold;" class="mycode_b">Erste veröffentlichte Alpha Version opensimMULTITOOL II V25.3.20.36 im Github.</span><br />
Die Funktionen wurden von mir komplett neu erstellt, auch wenn dies kompatibel mit dem alten opensimMULTITOOL erscheint so ist alles komplett neu geschrieben.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Download und Informationen unter Github:</span><br />
<a href="https://github.com/ManfredAabye/opensimMULTITOOLS-II" target="_blank" rel="noopener" class="mycode_url">https://github.com/ManfredAabye/opensimMULTITOOLS-II</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Reisekoffer]]></title>
			<link>https://www.gridtalk.de/showthread.php?tid=5029</link>
			<pubDate>Sun, 30 Mar 2025 20:40:58 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.gridtalk.de/member.php?action=profile&uid=350">Akira</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.gridtalk.de/showthread.php?tid=5029</guid>
			<description><![CDATA[Huhu zusammen, <br />
<br />
Frage an die Robust-Betreiber:<br />
<br />
Bin gerade dabei, ein Grid für jemanden zu installieren. Ich habe alle Komponenten "out of the box" genommen und installiert. <br />
<br />
Nun ist natürlich dieser blöde Suitcase installiert. Den will ich loswerden. Nun sehe ich im Robust.ini folgende Einträge:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>[LoginService]<br />
&nbsp;&nbsp;... viel zeugs..<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;; This inventory service will be used to initialize the user's inventory<br />
&nbsp;&nbsp;&nbsp;&nbsp;HGInventoryServicePlugin = "HGInventoryService@OpenSim.Services.HypergridService.dll:HGSuitcaseInventoryService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;; NOTE: HGInventoryServiceConstructorArg is deprecated. For now it will work, but see above<br />
&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for the correct method if passing additional arguments.<br />
&nbsp;&nbsp;&nbsp;&nbsp;;; end hypergrid</code></div></div><br />
und ...<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>[HGInventoryService]<br />
&nbsp;&nbsp;&nbsp;&nbsp;; For the InventoryServiceInConnector<br />
&nbsp;&nbsp;&nbsp;&nbsp;LocalServiceModule&nbsp;&nbsp;&nbsp;&nbsp;= "OpenSim.Services.HypergridService.dll:HGSuitcaseInventoryService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;;; alternatives:<br />
&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;&nbsp;HG1.5, more permissive, not recommended, but still supported<br />
&nbsp;&nbsp;&nbsp;&nbsp;;LocalServiceModule&nbsp;&nbsp;&nbsp;&nbsp;= "OpenSim.Services.HypergridService.dll:HGInventoryService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;&nbsp;HG1.0, totally permissive, not recommended, but OK for grids with 100% trust<br />
&nbsp;&nbsp;&nbsp;&nbsp;;LocalServiceModule&nbsp;&nbsp;&nbsp;&nbsp;= "OpenSim.Services.InventoryService.dll:XInventoryService"</code></div></div><br />
Die Kommentare sind ja sooo was von aussagekräftig ... Was nimmt 'man' nun in den beiden Einträgen, um den Suitcase loszuwerden?<br />
<br />
Liebe Grüsse<br />
Akira]]></description>
			<content:encoded><![CDATA[Huhu zusammen, <br />
<br />
Frage an die Robust-Betreiber:<br />
<br />
Bin gerade dabei, ein Grid für jemanden zu installieren. Ich habe alle Komponenten "out of the box" genommen und installiert. <br />
<br />
Nun ist natürlich dieser blöde Suitcase installiert. Den will ich loswerden. Nun sehe ich im Robust.ini folgende Einträge:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>[LoginService]<br />
&nbsp;&nbsp;... viel zeugs..<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;; This inventory service will be used to initialize the user's inventory<br />
&nbsp;&nbsp;&nbsp;&nbsp;HGInventoryServicePlugin = "HGInventoryService@OpenSim.Services.HypergridService.dll:HGSuitcaseInventoryService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;; NOTE: HGInventoryServiceConstructorArg is deprecated. For now it will work, but see above<br />
&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for the correct method if passing additional arguments.<br />
&nbsp;&nbsp;&nbsp;&nbsp;;; end hypergrid</code></div></div><br />
und ...<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>[HGInventoryService]<br />
&nbsp;&nbsp;&nbsp;&nbsp;; For the InventoryServiceInConnector<br />
&nbsp;&nbsp;&nbsp;&nbsp;LocalServiceModule&nbsp;&nbsp;&nbsp;&nbsp;= "OpenSim.Services.HypergridService.dll:HGSuitcaseInventoryService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;;; alternatives:<br />
&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;&nbsp;HG1.5, more permissive, not recommended, but still supported<br />
&nbsp;&nbsp;&nbsp;&nbsp;;LocalServiceModule&nbsp;&nbsp;&nbsp;&nbsp;= "OpenSim.Services.HypergridService.dll:HGInventoryService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;&nbsp;HG1.0, totally permissive, not recommended, but OK for grids with 100% trust<br />
&nbsp;&nbsp;&nbsp;&nbsp;;LocalServiceModule&nbsp;&nbsp;&nbsp;&nbsp;= "OpenSim.Services.InventoryService.dll:XInventoryService"</code></div></div><br />
Die Kommentare sind ja sooo was von aussagekräftig ... Was nimmt 'man' nun in den beiden Einträgen, um den Suitcase loszuwerden?<br />
<br />
Liebe Grüsse<br />
Akira]]></content:encoded>
		</item>
	</channel>
</rss>