286 lines
21 KiB
XML
286 lines
21 KiB
XML
<!--
|
|
RSS generated by JIRA (1001.0.0-SNAPSHOT#100292-rev:5fda9e0fdd2f2fe2b6bc3376de24f51bf166a518) at Wed Jul 01 12:29:44 UTC 2026
|
|
|
|
It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
|
|
For example, to request only the issue key and summary add field=key&field=summary to the URL of your request.
|
|
-->
|
|
<rss version="0.92" >
|
|
<channel>
|
|
<title>Jira adesso Group extern</title>
|
|
<link>https://adesso-group-extern.atlassian.net</link>
|
|
<description>This file is an XML representation of an issue</description>
|
|
<language>en-us</language> <build-info>
|
|
<version>1001.0.0-SNAPSHOT</version>
|
|
<build-number>100292</build-number>
|
|
<build-date>30-06-2026</build-date>
|
|
</build-info>
|
|
|
|
<item>
|
|
<title>[GEKO-76] Allround-Schutzzaun: Intelligente Steher-Logik</title>
|
|
<link>https://adesso-group-extern.atlassian.net/browse/GEKO-76</link>
|
|
<project id="12341" key="GEKO">GEKO</project>
|
|
<description><p>Dieses Ticket implementiert die selbstheilende Logik für die Steher (Pfosten) des Allround-Schutzzauns. Ein platziertes Allround-Element wird automatisch in drei funktionsfähige 3D-Komponenten zerlegt. Die Steher passen ihre Bauform (A–G) nach dem Platzieren via lokalem Event-Listener dynamisch an belegte PMIs an und steuern ihre Höhe synchron zu den angeschlossenen Zäunen. Nutzer können Bauform und Höhe über das Detailmenü manuell überschreiben, wobei das UI die wählbaren Bauformen streng auf die laut Matrix gültigen Optionen einschränkt.</p>
|
|
|
|
<h3><a name="%F0%9F%9F%A6DefinitionofReady%C2%A0"></a><b>�� Definition of Ready</b> </h3>
|
|
|
|
<h4><a name="Wer%3F%C2%A0"></a><b>Wer?</b> </h4>
|
|
|
|
<p>Anwender des 3D-Viewings</p>
|
|
|
|
<h4><a name="Was%3F%C2%A0"></a><b>Was?</b> </h4>
|
|
|
|
<ul>
|
|
<li>Automatische Aufspaltung eines Allround-Schutzzaun-Objekts in separate Steher- und Zaunknoten.</li>
|
|
<li>Dynamischer In-Place-Austausch der Steher-Bauform (A–G) basierend auf belegten PMI-Winkeln.</li>
|
|
<li>Automatische Höhensteuerung des Stehers basierend auf dem Maximum der angeschlossenen Zäune samt Fußfreiheit.</li>
|
|
<li>Implementierung einer fachlichen Ausnahme für die Lösch-Kaskadierung bei Schutzzäunen.</li>
|
|
<li>Manuelle Override-Möglichkeit für Bauform (dynamisch eingeschränkt) und Höhe (nur Vergrößerung) im Detailmenü.</li>
|
|
</ul>
|
|
|
|
|
|
<p><b>Warum?</b> </p>
|
|
|
|
<p>Steher müssen im 3D-Viewer als eigenständige Komponenten agieren, sich aber topologisch korrekt "selbst heilen" (Ecken/Kreuzungen bilden), um dem Nutzer manuelle Arbeit zu ersparen und fehlerfreie Stücklisten zu garantieren.</p>
|
|
|
|
<h4><a name="Wozu%3F%C2%A0"></a><b>Wozu?</b> </h4>
|
|
|
|
<p>Gewährleistung einer konsistenten Schutzzaun-Topologie im Szenegraphen.</p></description>
|
|
<environment></environment>
|
|
<key id="139414">GEKO-76</key>
|
|
<summary>Allround-Schutzzaun: Intelligente Steher-Logik</summary>
|
|
<type id="12871" iconUrl="https://adesso-group-extern.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium">Task</type>
|
|
<parent id="119259">GEKO-6</parent>
|
|
<priority id="10000" iconUrl="https://adesso-group-extern.atlassian.net/images/icons/priorities/critical.svg">Critical</priority>
|
|
<status id="14794" iconUrl="https://adesso-group-extern.atlassian.net/" description="">To Do</status>
|
|
<statusCategory id="2" key="new" colorName="blue-gray"/>
|
|
<resolution id="-1">Unresolved</resolution>
|
|
<assignee accountid="712020:1a31ac71-0e6f-49af-83f9-0d630a810204">Marcus Hinz</assignee>
|
|
<reporter accountid="712020:0a2bb4c7-7da6-48f0-8264-d021465e5f0f">Lukas Hörger</reporter>
|
|
<labels>
|
|
</labels>
|
|
<created>Wed, 8 Apr 2026 16:57:23 +0200</created>
|
|
<updated>Wed, 1 Jul 2026 14:27:06 +0200</updated>
|
|
<due></due>
|
|
<votes>0</votes>
|
|
<watches>0</watches>
|
|
<attachments>
|
|
</attachments>
|
|
<subtasks>
|
|
</subtasks>
|
|
<customfields>
|
|
<customfield id="customfield_13434" key="com.atlassian.jira.plugin.system.customfieldtypes:textfield">
|
|
<customfieldname>Ansprechpartner</customfieldname>
|
|
<customfieldvalues>
|
|
<customfieldvalue>Lukas</customfieldvalue>
|
|
|
|
</customfieldvalues>
|
|
</customfield>
|
|
<customfield id="customfield_10000" key="com.atlassian.jira.plugins.jira-development-integration-plugin:devsummarycf">
|
|
<customfieldname>Development</customfieldname>
|
|
<customfieldvalues>
|
|
|
|
</customfieldvalues>
|
|
</customfield>
|
|
<customfield id="customfield_10019" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
|
|
<customfieldname>Rank</customfieldname>
|
|
<customfieldvalues>
|
|
<customfieldvalue>0|i5ji9e:</customfieldvalue>
|
|
|
|
</customfieldvalues>
|
|
</customfield>
|
|
<customfield id="customfield_13432" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
|
|
<customfieldname>T-Shirt Size - Storypoint</customfieldname>
|
|
<customfieldvalues>
|
|
<customfieldvalue key="20364"><![CDATA[M]]></customfieldvalue>
|
|
|
|
</customfieldvalues>
|
|
</customfield>
|
|
<customfield id="customfield_13430" key="com.atlassian.jira.plugin.system.customfieldtypes:textarea">
|
|
<customfieldname>�� Definition of Ready - Formale Kriterien</customfieldname>
|
|
<customfieldvalues>
|
|
<customfieldvalue><h3><a name="%F0%9F%93%98Funktionsbeschreibung%3A"></a><b>�� Funktionsbeschreibung:</b></h3>
|
|
|
|
<ul>
|
|
<li><b>Input:</b> Platzierungs-, Änderungs- oder Lösch-Events von Allround-Schutzzaunkomponenten im Viewport, sowie manuelle Eingaben im Detailmenü.</li>
|
|
<li><b>Verhalten / Ablauf:</b>
|
|
<ol>
|
|
<li><b>Aufspaltung bei Erst-Einbau (Typ 1):</b> Wird ein Allround-Element frei platziert, splittet die Engine dieses in drei 3D-Komponenten: <tt>Vorderer Steher</tt> -&gt; <tt>Zaunelement</tt> -&gt; <tt>Hinterer Steher</tt>. Der vordere Steher ist die Wurzel (Weltkoordinaten/Typ 1). Zaun und hinterer Steher hängen kaskadierend via PMI (Typ 2) daran.</li>
|
|
<li><b>Anbau von Folge-Elementen (Typ 2):</b> Snappt ein neues Element an das Ende eines bestehenden Zauns, wird der hintere Steher des Vorgängers zum gemeinsamen <em>Verbindungssteher</em>. Das neue Zaunelement hängt an dessen PMI.</li>
|
|
<li><b>Selbstheilende Bauform-Aktualisierung:</b> Nach dem Mouse-Up-Event prüft ein lokales Callback die belegten PMI-Seiten des Stehers. Anhand einer exakten Matrix <em>(siehe separater Algorithmus-Abschnitt unten)</em> wird das 3D-Modell in-place gegen die passende Bauform (A-G) ausgetauscht.</li>
|
|
<li><b>Höhen-Synchronisation &amp; Metadaten:</b> Die Standardhöhe ist 2200 mm. Die Steherhöhe folgt automatisch dem Maximum aller verbundenen Zäune: <tt>max(Zaunhöhe 1 + Fußfreiheit 1, Zaunhöhe 2 + Fußfreiheit 2, ...)</tt>. Jeder Steher führt pro Zaun den unteren Startpunkt (Fußfreiheit) und das obere Ende als Metadatum mit. Weicht die Höhe von 2200 mm ab, generiert GEKO einen <em>Sondersteher</em>.</li>
|
|
<li><b>Manuelles Override (Detailmenü):</b>
|
|
<ol>
|
|
<li><em>Höhe:</em> Der Nutzer kann die Höhe manuell vergrößern. Ein Verkleinern unter das berechnete Minimum wird blockiert.</li>
|
|
<li><em>Bauform:</em> Der Nutzer kann die automatisch berechnete Bauform im Detailmenü manuell überschreiben. <b>Wichtig für die UI-Logik:</b> Das Auswahl-Dropdown darf dem Nutzer dynamisch nur die Bauformen (A-G) anbieten, die für die aktuelle "Eigene Anbau-Seite" (STARTPUNKT, L oder R) laut der Ermittlungs-Matrix überhaupt zulässig sind. Ist ein Steher beispielsweise auf Anbau-Seite <tt>L</tt> eingebaut, müssen die Optionen <tt>C</tt> und <tt>E</tt> im Menü ausgeblendet oder deaktiviert werden.</li>
|
|
</ol>
|
|
</li>
|
|
<li><b>Kaskadierendes Löschverhalten (Sonderregel):</b>
|
|
<ul>
|
|
<li><em>Steher löschen:</em> Alle direkt verbundenen Zäune werden mitgelöscht.</li>
|
|
<li><em>Zaun löschen:</em> Angrenzende Steher ohne weitere Zäune werden mitgelöscht. Angrenzende Steher mit weiteren Zäunen bleiben stehen und aktualisieren ihre Bauform.</li>
|
|
</ul>
|
|
</li>
|
|
</ol>
|
|
</li>
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
<h4><a name="Algorithmus%3ASteherBauformermitteln%28%7B%7Blayouttauschensteher%7D%7D%29"></a>Algorithmus: Steher-Bauform ermitteln (<tt>layout_tauschen_steher</tt>)</h4>
|
|
|
|
<p>Die Engine ermittelt für jeden Steher die Seite des Ankers (ist er selbst am Startpunkt/Typ 1 Platzierung, an der linken (L) oder rechten (R) Seite eines Elements angebaut?) und liest die Winkel der aktuell an ihm belegten PMIs (0°, 90°, 180°). Daraus ergibt sich folgende Matrix zur Bestimmung der Bauform-Artikelnummer (A-G):</p>
|
|
|
|
<div class='table-wrap'>
|
|
<table class='confluenceTable'><tbody>
|
|
<tr>
|
|
<td class='confluenceTd'><b>Eigene Anbau-Seite</b></td>
|
|
<td class='confluenceTd'><b>Belegte PMIs am Steher</b></td>
|
|
<td class='confluenceTd'><b>Resultierende Bauform</b></td>
|
|
</tr>
|
|
<tr>
|
|
<td class='confluenceTd'><b>STARTPUNKT</b></td>
|
|
<td class='confluenceTd'><tt>0</tt> und <tt>180</tt></td>
|
|
<td class='confluenceTd'><b>A</b> (ana)</td>
|
|
</tr>
|
|
<tr>
|
|
<td class='confluenceTd'><b>STARTPUNKT</b></td>
|
|
<td class='confluenceTd'><tt>180</tt></td>
|
|
<td class='confluenceTd'><b>B</b> (bna)</td>
|
|
</tr>
|
|
<tr>
|
|
<td class='confluenceTd'><b>STARTPUNKT</b></td>
|
|
<td class='confluenceTd'><tt>0</tt></td>
|
|
<td class='confluenceTd'><b>C</b> (cna)</td>
|
|
</tr>
|
|
<tr>
|
|
<td class='confluenceTd'><b>STARTPUNKT</b></td>
|
|
<td class='confluenceTd'><tt>90</tt> und <tt>180</tt></td>
|
|
<td class='confluenceTd'><b>D</b> (dna)</td>
|
|
</tr>
|
|
<tr>
|
|
<td class='confluenceTd'><b>STARTPUNKT</b></td>
|
|
<td class='confluenceTd'><tt>0</tt> und <tt>90</tt></td>
|
|
<td class='confluenceTd'><b>E</b> (ena)</td>
|
|
</tr>
|
|
<tr>
|
|
<td class='confluenceTd'><b>STARTPUNKT</b></td>
|
|
<td class='confluenceTd'><tt>0</tt>, <tt>90</tt> und <tt>180</tt></td>
|
|
<td class='confluenceTd'><b>F</b> (fna)</td>
|
|
</tr>
|
|
<tr>
|
|
<td class='confluenceTd'><b>STARTPUNKT</b></td>
|
|
<td class='confluenceTd'><em>Sonstige</em></td>
|
|
<td class='confluenceTd'><b>G</b> (gna)</td>
|
|
</tr>
|
|
<tr>
|
|
<td class='confluenceTd'><b>L</b> (Links)</td>
|
|
<td class='confluenceTd'><em>(keine)</em></td>
|
|
<td class='confluenceTd'><b>B</b> (bna)</td>
|
|
</tr>
|
|
<tr>
|
|
<td class='confluenceTd'><b>L</b> (Links)</td>
|
|
<td class='confluenceTd'><tt>0</tt></td>
|
|
<td class='confluenceTd'><b>A</b> (ana)</td>
|
|
</tr>
|
|
<tr>
|
|
<td class='confluenceTd'><b>L</b> (Links)</td>
|
|
<td class='confluenceTd'><tt>90</tt></td>
|
|
<td class='confluenceTd'><b>D</b> (dna)</td>
|
|
</tr>
|
|
<tr>
|
|
<td class='confluenceTd'><b>L</b> (Links)</td>
|
|
<td class='confluenceTd'><tt>0</tt> und <tt>90</tt></td>
|
|
<td class='confluenceTd'><b>F</b> (fna)</td>
|
|
</tr>
|
|
<tr>
|
|
<td class='confluenceTd'><b>L</b> (Links)</td>
|
|
<td class='confluenceTd'><em>Sonstige</em></td>
|
|
<td class='confluenceTd'><b>G</b> (gna)</td>
|
|
</tr>
|
|
<tr>
|
|
<td class='confluenceTd'><b>R</b> (Rechts)</td>
|
|
<td class='confluenceTd'><em>(keine)</em></td>
|
|
<td class='confluenceTd'><b>C</b> (cna)</td>
|
|
</tr>
|
|
<tr>
|
|
<td class='confluenceTd'><b>R</b> (Rechts)</td>
|
|
<td class='confluenceTd'><tt>180</tt></td>
|
|
<td class='confluenceTd'><b>A</b> (ana)</td>
|
|
</tr>
|
|
<tr>
|
|
<td class='confluenceTd'><b>R</b> (Rechts)</td>
|
|
<td class='confluenceTd'><tt>90</tt> und <tt>180</tt></td>
|
|
<td class='confluenceTd'><b>F</b> (fna)</td>
|
|
</tr>
|
|
<tr>
|
|
<td class='confluenceTd'><b>R</b> (Rechts)</td>
|
|
<td class='confluenceTd'><em>Sonstige</em></td>
|
|
<td class='confluenceTd'><b>G</b> (gna)</td>
|
|
</tr>
|
|
</tbody></table>
|
|
</div>
|
|
|
|
|
|
<h4><a name="NichtZiele%28OutofScope%29"></a>Nicht-Ziele (Out of Scope)</h4>
|
|
|
|
<ul>
|
|
<li><b>Echtzeit-Austausch während des Ziehens:</b> Die Bauform- und Höhenberechnung triggert niemals während der Mausbewegung, sondern exakt nach dem Mouse-Up-Event oder nach Bestätigung im Detailmenü.</li>
|
|
</ul>
|
|
|
|
|
|
<hr />
|
|
|
|
<h3><a name="%F0%9F%93%91Akzeptanzkriterien%3A"></a><b>�� Akzeptanzkriterien:</b></h3>
|
|
|
|
<ul>
|
|
<li>Jedes Allround-Zaunelement wird beim Platzieren in separat selektierbare Steher- und Zaunkomponenten aufgeteilt.</li>
|
|
<li>Beim sequentiellen Anbau teilen sich zwei Zaunelemente exakt einen gemeinsamen Verbindungssteher.</li>
|
|
<li>Die Steher-Bauform heilt sich nach dem Mouse-Up gemäß der Matrix (A-G) selbst.</li>
|
|
<li>Im Detailmenü kann der Nutzer die Bauform manuell überschreiben. <b>Das UI schränkt die Auswahlmöglichkeiten hierbei strikt und dynamisch auf die für diese Anbau-Seite gültigen Zeilen der Matrix ein.</b></li>
|
|
<li>Die Steherhöhe entspricht mindestens dem Maximum aus <tt>Zaunhöhe + Fußfreiheit</tt>.</li>
|
|
<li>Manuelle Höhen-Eingaben unter das Minimum werden im UI blockiert.</li>
|
|
<li>Sonderregel Löschen (Steher): Löschen eines Stehers löscht angebundene Zäune.</li>
|
|
<li>Sonderregel Löschen (Zaun): Löschen eines Zauns löscht alleinstehende Steher; verbundene Steher bleiben stehen und passen Bauform an.</li>
|
|
<li>Sonderregel Löschen (Kaskade): Löschen eines Stehers führt zur Löschung der angebundenen Zäune. Löschung eines angebundenen Zauns führt, falls vorhanden, zur Löschung alleinstehender Steher</li>
|
|
</ul>
|
|
|
|
|
|
<hr />
|
|
|
|
<h3><a name="%F0%9F%A7%AATestCases%3A"></a><b>�� Test Cases:</b></h3>
|
|
|
|
<ul>
|
|
<li><b><span class="error">&#91;Lösch-Kettenabbruch&#93;</span></b>: Strang <tt>Steher A -&gt; Zaun 1 -&gt; Steher B -&gt; Zaun 2 -&gt; Steher C</tt> aufbauen -&gt; <tt>Steher A</tt> löschen -&gt; <em>Ergebnis:</em> <tt>Zaun 1</tt> wird gelöscht. <tt>Steher B</tt> bleibt stehen (da <tt>Zaun 2</tt> angebunden) und wechselt Bauform. <tt>Zaun 2</tt> und <tt>Steher C</tt> bleiben unberührt.</li>
|
|
<li><b><span class="error">&#91;Bauform-Selbstheilung bei Eck-Anbau&#93;</span></b>: Geraden Zaun platzieren (Verbindungssteher ist Bauform A) -&gt; Neues Zaunelement im 90°-Winkel anbauen -&gt; <em>Ergebnis:</em> Nach Mouse-Up wechselt der Verbindungssteher sofort in die passende Eck-Bauform laut Matrix.</li>
|
|
<li><b><span class="error">&#91;Manuelle Override-Tests &amp; UI-Restriktion&#93;</span></b>: Folge-Zaunelement anbauen (Verbindungssteher befindet sich auf Anbau-Seite <tt>L</tt>). Verbindungssteher selektieren und Detailmenü öffnen -&gt; <em>Ergebnis:</em> Das Dropdown für die Bauform bietet nur A, B, D, F und G an. Die Optionen C und E sind nicht wählbar oder ausgeblendet. Der Wechsel auf eine zulässige Bauform (z. B. F) aktualisiert das 3D-Modell sofort.</li>
|
|
</ul>
|
|
|
|
|
|
<hr />
|
|
|
|
<h3><a name="%E2%9A%A0%EF%B8%8FEdgeCases%3A%C2%A0"></a><b>⚠️ Edge Cases:</b> </h3>
|
|
|
|
<ul>
|
|
<li><b><span class="error">&#91;Misch-Höhen an einem Steher&#93;</span></b>: Zäune mit Höhen 2500 mm und 2200 mm treffen sich -&gt; <em>Verhalten:</em> Steher übernimmt die maximale Höhe und wird zum Sondersteher.</li>
|
|
</ul>
|
|
</customfieldvalue>
|
|
|
|
</customfieldvalues>
|
|
</customfield>
|
|
<customfield id="customfield_13429" key="com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes">
|
|
<customfieldname>�� DoR - Checkliste</customfieldname>
|
|
<customfieldvalues>
|
|
<customfieldvalue key="20347"><![CDATA[Ziel eindeutig formuliert (W-Fragen vollständig?)]]></customfieldvalue>
|
|
<customfieldvalue key="20348"><![CDATA[Ansprechpartner benannt]]></customfieldvalue>
|
|
<customfieldvalue key="20349"><![CDATA[Akzeptanzkriterien definiert]]></customfieldvalue>
|
|
<customfieldvalue key="20350"><![CDATA[mind. ein Testfall dokumentiert]]></customfieldvalue>
|
|
<customfieldvalue key="20351"><![CDATA[Priorität gesetzt]]></customfieldvalue>
|
|
<customfieldvalue key="20352"><![CDATA[Edge Cases beschrieben]]></customfieldvalue>
|
|
|
|
</customfieldvalues>
|
|
</customfield>
|
|
</customfields>
|
|
</item>
|
|
</channel>
|
|
</rss> |