Compare commits
19 Commits
5124b7fab6
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 6ee33eb085 | |||
| cded317a40 | |||
| c6e0b95d81 | |||
| d19913a53d | |||
| d4844ded67 | |||
| b29b3b22d4 | |||
| 4a059f32c5 | |||
| db69f3498d | |||
| f880ae1c97 | |||
| dd84293c36 | |||
| b4f957a028 | |||
| c42aae7c49 | |||
| 740c420900 | |||
| 6710d4f06a | |||
| 644f61ef6b | |||
| 4f87895303 | |||
| 98b1dc4f36 | |||
| 9de80d2f2a | |||
| 00dffc59eb |
@@ -6,3 +6,4 @@ work/ausgabe.txt
|
|||||||
out/
|
out/
|
||||||
.vscode/
|
.vscode/
|
||||||
*.swp
|
*.swp
|
||||||
|
/log/
|
||||||
|
|||||||
@@ -62,28 +62,78 @@ receives the output files — e.g. `work/test1/`, `work/test2/`, or any new fold
|
|||||||
the same layout:
|
the same layout:
|
||||||
- `tische.ini` — table definitions: id, `Nummer`, `Hof` (venue/court), `Plaetze` (seats),
|
- `tische.ini` — table definitions: id, `Nummer`, `Hof` (venue/court), `Plaetze` (seats),
|
||||||
`Nachbarliste` (neighbor table ids), `Koordinaten`.
|
`Nachbarliste` (neighbor table ids), `Koordinaten`.
|
||||||
- `bestellung.xml` — the guest order: `<Gruppe>` blocks containing `<Person>` (with
|
- `bestellung.json` — the guest order: `{ "gruppen": [ ... ] }`, each group holding a
|
||||||
`Vorname`/`Nachname`/optional `Titel`) and an `<Anzahl>` (reservation count per person
|
`"personen"` list (each with `vorname`/`nachname`/optional `titel`), an optional
|
||||||
template — this expands into that many identical bookings), plus optional `<Tisch>` to
|
`"anzahl"` (reservation count — expands every person in the group into that many identical
|
||||||
pin a VIP group to a specific table.
|
bookings), an optional `"name"` (display label), and an optional `"tisch"` to pin a VIP
|
||||||
|
group to a specific table. Replaces the old `bestellung.xml`/`XMLConfig`.
|
||||||
- Output (written back into the same `--indir` directory): `TischePersonen.txt` (table →
|
- Output (written back into the same `--indir` directory): `TischePersonen.txt` (table →
|
||||||
seated people) and `PersonenTische.csv` (person → table, sorted).
|
seated people) and `PersonenTische.csv` (person → table, sorted).
|
||||||
|
|
||||||
`cfg/platz.cfg` (still located via `$PLATZ_CFG`, independent of `--indir`) only selects the
|
The GA cycle and penalty scheme are read directly from `$PLATZ_CFG/zyklus.cfg` and
|
||||||
GA cycle/penalty config:
|
`$PLATZ_CFG/strafen.cfg` (independent of `--indir`). There is no `platz.cfg` indirection any
|
||||||
- `cfg/zyklus.cfg` — defines the GA run schedule ("Zyklus"): a sequence of actions
|
more — it was removed; `zyklus.cfg`/`strafen.cfg` are loaded straight from `$PLATZ_CFG`, the
|
||||||
(`e`=erzeugen/create, `s`=selektieren/select-best, `S`=random-select, `m`=mutieren/mutate,
|
GA profile is chosen by the `--zyklus-art <name>` switch (default `Adaptiv`), the penalty
|
||||||
`j`=behalten/keep parents, `z`=neue Generation/advance generation) each with a count.
|
profile by the `--strafen <name>` switch (default `default`), and the SVG colour profile by
|
||||||
- `cfg/strafen.cfg` — the penalty ("Strafpunkte") table: cost of splitting a group across
|
the `--farben <name>` switch (default `grosse_gruppen`).
|
||||||
tables (by group size and number of splits), cost of a lone person, and per-table
|
|
||||||
under-utilization penalties.
|
|
||||||
|
|
||||||
`tische.ini`/`bestellung.xml`/`TischePersonen.txt`/`PersonenTische.csv` are fixed filenames
|
- `cfg/zyklus.cfg` — defines the GA profiles. Two flavours: **static** profiles (`Easy`,
|
||||||
resolved as `os.path.join(indir, ...)` in `platz.py` — they are no longer configured in
|
`Simple`) give an explicit sequence of actions (`e`=erzeugen/create, `s`=selektieren/
|
||||||
`platz.cfg`.
|
select-best, `S`=random-select, `m`=mutieren/mutate, `j`=behalten/keep parents, `z`=neue
|
||||||
|
Generation/advance generation) each with a count (`Abfolge`/`Anzahl`). The **adaptive**
|
||||||
|
profile (`Adaptiv`, the default) is recognised by a `Start` field and has no fixed action
|
||||||
|
list: `Zyklus.Modus` becomes `'adaptiv'` and `Farm._LaufAdaptiv()` runs a generation loop
|
||||||
|
with a shrinking population (`Start`, `Schrumpfung`, `MinPopulation`) and a convergence
|
||||||
|
stop (`Geduld` generations without an improvement of at least `Schwelle`, capped by
|
||||||
|
`MaxGenerationen`). Static profiles run via `Farm._LaufStatisch()`.
|
||||||
|
- `cfg/strafen.cfg` — the penalty ("Strafpunkte") profiles. Each section is one complete
|
||||||
|
profile ("Vorgehen") in a single namespace, chosen by `--strafen <section>` (default
|
||||||
|
`default`); this lets several scoring strategies live in one file (the shipped file also
|
||||||
|
has a `locker` example with cheaper splits). Keys per profile: `Anzahl_Trennungen_N`
|
||||||
|
(`{groupsize:points}` for a group split across `N+1` tables, i.e. `N` splits — recursing to
|
||||||
|
smaller sizes when no exact entry), `NichtNachbar` (no group-mate at a neighbouring table),
|
||||||
|
`Allein` (a lone person), optional `TischWertigkeiten` (`{freeseats:points}` under-utilization,
|
||||||
|
with a nearest-lower-key fallback; absent = free seats not penalised, as in the `locker`
|
||||||
|
profile), and optional `AbstandFaktor` (per spatial-distance unit
|
||||||
|
between split-off parts; absent = distance not penalised). `Strafliste.laden(FileName,
|
||||||
|
Sektion='default')` parses one section; the old `[Trennung]`/`[Globals]`/`[Abstand]`
|
||||||
|
three-section layout is gone.
|
||||||
|
- `cfg/farben.cfg` — SVG colour profiles, chosen by `--farben <section>` (default
|
||||||
|
`grosse_gruppen`) / env `PLATZ_FARBENART`, parsed by `Farben.Farbschema.laden()` (in
|
||||||
|
`libs/Farben.py`) and passed into `Sitzplatzverteilung.alsSVG(..., Farbschema=...)`. Two
|
||||||
|
modes: `Modus = palette` (a `Palette` colour list cycled per group by sorted group id — the
|
||||||
|
`grosse_gruppen` profile) and `Modus = kategorien` (the `hochzeit` profile — splits groups
|
||||||
|
into **Familie** = members mostly share a surname, coloured along `FamilienVerlaeufe`
|
||||||
|
gradients blue→green / yellow→orange, one gradient bucket per surname; **Verein** = any
|
||||||
|
other named group, along `VereinVerlauf` violet→grey; **VIP** = fixed-table people with no
|
||||||
|
GA group, the start of `VIPVerlauf`, red). Gradient syntax `"start -> end"`. Anonymous bulk
|
||||||
|
bookings (all members identical, e.g. an `anzahl`-expanded "Gast Musikverein") are *not*
|
||||||
|
treated as a family. Absent/invalid config falls back to the built-in palette
|
||||||
|
(`Farbschema=None`), so the SVG always renders.
|
||||||
|
|
||||||
|
`tische.ini`/`bestellung.json`/`TischePersonen.txt`/`PersonenTische.csv` are fixed filenames
|
||||||
|
resolved as `os.path.join(indir, ...)` in `platz.py`.
|
||||||
|
|
||||||
Pass `--tosvg` to additionally write `<indir>/Sitzplatzverteilung.svg` via
|
Pass `--tosvg` to additionally write `<indir>/Sitzplatzverteilung.svg` via
|
||||||
`Sitzplatzverteilung.alsSVG()` (see below).
|
`Sitzplatzverteilung.alsSVG()` (see below). `--show-development` writes
|
||||||
|
`<indir>/Entwicklung.svg` (value curves + pool-size panel), and `--show-lineage` writes
|
||||||
|
`<indir>/Abstammung.svg` — the full mutation tree of every solution, with the final best
|
||||||
|
solution's ancestral branch highlighted and labelled with its id. Every solution gets a plain
|
||||||
|
running number (`Farm._NeueId`, `1..N`); the ancestry is not encoded in the id but recorded
|
||||||
|
via each node's stored predecessor (parent id) and followed back along the highlighted branch.
|
||||||
|
|
||||||
|
Pass `--seed <int>` to make a run fully reproducible: `platz.py` calls `random.seed()` with
|
||||||
|
it before any GA action, so the same seed always yields the same seating (for support
|
||||||
|
questions like "why is Aunt Erna seated there?" — rerun with the same seed to get the exact
|
||||||
|
same plan). Reproducibility needs more than seeding the RNG: `Person` defines an Id-based
|
||||||
|
`__hash__`/`__eq__` (each booking has a unique running integer Id) so that the `set()` of
|
||||||
|
people in a `Gruppe` iterates/`pop()`s in a process-stable order — otherwise the order would
|
||||||
|
hinge on object memory addresses (and, for string-keyed containers, `PYTHONHASHSEED`), leaving
|
||||||
|
the run non-reproducible even with `--seed`. Integer Ids aren't affected by `PYTHONHASHSEED`,
|
||||||
|
so no environment tweaking is required.
|
||||||
|
|
||||||
|
`Farm.TopN(n)` returns the `n` best solutions (descending), clamped to `[0, len(Pool)]` — the
|
||||||
|
list generalisation of `Farm.Bester()` (single best), for surfacing several good alternatives.
|
||||||
|
|
||||||
Run the test suite with `bin/run_tests.bat` / `bin/run_tests.sh` (or directly: `python -m
|
Run the test suite with `bin/run_tests.bat` / `bin/run_tests.sh` (or directly: `python -m
|
||||||
unittest discover -s tests -p "test_*.py" -v`). A stray global `PYTHONPATH` entry on this
|
unittest discover -s tests -p "test_*.py" -v`). A stray global `PYTHONPATH` entry on this
|
||||||
@@ -105,7 +155,14 @@ Domain-agnostic and reusable in principle:
|
|||||||
- `Farm` — owns the population (`Pool`/`PoolNeu`), and executes a `Zyklus` action-by-action
|
- `Farm` — owns the population (`Pool`/`PoolNeu`), and executes a `Zyklus` action-by-action
|
||||||
against instances of a given solution class (passed as `Klasse` plus its constructor
|
against instances of a given solution class (passed as `Klasse` plus its constructor
|
||||||
args/kwargs). `Bester()` returns the fittest (`max()`) solution found; solutions are ordered
|
args/kwargs). `Bester()` returns the fittest (`max()`) solution found; solutions are ordered
|
||||||
via `__eq__`/`__lt__` (`@total_ordering`) on `self.value`.
|
via `__eq__`/`__lt__` (`@total_ordering`) on `self.value`. The Farm also tags every solution
|
||||||
|
with a hierarchical lineage id (`_absid`; `_WurzelId`/`_KindId`) and records the mutation
|
||||||
|
tree into `self.Abstammung`.
|
||||||
|
- `Entwicklung` ("Development") — observer that records one measurement per cycle action
|
||||||
|
(best/avg/worst value + pool size); `alsSVG()` draws the value curves plus a pool-size panel.
|
||||||
|
- `Abstammung` ("Lineage") — observer that records the mutation tree (each solution's id,
|
||||||
|
parent id, generation, value); `alsSVG(HervorId=...)` draws the tree and highlights/labels
|
||||||
|
the ancestral branch of the given (usually the best) solution.
|
||||||
|
|
||||||
### `Strukturdaten.py` — domain model for this specific seating problem
|
### `Strukturdaten.py` — domain model for this specific seating problem
|
||||||
- `Person`, `Gruppe` (group — a `Set` of people, splittable via `teilen()`), `Tisch` (table —
|
- `Person`, `Gruppe` (group — a `Set` of people, splittable via `teilen()`), `Tisch` (table —
|
||||||
@@ -118,30 +175,38 @@ Domain-agnostic and reusable in principle:
|
|||||||
a group (`gibPunkte('Trennung', ...)`, recursing to smaller group sizes if no exact rule is
|
a group (`gibPunkte('Trennung', ...)`, recursing to smaller group sizes if no exact rule is
|
||||||
configured), a person sitting with no group-mate at their table (`'allein'`), a person having
|
configured), a person sitting with no group-mate at their table (`'allein'`), a person having
|
||||||
no group-mate at a *neighboring* table (`'nichtNachbar'`), and poor seat utilization at a
|
no group-mate at a *neighboring* table (`'nichtNachbar'`), and poor seat utilization at a
|
||||||
table (`'Tischbesetzung'`).
|
table (`'Tischbesetzung'` — the penalty rises with the number of free seats, with a nearest-
|
||||||
|
lower-key fallback, so partly-filled tables are penalised most and groups get pulled onto a
|
||||||
|
single table instead of being split next to empty ones).
|
||||||
- `Sitzplatzverteilung` ("Seating arrangement") — the actual `Loesung` subclass bred by the GA.
|
- `Sitzplatzverteilung` ("Seating arrangement") — the actual `Loesung` subclass bred by the GA.
|
||||||
Constructor seats VIPs first at pinned tables, then randomly seats groups either
|
Constructor seats VIPs first at pinned tables, then randomly seats groups either
|
||||||
largest-first or smallest-first (coin flip), splitting a group across two neighboring tables
|
largest-first or smallest-first (coin flip), splitting a group across two neighboring tables
|
||||||
when no single table has enough free seats, recursively splitting further if needed, then
|
when no single table has enough free seats, recursively splitting further if needed, then
|
||||||
calls `bewerten()` to score the arrangement per `Strafliste`. `mutieren()` picks the
|
calls `bewerten()` to score the arrangement per `Strafliste`. `mutieren()` picks the
|
||||||
worst-scoring groups (`SchlechteGruppenTopX`), evicts them, and reseats them, hoping for a
|
worst-scoring groups (`SchlechteGruppenTopX`), evicts them, and reseats them largest-first
|
||||||
better score. `speichern()` writes the two output files. `alsSVG()` renders the layout to
|
(`GruppenSetzen(..., GrosseZuerst=True)`) so big groups grab the now-freed whole tables and
|
||||||
|
come back together instead of being re-split; the initial constructor placement still uses
|
||||||
|
the random largest/smallest coin flip (`GrosseZuerst=False`). `speichern()` writes the two output files. `alsSVG()` renders the layout to
|
||||||
SVG: tables as white circles sized to fit all their seats' person-circles without
|
SVG: tables as white circles sized to fit all their seats' person-circles without
|
||||||
touching, people as colored circles (color = group, via `SVGGruppenFarben`) placed evenly
|
touching, people as colored circles (color = group, via `SVGGruppenFarben`) placed evenly
|
||||||
around the inside of their table's circle. The table-to-table grid spacing is derived
|
around the inside of their table's circle. The table-to-table grid spacing is derived
|
||||||
from the largest table radius so tables never overlap regardless of their `Koordinaten`.
|
from the largest table radius so tables never overlap regardless of their `Koordinaten`.
|
||||||
- `XMLConfig` — parses `bestellung.xml` into `Personen`/`Gruppen`/VIP-group/VIP-seat-map,
|
- `JSONConfig` — parses `bestellung.json` into
|
||||||
expanding each `<Person>` template by its sibling `<Anzahl>` into that many individual
|
`Personen`/`Gruppen`/VIP-group/VIP-seat-map/group-names, expanding each person by the
|
||||||
bookings, and treating any `<Gruppe>` containing a `<Tisch>` tag as a VIP group pinned to
|
group's `"anzahl"` into that many individual bookings, and treating any group with a
|
||||||
that table rather than going through normal GA placement.
|
`"tisch"` key as a VIP group pinned to that table rather than going through normal GA
|
||||||
|
placement. Returns a 5th element (`GruppenNamen`, `{Gid: display name}`) that the older
|
||||||
|
`XMLConfig` did not; `CSVConfig` (the web CSV adapter) returns the same 5-tuple.
|
||||||
|
|
||||||
### Data flow through `platz.py` (`__main__`)
|
### Data flow through `platz.py` (`__main__`)
|
||||||
1. Parse `--indir` (required) from the command line via `optparse`.
|
|
||||||
2. Read `platz.cfg` to locate `zyklus.cfg`/`strafen.cfg` (env-var expansion via
|
1. Parse `--indir` (required) and `--zyklus-art` (default `Adaptiv`) from the command line
|
||||||
`os.path.expandvars`).
|
via `optparse`.
|
||||||
3. Load `Zyklus` (GA schedule), `Strafliste` (penalties), `Tische` (table layout, from
|
2. Resolve `zyklus.cfg`/`strafen.cfg` directly as `os.path.join($PLATZ_CFG, ...)`.
|
||||||
`<indir>/tische.ini`).
|
3. Load `Zyklus` (GA profile named by `--zyklus-art`), `Strafliste` (penalties), `Tische`
|
||||||
4. Load `<indir>/bestellung.xml` via `XMLConfig` → people, groups, VIP group, VIP seat map.
|
(table layout, from `<indir>/tische.ini`).
|
||||||
|
4. Load `<indir>/bestellung.json` via `JSONConfig` → people, groups, VIP group, VIP seat
|
||||||
|
map, group names.
|
||||||
5. Build a `Farm(Zyklus, Sitzplatzverteilung, Tische=..., Gruppen=..., Strafen=...,
|
5. Build a `Farm(Zyklus, Sitzplatzverteilung, Tische=..., Gruppen=..., Strafen=...,
|
||||||
VIPListe=..., VIPs=...)`, which runs the whole GA cycle in its constructor.
|
VIPListe=..., VIPs=...)`, which runs the whole GA cycle in its constructor.
|
||||||
6. Take `Farm.Bester()` and call `.speichern(...)` to write `<indir>/TischePersonen.txt` and
|
6. Take `Farm.Bester()` and call `.speichern(...)` to write `<indir>/TischePersonen.txt` and
|
||||||
|
|||||||
@@ -23,9 +23,10 @@ platz/
|
|||||||
```
|
```
|
||||||
|
|
||||||
- `libs/platz.py` — entry point; wires together config, input data, and the GA run.
|
- `libs/platz.py` — entry point; wires together config, input data, and the GA run.
|
||||||
- `libs/ga.py` — generic genetic-algorithm scaffolding (`Loesung`, `Zyklus`, `Farm`).
|
- `libs/ga.py` — generic genetic-algorithm scaffolding (`Loesung`, `Zyklus`, `Farm`,
|
||||||
|
`Entwicklung`).
|
||||||
- `libs/Strukturdaten.py` — domain model for the seating problem (`Person`, `Gruppe`,
|
- `libs/Strukturdaten.py` — domain model for the seating problem (`Person`, `Gruppe`,
|
||||||
`Tisch`, `Strafliste`, `Sitzplatzverteilung`, `XMLConfig`).
|
`Tisch`, `Strafliste`, `Sitzplatzverteilung`, `JSONConfig`).
|
||||||
|
|
||||||
## Running the tests
|
## Running the tests
|
||||||
|
|
||||||
@@ -89,26 +90,31 @@ receiving the output files for one run — e.g. `work/test1/` or `work/test2/`:
|
|||||||
|
|
||||||
- `tische.ini` — one section per table: `Nummer`, `Hof` (venue/court), `Plaetze` (seat
|
- `tische.ini` — one section per table: `Nummer`, `Hof` (venue/court), `Plaetze` (seat
|
||||||
count), `Nachbarliste` (neighboring table ids), `Koordinaten`.
|
count), `Nachbarliste` (neighboring table ids), `Koordinaten`.
|
||||||
- `bestellung.xml` — `<Gruppe>` blocks, each with a `<Person>` template
|
- `bestellung.json` — `{ "gruppen": [ ... ] }`, each group with a `"personen"` list
|
||||||
(`Vorname`/`Nachname`/optional `Titel`) and an `<Anzahl>` (how many bookings to expand
|
(`vorname`/`nachname`/optional `titel`), an optional `"anzahl"` (how many bookings to
|
||||||
that template into). A `<Gruppe>` containing a `<Tisch>` tag is treated as a VIP group
|
expand each person into), an optional `"name"` (display label) and an optional `"tisch"`
|
||||||
pinned to that table instead of being placed by the GA.
|
(pins the group as a VIP group to that table instead of placing it via the GA).
|
||||||
|
|
||||||
To run against a different dataset, create a new folder with a `tische.ini` and
|
To run against a different dataset, create a new folder with a `tische.ini` and
|
||||||
`bestellung.xml` following the same layout and pass it via `--indir`.
|
`bestellung.json` following the same layout and pass it via `--indir`.
|
||||||
|
|
||||||
`cfg/platz.cfg` still selects the GA cycle/penalty config (independent of `--indir`):
|
The GA cycle and penalty scheme are read directly from `$PLATZ_CFG/zyklus.cfg` and
|
||||||
|
`$PLATZ_CFG/strafen.cfg` (independent of `--indir`); there is no longer a `platz.cfg`
|
||||||
|
indirection. The GA profile is selected with the `--zyklus-art <name>` switch (default:
|
||||||
|
`Adaptiv`).
|
||||||
|
|
||||||
```ini
|
`cfg/zyklus.cfg` defines the GA profiles. Two styles exist:
|
||||||
[Config]
|
|
||||||
Zyklusdatei=$PLATZ_CFG/zyklus.cfg
|
|
||||||
Zyklusart=Easy
|
|
||||||
Strafendatei=$PLATZ_CFG/strafen.cfg
|
|
||||||
```
|
|
||||||
|
|
||||||
`cfg/zyklus.cfg` defines the GA run schedule ("Zyklus") as an `Abfolge` (sequence of
|
- **static** profiles (`Easy`, `Simple`) give an explicit `Abfolge` (sequence of actions)
|
||||||
actions) and matching `Anzahl` (counts): `e` create, `s` select best, `S` select randomly,
|
and matching `Anzahl` (counts): `e` create, `s` select best, `S` select randomly, `m`
|
||||||
`m` mutate, `j` keep parents, `z` advance generation.
|
mutate, `j` keep parents, `z` advance generation.
|
||||||
|
- the **adaptive** profile (`Adaptiv`, the default) has no fixed action list. It is
|
||||||
|
recognised by a `Start` field and runs a generation loop: a large starting population
|
||||||
|
that shrinks each generation (`Schrumpfung`, down to `MinPopulation`) and stops once the
|
||||||
|
best score fails to improve by at least `Schwelle` for `Geduld` generations (or after
|
||||||
|
`MaxGenerationen`).
|
||||||
|
|
||||||
|
Select a different profile per run, e.g. `bin/platz.bat --indir work/test2 --zyklus-art Easy`.
|
||||||
|
|
||||||
`cfg/strafen.cfg` defines the penalty scheme: cost of splitting a group across tables (by
|
`cfg/strafen.cfg` defines the penalty scheme: cost of splitting a group across tables (by
|
||||||
group size and number of splits), cost of a person sitting alone or without a group-mate at
|
group size and number of splits), cost of a person sitting alone or without a group-mate at
|
||||||
@@ -125,6 +131,15 @@ Pass `--tosvg` to additionally write `Sitzplatzverteilung.svg` into the `--indir
|
|||||||
directory: tables are drawn as white circles, people as colored circles inside their
|
directory: tables are drawn as white circles, people as colored circles inside their
|
||||||
table's circle (color = group). See `doc/docu_tests.md` for example renderings.
|
table's circle (color = group). See `doc/docu_tests.md` for example renderings.
|
||||||
|
|
||||||
|
Two more optional graphs go into the `--indir` directory:
|
||||||
|
|
||||||
|
- `--show-development` → `Entwicklung.svg`: the course of the search (best/average/worst
|
||||||
|
value over time, plus a panel with the number of solutions in the pool per step).
|
||||||
|
- `--show-lineage` → `Abstammung.svg`: the mutation tree of every solution. The final best
|
||||||
|
solution's ancestral branch is highlighted and labelled with its id. Every solution gets a
|
||||||
|
plain running number (`1..N`); the ancestry is recorded via each node's stored predecessor
|
||||||
|
(parent id), not encoded in the id itself, and is followed back along the highlighted branch.
|
||||||
|
|
||||||
## Further details
|
## Further details
|
||||||
|
|
||||||
See `CLAUDE.md` for a deeper architectural walkthrough of the GA framework and domain
|
See `CLAUDE.md` for a deeper architectural walkthrough of the GA framework and domain
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
@echo off
|
||||||
|
REM ================================================================
|
||||||
|
REM Rechnet alle Beispiele in work\ neu durch.
|
||||||
|
REM Jedes Unterverzeichnis mit einer tische.ini wird als Eingabe-
|
||||||
|
REM verzeichnis an platz.py uebergeben (inkl. --tosvg fuer die SVGs).
|
||||||
|
REM Zusaetzliche Argumente werden an jeden Lauf durchgereicht.
|
||||||
|
REM ================================================================
|
||||||
|
|
||||||
|
call "%~dp0setenv.bat"
|
||||||
|
|
||||||
|
for /d %%D in ("%PLATZ_WORK%\*") do (
|
||||||
|
if exist "%%D\tische.ini" (
|
||||||
|
echo.
|
||||||
|
echo === %%~nxD ===
|
||||||
|
python "%PLATZ_LIBS%\platz.py" --indir "%%D" --tosvg %*
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# ================================================================
|
||||||
|
# Rechnet alle Beispiele in work/ neu durch.
|
||||||
|
# Jedes Unterverzeichnis mit einer tische.ini wird als Eingabe-
|
||||||
|
# verzeichnis an platz.py uebergeben (inkl. --tosvg fuer die SVGs).
|
||||||
|
# Zusaetzliche Argumente werden an jeden Lauf durchgereicht.
|
||||||
|
# ================================================================
|
||||||
|
|
||||||
|
source "$(dirname "${BASH_SOURCE[0]}")/setenv.sh"
|
||||||
|
|
||||||
|
for dir in "$PLATZ_WORK"/*/; do
|
||||||
|
if [ -f "${dir}tische.ini" ]; then
|
||||||
|
echo
|
||||||
|
echo "=== $(basename "$dir") ==="
|
||||||
|
python "$PLATZ_LIBS/platz.py" --indir "$dir" --tosvg "$@"
|
||||||
|
fi
|
||||||
|
done
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
@echo off
|
||||||
|
REM ================================================================
|
||||||
|
REM Verwaltet die lokale Web-Testinstanz (FastAPI/uvicorn, M1)
|
||||||
|
REM
|
||||||
|
REM run_web.bat start - startet den Server im Hintergrund
|
||||||
|
REM run_web.bat stop - beendet den Server
|
||||||
|
REM run_web.bat status - zeigt ob und unter welcher PID er laeuft
|
||||||
|
REM run_web.bat - startet im Vordergrund mit Auto-Reload
|
||||||
|
REM (Strg+C zum Beenden)
|
||||||
|
REM
|
||||||
|
REM http://localhost:8000 Testoberflaeche
|
||||||
|
REM http://localhost:8000/docs interaktive API-Doku (Swagger)
|
||||||
|
REM
|
||||||
|
REM Die eigentliche Prozessverwaltung liegt plattformunabhaengig in
|
||||||
|
REM libs/webserver.py (laeuft unverandert auch unter Linux).
|
||||||
|
REM ================================================================
|
||||||
|
|
||||||
|
call "%~dp0setenv.bat" > nul
|
||||||
|
|
||||||
|
if not exist "%PLATZ%\.venv\Scripts\activate.bat" (
|
||||||
|
echo FEHLER: kein .venv gefunden - bitte zuerst bin\install_py.bat ausfuehren
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
call "%PLATZ%\.venv\Scripts\activate.bat"
|
||||||
|
|
||||||
|
python "%PLATZ_LIBS%\webserver.py" %*
|
||||||
|
exit /b %errorlevel%
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# ================================================================
|
||||||
|
# Verwaltet die lokale Web-Testinstanz (FastAPI/uvicorn, M1)
|
||||||
|
#
|
||||||
|
# run_web.sh start - startet den Server im Hintergrund
|
||||||
|
# run_web.sh stop - beendet den Server
|
||||||
|
# run_web.sh status - zeigt ob und unter welcher PID er laeuft
|
||||||
|
# run_web.sh - startet im Vordergrund mit Auto-Reload
|
||||||
|
# (Strg+C zum Beenden)
|
||||||
|
#
|
||||||
|
# http://localhost:8000 Testoberflaeche
|
||||||
|
# http://localhost:8000/docs interaktive API-Doku (Swagger)
|
||||||
|
#
|
||||||
|
# Die eigentliche Prozessverwaltung liegt plattformunabhaengig in
|
||||||
|
# libs/webserver.py (laeuft unveraendert auch unter Windows).
|
||||||
|
# ================================================================
|
||||||
|
|
||||||
|
source "$(dirname "${BASH_SOURCE[0]}")/setenv.sh" > /dev/null
|
||||||
|
|
||||||
|
if [ ! -f "$PLATZ/.venv/bin/activate" ]; then
|
||||||
|
echo "FEHLER: kein .venv gefunden - bitte zuerst bin/install_py.sh ausfuehren"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
source "$PLATZ/.venv/bin/activate"
|
||||||
|
|
||||||
|
exec python "$PLATZ_LIBS/webserver.py" "$@"
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
# Farbprofile fuer die SVG-Ausgabe (Sitzplatzverteilung.alsSVG).
|
||||||
|
#
|
||||||
|
# Jede Sektion ist ein Farbprofil, waehlbar per --farben <Sektion> (libs/platz.py,
|
||||||
|
# Vorgabe: grosse_gruppen) bzw. ueber PLATZ_FARBENART (Web). So laesst sich je
|
||||||
|
# Anlass ein anderes Farbschema vorwaehlen.
|
||||||
|
#
|
||||||
|
# Modus = palette
|
||||||
|
# Eine Farbliste (Palette), die zyklisch je Gruppe (nach Gruppen-Id sortiert)
|
||||||
|
# vergeben wird. Gut fuer viele/grosse Gruppen, wo es nur auf klare
|
||||||
|
# Unterscheidbarkeit ankommt.
|
||||||
|
#
|
||||||
|
# Modus = kategorien
|
||||||
|
# Trennt die Gruppen nach Art und faerbt sie unterschiedlich ein - gedacht
|
||||||
|
# fuer Hochzeiten:
|
||||||
|
# - Familie: eine Gruppe, deren Mitglieder mehrheitlich denselben
|
||||||
|
# Nachnamen tragen. Jeder Nachname bekommt einen Farbverlauf
|
||||||
|
# (abwechselnd aus FamilienVerlaeufe), Untergruppen desselben
|
||||||
|
# Nachnamens laufen den Verlauf entlang (z.B. Blau -> Gruen).
|
||||||
|
# - Verein: jede sonstige benannte Gruppe (Freunde, Kollegen, Vereine);
|
||||||
|
# laeuft ueber VereinVerlauf (z.B. Violett -> Grau).
|
||||||
|
# - VIP: fest gesetzte Gaeste ohne GA-Gruppe (Ehrentafel, Kindertisch);
|
||||||
|
# bekommen die Startfarbe von VIPVerlauf (Rot).
|
||||||
|
#
|
||||||
|
# Farbverlauf-Syntax: "Startfarbe -> Endfarbe"; mehrere Verlaeufe kommagetrennt.
|
||||||
|
|
||||||
|
|
||||||
|
# Fuer grosse Veranstaltungen mit vielen Gruppen: reine Palette, zyklisch.
|
||||||
|
[grosse_gruppen]
|
||||||
|
Modus = palette
|
||||||
|
Palette = #e6194b, #3cb44b, #4363d8, #f58231, #911eb4, #42d4f4, #f032e6,
|
||||||
|
#bfef45, #fabed4, #469990, #dcbeff, #9a6324, #800000, #aaffc3,
|
||||||
|
#000075, #808000, #ffd8b1, #f58231, #46f0f0, #d2f53c
|
||||||
|
|
||||||
|
|
||||||
|
# Fuer Hochzeiten: nach Familie / Verein / VIP getrennt.
|
||||||
|
[hochzeit]
|
||||||
|
Modus = kategorien
|
||||||
|
# Familien: abwechselnd Blau -> Gruen und Gelb -> Orange (je Nachname ein
|
||||||
|
# Verlauf, damit sich verschiedene Familien unterscheiden).
|
||||||
|
FamilienVerlaeufe = #1f4e9c -> #2fae5f, #f2c200 -> #e8590c
|
||||||
|
# Vereine / gemischte Gruppen: Violett -> Grau.
|
||||||
|
VereinVerlauf = #7b2fbf -> #9aa0a6
|
||||||
|
# VIPs (feste Platzierung): Rot.
|
||||||
|
VIPVerlauf = #e63946 -> #8b0000
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
[Config]
|
|
||||||
Zyklusdatei=$PLATZ_CFG/zyklus.cfg
|
|
||||||
Zyklusart=Easy
|
|
||||||
Strafendatei=$PLATZ_CFG/strafen.cfg
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,19 +1,56 @@
|
|||||||
# Strafpunkte fuer die Trennung einer Gruppe:
|
# Strafpunkte-Profile ("Vorgehen") fuer die Bewertung einer Sitzplatzverteilung.
|
||||||
# Aufbau: Anzahl der Trennungen = { Gruppengroesse:Strafpunkte, .. }
|
#
|
||||||
[Trennung]
|
# Jede Sektion ist EIN vollstaendiges Bewertungsprofil mit allen Angaben. So
|
||||||
1={ 2:-10, 3:-8, 4:-6, 6:-4, 10:-2 }
|
# lassen sich mehrere Vorgehensweisen nebeneinander pflegen und speichern. Per
|
||||||
2={ 3:-20, 4:-8, 6:-6, 10:-4 }
|
# Schalter --strafen <Sektionsname> waehlt man ein Profil; ohne Schalter wird
|
||||||
3={ 4:-30, 6:-10, 10:-6 }
|
# [default] verwendet.
|
||||||
|
#
|
||||||
|
# Schluessel je Profil:
|
||||||
|
# Anzahl_Trennungen_N = { Gruppengroesse:Strafpunkte, .. }
|
||||||
|
# Strafpunkte fuer das Aufteilen einer Gruppe (N = Anzahl der Trennungen,
|
||||||
|
# also auf N+1 Tische verteilt), gestaffelt nach Gruppengroesse. Fehlt ein
|
||||||
|
# exakter Gruppengroessen-Eintrag, wird auf die naechstkleinere Groesse
|
||||||
|
# zurueckgegriffen. Mindestens Anzahl_Trennungen_1 sollte gesetzt sein.
|
||||||
|
# NichtNachbar = Strafe, wenn zwei Gruppenteile nicht am Nachbartisch sitzen
|
||||||
|
# Allein = Strafe, wenn eine Person ohne Gruppenmitglied am Tisch sitzt
|
||||||
|
# TischWertigkeiten = { freiePlaetze:Strafpunkte, .. } fuer freie Sitze an einem
|
||||||
|
# (teil-)belegten Tisch. Fehlt ein exakter Eintrag, gilt der
|
||||||
|
# naechstkleinere. Teilbelegte Tische sind am schlechtesten
|
||||||
|
# (dort passt keine ganze Gruppe mehr hin), daher steigt die
|
||||||
|
# Strafe mit den freien Plaetzen; ein komplett leerer Tisch
|
||||||
|
# (hoechster Schluessel) ist etwas besser, aber nicht gratis,
|
||||||
|
# damit sich das Zusammenziehen von Gruppen lohnt.
|
||||||
|
# Optional; fehlt der ganze Schluessel, werden freie Plaetze
|
||||||
|
# gar nicht bestraft -> mehr Teilbelegungen moeglich.
|
||||||
|
# AbstandFaktor = Strafpunkte je normierter Abstandseinheit (0..100) zwischen
|
||||||
|
# getrennten Teilen einer Gruppe. Der Abstand ist auf die
|
||||||
|
# maximale Ausdehnung der Tischanordnung normiert (100 =
|
||||||
|
# ein Teil ganz links/oben, der andere ganz rechts/unten).
|
||||||
|
# AbstandFaktor=-0.2 kostet den Maximalabstand also -20.
|
||||||
|
# Optional; fehlt der Schluessel, wird der Abstand nicht
|
||||||
|
# bestraft (Faktor 0).
|
||||||
|
|
||||||
# Wieviele Strafpunkte bekommt man
|
# Standardprofil: Trennungen sind bewusst teuer, damit eine Gruppe lieber
|
||||||
# wenn zwei Gruppen nicht am Nachbartisch sitzen
|
# zusammen an einem teilbelegten Tisch sitzt, als neben einem leeren getrennt zu
|
||||||
# wenn einer aus einer Gruppe allein sitzen muss
|
# werden.
|
||||||
[Globals]
|
[default]
|
||||||
|
Anzahl_Trennungen_1={ 2:-25, 3:-22, 4:-18, 6:-14, 8:-12, 10:-10 }
|
||||||
|
Anzahl_Trennungen_2={ 3:-40, 4:-30, 6:-22, 8:-18, 10:-14 }
|
||||||
|
Anzahl_Trennungen_3={ 4:-60, 6:-40, 8:-30, 10:-20 }
|
||||||
NichtNachbar=-3
|
NichtNachbar=-3
|
||||||
Allein=-30
|
Allein=-30
|
||||||
TischWertigkeiten={ 1:-3, 2:-2, 3:-1 }
|
TischWertigkeiten={ 1:-3, 2:-3, 4:-5, 6:-6, 8:-4 }
|
||||||
|
AbstandFaktor=-0.2
|
||||||
|
|
||||||
# TischWertigkeiten sind Strafpunkte fuer schlechte Ausnutzung der
|
# Beispiel fuer ein alternatives Vorgehen: Trennungen sind guenstiger, der
|
||||||
# freien Sitze an einem Tisch.
|
# Abstand wird nicht bestraft, und freie Plaetze werden gar nicht bestraft
|
||||||
# An einem Tisch, der bis auf einen Platz voll besetzt ist,
|
# (TischWertigkeiten fehlt bewusst) — so sind mehr Teilbelegungen moeglich.
|
||||||
# kann niemand mehr gut dazu. wenn zwei Plaetze frei sind, ist das etwas besser.
|
# Nuetzlich fuer grosse Saele, in denen sich Gruppen kaum ungeteilt platzieren
|
||||||
|
# lassen. Aufruf: --strafen locker
|
||||||
|
[locker]
|
||||||
|
Anzahl_Trennungen_1={ 2:-12, 3:-10, 4:-8, 6:-6, 8:-5, 10:-4 }
|
||||||
|
Anzahl_Trennungen_2={ 3:-20, 4:-16, 6:-12, 8:-9, 10:-7 }
|
||||||
|
Anzahl_Trennungen_3={ 4:-30, 6:-22, 8:-16, 10:-12 }
|
||||||
|
NichtNachbar=-2
|
||||||
|
Allein=-20
|
||||||
|
AbstandFaktor=0.0
|
||||||
|
|||||||
@@ -20,3 +20,27 @@ Anzahl='10,'+'5,x,2,x,x,'*3+'1'
|
|||||||
Abfolge='e,s'
|
Abfolge='e,s'
|
||||||
Anzahl='20,1'
|
Anzahl='20,1'
|
||||||
|
|
||||||
|
# Adaptives Profil: keine feste Aktionsliste, sondern eine Generationen-
|
||||||
|
# schleife (siehe Farm._LaufAdaptiv in libs/ga.py). Erkannt wird es am Feld
|
||||||
|
# 'Start'. Es wird nicht mit harten Zahlen je Aktion gearbeitet, sondern nur
|
||||||
|
# mit einem Anfangswert und einem Abbruchkriterium:
|
||||||
|
# Start = Groesse der Startpopulation (viele Verteilungen zu
|
||||||
|
# Beginn; sie schrumpft dann von Generation zu Generation)
|
||||||
|
# MutationProLoesung = wie oft jede Loesung je Generation mutiert wird
|
||||||
|
# Schrumpfung = Faktor (<1), um den die behaltene Population je
|
||||||
|
# Generation kleiner wird (0.85 = -15 %% pro Generation)
|
||||||
|
# MinPopulation = untere Schranke, damit die Population nicht auf 1 faellt
|
||||||
|
# MaxGenerationen = harte Obergrenze der Generationen
|
||||||
|
# Geduld = nach so vielen Generationen ohne nennenswerte
|
||||||
|
# Verbesserung wird abgebrochen (dein "nach 3 Zyklen")
|
||||||
|
# Schwelle = um so viel muss sich der beste Wert mindestens
|
||||||
|
# verbessern, damit es als Verbesserung zaehlt
|
||||||
|
[Adaptiv]
|
||||||
|
Start=40
|
||||||
|
MutationProLoesung=2
|
||||||
|
Schrumpfung=0.85
|
||||||
|
MinPopulation=5
|
||||||
|
MaxGenerationen=50
|
||||||
|
Geduld=3
|
||||||
|
Schwelle=1.0
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ Referenz fuer die Eingabe- und Ausgabedateien eines `platz`-Laufs, mit Beispiele
|
|||||||
`work/test1/` und `work/test2/`.
|
`work/test1/` und `work/test2/`.
|
||||||
|
|
||||||
Alle vier Dateien liegen unter dem mit `--indir <dir>` angegebenen Verzeichnis (z.B.
|
Alle vier Dateien liegen unter dem mit `--indir <dir>` angegebenen Verzeichnis (z.B.
|
||||||
`work/test1/` oder `work/test2/`) unter festen Namen: `tische.ini`, `bestellung.xml` als
|
`work/test1/` oder `work/test2/`) unter festen Namen: `tische.ini`, `bestellung.json` als
|
||||||
Eingabe, `TischePersonen.txt` und `PersonenTische.csv` als Ausgabe. Beispielaufruf:
|
Eingabe, `TischePersonen.txt` und `PersonenTische.csv` als Ausgabe. Beispielaufruf:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -67,108 +67,90 @@ Werte wie `Nachbarliste` und `Koordinaten` werden mit `eval()` geladen (siehe
|
|||||||
`Tische.laden()` in `libs/Strukturdaten.py`) — es steht also echter Python-Ausdruckscode im
|
`Tische.laden()` in `libs/Strukturdaten.py`) — es steht also echter Python-Ausdruckscode im
|
||||||
File, keine reine INI-Syntax.
|
File, keine reine INI-Syntax.
|
||||||
|
|
||||||
## Gaesteliste: `bestellung.xml`
|
## Gaesteliste: `bestellung.json`
|
||||||
|
|
||||||
Ein `<Bestellung>` mit mehreren `<Gruppe>`-Bloecken. Jede Gruppe enthaelt:
|
Ein JSON-Objekt mit dem Schluessel `"gruppen"`, einer Liste von Gruppen-Objekten. Jede
|
||||||
|
Gruppe enthaelt:
|
||||||
|
|
||||||
- ein oder mehrere `<Person>`-Elemente mit `<Vorname>`, `<Nachname>` und optionalem
|
- `"personen"`: Liste von Personen-Objekten mit `"vorname"`, `"nachname"` und optionalem
|
||||||
`<Titel>`
|
`"titel"` (Pflicht: Vor- und Nachname)
|
||||||
- optional `<Anzahl>N</Anzahl>`, um die zuletzt beschriebene Person zu einer Sammelbuchung
|
- optional `"name"`: Anzeigename der Gruppe (z.B. `"Familie Huber"`); nur fuer Ausgabe und
|
||||||
von `N` (anonymen/gleichnamigen) Personen zu vervielfaeltigen
|
Web-Anzeige, nicht fuer die Optimierung relevant
|
||||||
- optional `<Tisch>Id</Tisch>`, um die Gruppe als VIP-Gruppe fest an den angegebenen Tisch
|
- optional `"anzahl"`: N, um **jede** Person der Gruppe zu einer Sammelbuchung von N
|
||||||
zu binden (sie wird dann **nicht** vom GA platziert)
|
(gleichnamigen) Buchungen zu vervielfaeltigen — praktisch fuer anonyme Kontingente
|
||||||
|
- optional `"tisch"`: Tisch-Id, um die Gruppe als VIP-Gruppe fest an diesen Tisch zu binden
|
||||||
|
(sie wird dann **nicht** vom GA platziert)
|
||||||
|
|
||||||
XML-Kommentare (`<!-- ... -->`) sind erlaubt und werden beim Parsen ignoriert.
|
Geladen wird das File von `JSONConfig` in `libs/Strukturdaten.py` (Nachfolger des frueheren
|
||||||
|
`XMLConfig`; das alte `bestellung.xml`-Format wurde vollstaendig durch JSON abgeloest).
|
||||||
|
Die Datei sollte UTF-8 sein; ein evtl. vorhandenes BOM (Excel) wird geschluckt.
|
||||||
|
|
||||||
Minimalbeispiel mit Sammelbuchungen, aus `work/test1/bestellung.xml`:
|
Minimalbeispiel mit Sammelbuchungen, aus `work/test1/bestellung.json`:
|
||||||
|
|
||||||
```xml
|
```json
|
||||||
<Bestellung>
|
{
|
||||||
|
"gruppen": [
|
||||||
<Gruppe>
|
{
|
||||||
<Person>
|
"anzahl": 10,
|
||||||
<Vorname>A</Vorname>
|
"personen": [
|
||||||
<Nachname>AA</Nachname>
|
{ "vorname": "A", "nachname": "AA", "titel": "Dipl. Ing." }
|
||||||
<Titel>Dipl. Ing.</Titel>
|
]
|
||||||
</Person>
|
},
|
||||||
<Anzahl>10</Anzahl>
|
{
|
||||||
</Gruppe>
|
"anzahl": 4,
|
||||||
|
"personen": [
|
||||||
<Gruppe>
|
{ "vorname": "B", "nachname": "BB", "titel": "Prof." }
|
||||||
<Person>
|
]
|
||||||
<Vorname>B</Vorname>
|
},
|
||||||
<Nachname>BB</Nachname>
|
{
|
||||||
<Titel>Prof.</Titel>
|
"anzahl": 5,
|
||||||
</Person>
|
"personen": [
|
||||||
<Anzahl>4</Anzahl>
|
{ "vorname": "C", "nachname": "CC", "titel": "Dr." }
|
||||||
</Gruppe>
|
]
|
||||||
|
}
|
||||||
<Gruppe>
|
]
|
||||||
<Person>
|
}
|
||||||
<Vorname>C</Vorname>
|
|
||||||
<Nachname>CC</Nachname>
|
|
||||||
<Titel>Dr.</Titel>
|
|
||||||
</Person>
|
|
||||||
<Anzahl>5</Anzahl>
|
|
||||||
</Gruppe>
|
|
||||||
|
|
||||||
</Bestellung>
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Umfangreicheres Beispiel mit benannten Personen und einer VIP-Gruppe, aus
|
Umfangreicheres Beispiel mit benannten Gruppen und einer VIP-Gruppe, aus
|
||||||
`work/test2/bestellung.xml`:
|
`work/test2/bestellung.json`:
|
||||||
|
|
||||||
```xml
|
```json
|
||||||
<Bestellung>
|
{
|
||||||
|
"gruppen": [
|
||||||
<!-- einfache Gruppe aus drei Personen
|
{
|
||||||
mit festem Wunsch fuer einen Tisch-->
|
"name": "einfache Gruppe aus drei Personen mit festem Wunsch fuer einen Tisch",
|
||||||
<Gruppe>
|
"tisch": 1,
|
||||||
<Person>
|
"personen": [
|
||||||
<Vorname>Michael</Vorname>
|
{ "vorname": "Michael", "nachname": "Stangl", "titel": "Dipl. Ing." },
|
||||||
<Nachname>Stangl</Nachname>
|
{ "vorname": "Magnus", "nachname": "Mueller", "titel": "Professor" },
|
||||||
<Titel>Dipl. Ing.</Titel>
|
{ "vorname": "Bernd Robert", "nachname": "Hoehn", "titel": "Professor" }
|
||||||
</Person>
|
]
|
||||||
<Person>
|
},
|
||||||
<Vorname>Magnus</Vorname>
|
{
|
||||||
<Nachname>Mueller</Nachname>
|
"name": "einfache Gruppe aus zwei Personen",
|
||||||
<Titel>Professor</Titel>
|
"personen": [
|
||||||
</Person>
|
{ "vorname": "Heinz", "nachname": "Bruegge" },
|
||||||
<Person>
|
{ "vorname": "Hubert", "nachname": "K" }
|
||||||
<Vorname>Bernd Robert</Vorname>
|
]
|
||||||
<Nachname>Hoehn</Nachname>
|
},
|
||||||
<Titel>Professor</Titel>
|
{
|
||||||
</Person>
|
"name": "Gruppe aus drei anonymen Personen",
|
||||||
<Tisch>1</Tisch>
|
"anzahl": 3,
|
||||||
</Gruppe>
|
"personen": [
|
||||||
|
{ "vorname": "Bestelli", "nachname": "Bloedkopf" }
|
||||||
<!-- einfache Gruppe aus zwei Personen -->
|
]
|
||||||
<Gruppe>
|
}
|
||||||
<Person>
|
]
|
||||||
<Vorname>Heinz</Vorname>
|
}
|
||||||
<Nachname>Bruegge</Nachname>
|
|
||||||
</Person>
|
|
||||||
<Person>
|
|
||||||
<Vorname>Hubert</Vorname>
|
|
||||||
<Nachname>K</Nachname>
|
|
||||||
</Person>
|
|
||||||
</Gruppe>
|
|
||||||
|
|
||||||
<!--Gruppe aus drei anonymen Personen-->
|
|
||||||
<Gruppe>
|
|
||||||
<Person>
|
|
||||||
<Vorname>Bestelli</Vorname>
|
|
||||||
<Nachname>Bloedkopf</Nachname>
|
|
||||||
</Person>
|
|
||||||
<Anzahl>3</Anzahl>
|
|
||||||
</Gruppe>
|
|
||||||
|
|
||||||
</Bestellung>
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Die erste Gruppe hier ist per `<Tisch>1</Tisch>` fest an Tisch 1 gebunden (VIP-Gruppe); die
|
Die erste Gruppe hier ist per `"tisch": 1` fest an Tisch 1 gebunden (VIP-Gruppe); die letzte
|
||||||
letzte Gruppe erzeugt ueber `<Anzahl>3</Anzahl>` drei gleichnamige "Bestelli Bloedkopf"
|
Gruppe erzeugt ueber `"anzahl": 3` drei gleichnamige "Bestelli Bloedkopf" Buchungen.
|
||||||
Buchungen.
|
|
||||||
|
> Fuer den Web-Weg (Meilenstein 1) gibt es zusaetzlich einen CSV-Import (`libs/CSVConfig.py`,
|
||||||
|
> Spalten `Vorname;Nachname;Titel;Gruppe;Tisch;Anzahl`) — inhaltlich aequivalent, nur
|
||||||
|
> flach statt verschachtelt.
|
||||||
|
|
||||||
## Ausgabe: `TischePersonen.txt`
|
## Ausgabe: `TischePersonen.txt`
|
||||||
|
|
||||||
|
|||||||
@@ -2,15 +2,21 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="251.2" height="90.4" viewBox="0 0 251.2 90.4">
|
<svg xmlns="http://www.w3.org/2000/svg" width="251.2" height="90.4" viewBox="0 0 251.2 90.4">
|
||||||
<rect width="100%" height="100%" fill="white"/>
|
<rect width="100%" height="100%" fill="white"/>
|
||||||
<circle cx="45.2" cy="45.2" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
<circle cx="45.2" cy="45.2" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
<text x="45.2" y="8" text-anchor="middle" font-size="10" fill="black">Tisch 1</text>
|
<circle class="person" data-gid="1" data-gruppe="Gruppe 1" data-name="Vorname1 Nachname1" cx="45.2" cy="32" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Vorname1 Nachname1 — Gruppe 1</title></circle>
|
||||||
<circle cx="45.2" cy="32" r="12" fill="#e6194b" stroke="black" stroke-width="1"/>
|
<circle class="person" data-gid="1" data-gruppe="Gruppe 1" data-name="Vorname2 Nachname2" cx="45.2" cy="58.4" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Vorname2 Nachname2 — Gruppe 1</title></circle>
|
||||||
<circle cx="45.2" cy="58.4" r="12" fill="#e6194b" stroke="black" stroke-width="1"/>
|
<ellipse cx="45.2" cy="45.2" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="45.2" y="40.4" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">0</text>
|
||||||
|
<text x="45.2" y="53.6" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">2 Pl.</text>
|
||||||
<circle cx="125.6" cy="45.2" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
<circle cx="125.6" cy="45.2" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
<text x="125.6" y="8" text-anchor="middle" font-size="10" fill="black">Tisch 2</text>
|
<circle class="person" data-gid="2" data-gruppe="Gruppe 2" data-name="Vorname3 Nachname3" cx="125.6" cy="32" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Vorname3 Nachname3 — Gruppe 2</title></circle>
|
||||||
<circle cx="125.6" cy="32" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
<circle class="person" data-gid="2" data-gruppe="Gruppe 2" data-name="Vorname4 Nachname4" cx="125.6" cy="58.4" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Vorname4 Nachname4 — Gruppe 2</title></circle>
|
||||||
<circle cx="125.6" cy="58.4" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
<ellipse cx="125.6" cy="45.2" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="125.6" y="40.4" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">0</text>
|
||||||
|
<text x="125.6" y="53.6" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">2 Pl.</text>
|
||||||
<circle cx="206" cy="45.2" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
<circle cx="206" cy="45.2" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
<text x="206" y="8" text-anchor="middle" font-size="10" fill="black">Tisch 3</text>
|
<circle class="person" data-gid="3" data-gruppe="Gruppe 3" data-name="Vorname5 Nachname5" cx="206" cy="32" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Vorname5 Nachname5 — Gruppe 3</title></circle>
|
||||||
<circle cx="206" cy="32" r="12" fill="#4363d8" stroke="black" stroke-width="1"/>
|
<circle class="person" data-gid="3" data-gruppe="Gruppe 3" data-name="Vorname6 Nachname6" cx="206" cy="58.4" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Vorname6 Nachname6 — Gruppe 3</title></circle>
|
||||||
<circle cx="206" cy="58.4" r="12" fill="#4363d8" stroke="black" stroke-width="1"/>
|
<ellipse cx="206" cy="45.2" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="206" y="40.4" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">0</text>
|
||||||
|
<text x="206" y="53.6" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">2 Pl.</text>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 2.7 KiB |
@@ -1,28 +1,44 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="251.2" height="412" viewBox="0 0 251.2 412">
|
<svg xmlns="http://www.w3.org/2000/svg" width="251.2" height="412" viewBox="0 0 251.2 412">
|
||||||
<rect width="100%" height="100%" fill="white"/>
|
<rect width="100%" height="100%" fill="white"/>
|
||||||
|
<polyline points="125.6,353.6 206,286.4" fill="none" stroke="#f58231" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="125.6,380 45.2,286.4" fill="none" stroke="#4363d8" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="206,125.6 125.6,32" fill="none" stroke="#e6194b" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="125.6,58.4 45.2,125.6" fill="none" stroke="#3cb44b" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
<circle cx="125.6" cy="366.8" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
<circle cx="125.6" cy="366.8" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
<text x="125.6" y="329.6" text-anchor="middle" font-size="10" fill="black">Tisch 1</text>
|
<circle class="person" data-gid="4" data-gruppe="Gruppe 4" data-name="Vorname10 Nachname10" cx="125.6" cy="353.6" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Vorname10 Nachname10 — Gruppe 4</title></circle>
|
||||||
<circle cx="125.6" cy="353.6" r="12" fill="#e6194b" stroke="black" stroke-width="1"/>
|
<circle class="person" data-gid="3" data-gruppe="Gruppe 3" data-name="Vorname7 Nachname7" cx="125.6" cy="380" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Vorname7 Nachname7 — Gruppe 3</title></circle>
|
||||||
<circle cx="125.6" cy="380" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
<ellipse cx="125.6" cy="366.8" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="125.6" y="362" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">0</text>
|
||||||
|
<text x="125.6" y="375.2" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">2 Pl.</text>
|
||||||
<circle cx="206" cy="286.4" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
<circle cx="206" cy="286.4" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
<text x="206" y="249.2" text-anchor="middle" font-size="10" fill="black">Tisch 2</text>
|
<circle class="person" data-gid="4" data-gruppe="Gruppe 4" data-name="Vorname11 Nachname11" cx="206" cy="273.2" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Vorname11 Nachname11 — Gruppe 4</title></circle>
|
||||||
<circle cx="206" cy="273.2" r="12" fill="#e6194b" stroke="black" stroke-width="1"/>
|
<circle class="person" data-gid="4" data-gruppe="Gruppe 4" data-name="Vorname12 Nachname12" cx="206" cy="299.6" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Vorname12 Nachname12 — Gruppe 4</title></circle>
|
||||||
<circle cx="206" cy="299.6" r="12" fill="#e6194b" stroke="black" stroke-width="1"/>
|
<ellipse cx="206" cy="286.4" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="206" y="281.6" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">0</text>
|
||||||
|
<text x="206" y="294.8" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">2 Pl.</text>
|
||||||
<circle cx="206" cy="125.6" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
<circle cx="206" cy="125.6" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
<text x="206" y="88.4" text-anchor="middle" font-size="10" fill="black">Tisch 3</text>
|
<circle class="person" data-gid="1" data-gruppe="Gruppe 1" data-name="Vorname2 Nachname2" cx="206" cy="112.4" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Vorname2 Nachname2 — Gruppe 1</title></circle>
|
||||||
<circle cx="206" cy="112.4" r="12" fill="#4363d8" stroke="black" stroke-width="1"/>
|
<circle class="person" data-gid="1" data-gruppe="Gruppe 1" data-name="Vorname3 Nachname3" cx="206" cy="138.8" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Vorname3 Nachname3 — Gruppe 1</title></circle>
|
||||||
<circle cx="206" cy="138.8" r="12" fill="#4363d8" stroke="black" stroke-width="1"/>
|
<ellipse cx="206" cy="125.6" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="206" y="120.8" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">0</text>
|
||||||
|
<text x="206" y="134" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">2 Pl.</text>
|
||||||
<circle cx="125.6" cy="45.2" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
<circle cx="125.6" cy="45.2" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
<text x="125.6" y="8" text-anchor="middle" font-size="10" fill="black">Tisch 4</text>
|
<circle class="person" data-gid="1" data-gruppe="Gruppe 1" data-name="Vorname1 Nachname1" cx="125.6" cy="32" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Vorname1 Nachname1 — Gruppe 1</title></circle>
|
||||||
<circle cx="125.6" cy="32" r="12" fill="#4363d8" stroke="black" stroke-width="1"/>
|
<circle class="person" data-gid="2" data-gruppe="Gruppe 2" data-name="Vorname4 Nachname4" cx="125.6" cy="58.4" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Vorname4 Nachname4 — Gruppe 2</title></circle>
|
||||||
<circle cx="125.6" cy="58.4" r="12" fill="#f58231" stroke="black" stroke-width="1"/>
|
<ellipse cx="125.6" cy="45.2" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="125.6" y="40.4" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">0</text>
|
||||||
|
<text x="125.6" y="53.6" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">2 Pl.</text>
|
||||||
<circle cx="45.2" cy="125.6" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
<circle cx="45.2" cy="125.6" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
<text x="45.2" y="88.4" text-anchor="middle" font-size="10" fill="black">Tisch 5</text>
|
<circle class="person" data-gid="2" data-gruppe="Gruppe 2" data-name="Vorname5 Nachname5" cx="45.2" cy="112.4" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Vorname5 Nachname5 — Gruppe 2</title></circle>
|
||||||
<circle cx="45.2" cy="112.4" r="12" fill="#f58231" stroke="black" stroke-width="1"/>
|
<circle class="person" data-gid="2" data-gruppe="Gruppe 2" data-name="Vorname6 Nachname6" cx="45.2" cy="138.8" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Vorname6 Nachname6 — Gruppe 2</title></circle>
|
||||||
<circle cx="45.2" cy="138.8" r="12" fill="#f58231" stroke="black" stroke-width="1"/>
|
<ellipse cx="45.2" cy="125.6" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="45.2" y="120.8" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">0</text>
|
||||||
|
<text x="45.2" y="134" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">2 Pl.</text>
|
||||||
<circle cx="45.2" cy="286.4" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
<circle cx="45.2" cy="286.4" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
<text x="45.2" y="249.2" text-anchor="middle" font-size="10" fill="black">Tisch 6</text>
|
<circle class="person" data-gid="3" data-gruppe="Gruppe 3" data-name="Vorname8 Nachname8" cx="45.2" cy="273.2" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Vorname8 Nachname8 — Gruppe 3</title></circle>
|
||||||
<circle cx="45.2" cy="273.2" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
<circle class="person" data-gid="3" data-gruppe="Gruppe 3" data-name="Vorname9 Nachname9" cx="45.2" cy="299.6" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Vorname9 Nachname9 — Gruppe 3</title></circle>
|
||||||
<circle cx="45.2" cy="299.6" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
<ellipse cx="45.2" cy="286.4" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="45.2" y="281.6" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">0</text>
|
||||||
|
<text x="45.2" y="294.8" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">2 Pl.</text>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 5.8 KiB |
@@ -0,0 +1,45 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="340" viewBox="0 0 1200 340" font-family="sans-serif">
|
||||||
|
<rect width="100%" height="100%" fill="white"/>
|
||||||
|
<text x="600" y="30" text-anchor="middle" font-size="16" fill="#333">Abstammung der Loesungen (Mutationsbaum)</text>
|
||||||
|
<line x1="60.0" y1="60.0" x2="60.0" y2="150.0" stroke="#c04040" stroke-width="2.5"/>
|
||||||
|
<line x1="420.0" y1="60.0" x2="214.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="780.0" y1="60.0" x2="368.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1140.0" y1="60.0" x2="522.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="60.0" y1="60.0" x2="677.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="420.0" y1="60.0" x2="831.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="780.0" y1="60.0" x2="985.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1140.0" y1="60.0" x2="1140.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="60.0" y1="150.0" x2="60.0" y2="240.0" stroke="#c04040" stroke-width="2.5"/>
|
||||||
|
<line x1="214.3" y1="150.0" x2="214.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="368.6" y1="150.0" x2="368.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="522.9" y1="150.0" x2="522.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="60.0" y1="150.0" x2="677.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="214.3" y1="150.0" x2="831.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="368.6" y1="150.0" x2="985.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="522.9" y1="150.0" x2="1140.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<circle cx="60.0" cy="60.0" r="7" fill="#c83232" stroke="#c04040" stroke-width="2"><title>Id 1, Wert -100.0</title></circle>
|
||||||
|
<circle cx="420.0" cy="60.0" r="5" fill="#c83232" stroke="#333" stroke-width="0.5"><title>Id 2, Wert -100.0</title></circle>
|
||||||
|
<circle cx="780.0" cy="60.0" r="5" fill="#c83232" stroke="#333" stroke-width="0.5"><title>Id 3, Wert -100.0</title></circle>
|
||||||
|
<circle cx="1140.0" cy="60.0" r="5" fill="#c83232" stroke="#333" stroke-width="0.5"><title>Id 4, Wert -100.0</title></circle>
|
||||||
|
<circle cx="60.0" cy="150.0" r="7" fill="#785f41" stroke="#c04040" stroke-width="2"><title>Id 5, Wert -99.0</title></circle>
|
||||||
|
<circle cx="214.3" cy="150.0" r="5" fill="#785f41" stroke="#333" stroke-width="0.5"><title>Id 6, Wert -99.0</title></circle>
|
||||||
|
<circle cx="368.6" cy="150.0" r="5" fill="#785f41" stroke="#333" stroke-width="0.5"><title>Id 7, Wert -99.0</title></circle>
|
||||||
|
<circle cx="522.9" cy="150.0" r="5" fill="#785f41" stroke="#333" stroke-width="0.5"><title>Id 8, Wert -99.0</title></circle>
|
||||||
|
<circle cx="677.1" cy="150.0" r="5" fill="#785f41" stroke="#333" stroke-width="0.5"><title>Id 9, Wert -99.0</title></circle>
|
||||||
|
<circle cx="831.4" cy="150.0" r="5" fill="#785f41" stroke="#333" stroke-width="0.5"><title>Id 10, Wert -99.0</title></circle>
|
||||||
|
<circle cx="985.7" cy="150.0" r="5" fill="#785f41" stroke="#333" stroke-width="0.5"><title>Id 11, Wert -99.0</title></circle>
|
||||||
|
<circle cx="1140.0" cy="150.0" r="5" fill="#785f41" stroke="#333" stroke-width="0.5"><title>Id 12, Wert -99.0</title></circle>
|
||||||
|
<circle cx="60.0" cy="240.0" r="7" fill="#288c50" stroke="#c04040" stroke-width="2"><title>Id 13, Wert -98.0</title></circle>
|
||||||
|
<circle cx="214.3" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 14, Wert -98.0</title></circle>
|
||||||
|
<circle cx="368.6" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 15, Wert -98.0</title></circle>
|
||||||
|
<circle cx="522.9" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 16, Wert -98.0</title></circle>
|
||||||
|
<circle cx="677.1" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 17, Wert -98.0</title></circle>
|
||||||
|
<circle cx="831.4" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 18, Wert -98.0</title></circle>
|
||||||
|
<circle cx="985.7" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 19, Wert -98.0</title></circle>
|
||||||
|
<circle cx="1140.0" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 20, Wert -98.0</title></circle>
|
||||||
|
<text x="60.0" y="262.0" text-anchor="middle" font-size="12" font-weight="bold" fill="#c04040">13</text>
|
||||||
|
<text x="48" y="64.0" text-anchor="end" font-size="11" fill="#666">Gen 0</text>
|
||||||
|
<text x="48" y="154.0" text-anchor="end" font-size="11" fill="#666">Gen 1</text>
|
||||||
|
<text x="48" y="244.0" text-anchor="end" font-size="11" fill="#666">Gen 2</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.4 KiB |
@@ -0,0 +1,43 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="650" viewBox="0 0 900 650" font-family="sans-serif">
|
||||||
|
<rect width="100%" height="100%" fill="white"/>
|
||||||
|
<text x="450" y="30" text-anchor="middle" font-size="16" fill="#333">Entwicklung der Loesungsfindung</text>
|
||||||
|
<line x1="60" y1="60" x2="60" y2="390.0" stroke="#333" stroke-width="1.5"/>
|
||||||
|
<line x1="60" y1="390.0" x2="840" y2="390.0" stroke="#333" stroke-width="1.5"/>
|
||||||
|
<line x1="60" y1="390.0" x2="840" y2="390.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="394.0" text-anchor="end" font-size="11" fill="#666">-200</text>
|
||||||
|
<line x1="60" y1="324.0" x2="840" y2="324.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="328.0" text-anchor="end" font-size="11" fill="#666">-168</text>
|
||||||
|
<line x1="60" y1="258.0" x2="840" y2="258.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="262.0" text-anchor="end" font-size="11" fill="#666">-136</text>
|
||||||
|
<line x1="60" y1="192.0" x2="840" y2="192.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="196.0" text-anchor="end" font-size="11" fill="#666">-104</text>
|
||||||
|
<line x1="60" y1="126.0" x2="840" y2="126.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="130.0" text-anchor="end" font-size="11" fill="#666">-72</text>
|
||||||
|
<line x1="60" y1="60.0" x2="840" y2="60.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="64.0" text-anchor="end" font-size="11" fill="#666">-40</text>
|
||||||
|
<text x="18" y="225.0" text-anchor="middle" font-size="12" fill="#333" transform="rotate(-90 18 225.0)">Wertigkeit (hoeher = besser)</text>
|
||||||
|
<polyline points="60.0,163.1 450.0,121.9 840.0,60.0" fill="none" stroke="#2f6f4f" stroke-width="2"/>
|
||||||
|
<polyline points="60.0,280.0 450.0,142.5 840.0,90.9" fill="none" stroke="#c08a2d" stroke-width="2"/>
|
||||||
|
<polyline points="60.0,390.0 450.0,163.1 840.0,121.9" fill="none" stroke="#a03030" stroke-width="2"/>
|
||||||
|
<line x1="680" y1="70" x2="704" y2="70" stroke="#2f6f4f" stroke-width="2"/>
|
||||||
|
<text x="710" y="74" font-size="11" fill="#333">beste Loesung</text>
|
||||||
|
<line x1="680" y1="88" x2="704" y2="88" stroke="#c08a2d" stroke-width="2"/>
|
||||||
|
<text x="710" y="92" font-size="11" fill="#333">Durchschnitt</text>
|
||||||
|
<line x1="680" y1="106" x2="704" y2="106" stroke="#a03030" stroke-width="2"/>
|
||||||
|
<text x="710" y="110" font-size="11" fill="#333">schlechteste Loesung</text>
|
||||||
|
<text x="450" y="428.0" text-anchor="middle" font-size="13" fill="#333">Anzahl erzeugter Verteilungen im Pool</text>
|
||||||
|
<line x1="60" y1="440.0" x2="60" y2="590.0" stroke="#333" stroke-width="1.5"/>
|
||||||
|
<line x1="60" y1="590.0" x2="840" y2="590.0" stroke="#333" stroke-width="1.5"/>
|
||||||
|
<line x1="60" y1="590.0" x2="840" y2="590.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="594.0" text-anchor="end" font-size="11" fill="#666">0</text>
|
||||||
|
<line x1="60" y1="540.0" x2="840" y2="540.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="544.0" text-anchor="end" font-size="11" fill="#666">1</text>
|
||||||
|
<line x1="60" y1="440.0" x2="840" y2="440.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="444.0" text-anchor="end" font-size="11" fill="#666">3</text>
|
||||||
|
<polyline points="60.0,440.0 450.0,490.0 840.0,490.0" fill="none" stroke="#4060a0" stroke-width="2"/>
|
||||||
|
<text x="60.0" y="606.0" text-anchor="middle" font-size="10" fill="#999">e</text>
|
||||||
|
<text x="450.0" y="606.0" text-anchor="middle" font-size="10" fill="#999">s</text>
|
||||||
|
<text x="840.0" y="606.0" text-anchor="middle" font-size="10" fill="#999">m</text>
|
||||||
|
<text x="450" y="638" text-anchor="middle" font-size="12" fill="#333">Zyklus-Aktion (Zeit)</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.4 KiB |
@@ -1,20 +1,30 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="331.6" height="90.4" viewBox="0 0 331.6 90.4">
|
<svg xmlns="http://www.w3.org/2000/svg" width="331.6" height="90.4" viewBox="0 0 331.6 90.4">
|
||||||
<rect width="100%" height="100%" fill="white"/>
|
<rect width="100%" height="100%" fill="white"/>
|
||||||
|
<polyline points="45.2,45.2 125.6,45.2" fill="none" stroke="#3cb44b" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="206,45.2 286.4,45.2" fill="none" stroke="#e6194b" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
<circle cx="45.2" cy="45.2" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
<circle cx="45.2" cy="45.2" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
<text x="45.2" y="8" text-anchor="middle" font-size="10" fill="black">Tisch 1</text>
|
<circle class="person" data-gid="2" data-gruppe="Gruppe 2" data-name="Vorname8 Nachname8" cx="45.2" cy="32" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Vorname8 Nachname8 — Gruppe 2</title></circle>
|
||||||
<circle cx="45.2" cy="32" r="12" fill="#e6194b" stroke="black" stroke-width="1"/>
|
<circle class="person" data-gid="2" data-gruppe="Gruppe 2" data-name="Vorname5 Nachname5" cx="45.2" cy="58.4" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Vorname5 Nachname5 — Gruppe 2</title></circle>
|
||||||
<circle cx="45.2" cy="58.4" r="12" fill="#e6194b" stroke="black" stroke-width="1"/>
|
<ellipse cx="45.2" cy="45.2" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="45.2" y="40.4" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">0</text>
|
||||||
|
<text x="45.2" y="53.6" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">2 Pl.</text>
|
||||||
<circle cx="125.6" cy="45.2" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
<circle cx="125.6" cy="45.2" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
<text x="125.6" y="8" text-anchor="middle" font-size="10" fill="black">Tisch 2</text>
|
<circle class="person" data-gid="2" data-gruppe="Gruppe 2" data-name="Vorname6 Nachname6" cx="125.6" cy="32" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Vorname6 Nachname6 — Gruppe 2</title></circle>
|
||||||
<circle cx="125.6" cy="32" r="12" fill="#e6194b" stroke="black" stroke-width="1"/>
|
<circle class="person" data-gid="2" data-gruppe="Gruppe 2" data-name="Vorname7 Nachname7" cx="125.6" cy="58.4" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Vorname7 Nachname7 — Gruppe 2</title></circle>
|
||||||
<circle cx="125.6" cy="58.4" r="12" fill="#e6194b" stroke="black" stroke-width="1"/>
|
<ellipse cx="125.6" cy="45.2" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="125.6" y="40.4" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">0</text>
|
||||||
|
<text x="125.6" y="53.6" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">2 Pl.</text>
|
||||||
<circle cx="206" cy="45.2" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
<circle cx="206" cy="45.2" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
<text x="206" y="8" text-anchor="middle" font-size="10" fill="black">Tisch 3</text>
|
<circle class="person" data-gid="1" data-gruppe="Gruppe 1" data-name="Vorname3 Nachname3" cx="206" cy="32" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Vorname3 Nachname3 — Gruppe 1</title></circle>
|
||||||
<circle cx="206" cy="32" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
<circle class="person" data-gid="1" data-gruppe="Gruppe 1" data-name="Vorname4 Nachname4" cx="206" cy="58.4" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Vorname4 Nachname4 — Gruppe 1</title></circle>
|
||||||
<circle cx="206" cy="58.4" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
<ellipse cx="206" cy="45.2" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="206" y="40.4" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">0</text>
|
||||||
|
<text x="206" y="53.6" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">2 Pl.</text>
|
||||||
<circle cx="286.4" cy="45.2" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
<circle cx="286.4" cy="45.2" r="35.2" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
<text x="286.4" y="8" text-anchor="middle" font-size="10" fill="black">Tisch 4</text>
|
<circle class="person" data-gid="1" data-gruppe="Gruppe 1" data-name="Vorname1 Nachname1" cx="286.4" cy="32" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Vorname1 Nachname1 — Gruppe 1</title></circle>
|
||||||
<circle cx="286.4" cy="32" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
<circle class="person" data-gid="1" data-gruppe="Gruppe 1" data-name="Vorname2 Nachname2" cx="286.4" cy="58.4" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Vorname2 Nachname2 — Gruppe 1</title></circle>
|
||||||
<circle cx="286.4" cy="58.4" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
<ellipse cx="286.4" cy="45.2" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="286.4" y="40.4" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">0</text>
|
||||||
|
<text x="286.4" y="53.6" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">2 Pl.</text>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 3.8 KiB |
@@ -160,10 +160,17 @@ Die folgenden Grundsatzfragen sind entschieden und gelten für alle Meilensteine
|
|||||||
|
|
||||||
- [x] Python 2 → 3 Migration (bereits erledigt)
|
- [x] Python 2 → 3 Migration (bereits erledigt)
|
||||||
- [x] Unittest-Suite mit Kernszenarien (bereits erledigt)
|
- [x] Unittest-Suite mit Kernszenarien (bereits erledigt)
|
||||||
- [ ] `Farm` erweitern: `TopN()` statt nur `Bester()` — Grundlage für "mehrere Varianten"
|
- [x] `Farm` erweitern: `TopN()` statt nur `Bester()` — Grundlage für "mehrere Varianten"
|
||||||
später. Kleine, risikoarme Änderung am bestehenden Code.
|
später. Umgesetzt in `libs/ga.py` (`Farm.TopN(n)`: die `n` besten Lösungen absteigend,
|
||||||
- [ ] Determinismus-Option: `random.seed()` als Parameter durchreichen, damit ein Ergebnis
|
geclamped auf `[0, len(Pool)]`).
|
||||||
bei Bedarf reproduzierbar ist (Support-Anfragen: "warum sitzt Tante Erna da?")
|
- [x] Determinismus-Option: `random.seed()` als Parameter durchreichen, damit ein Ergebnis
|
||||||
|
bei Bedarf reproduzierbar ist (Support-Anfragen: "warum sitzt Tante Erna da?").
|
||||||
|
Umgesetzt als `--seed <int>` in `libs/platz.py`. **Wichtig:** der RNG-Seed allein
|
||||||
|
reichte nicht — `Person` hasht im `set()` einer `Gruppe` sonst über `id()`
|
||||||
|
(Speicheradresse), wodurch `set.pop()`-Reihenfolge in `Gruppe.teilen()` pro Prozess
|
||||||
|
variierte. Behoben durch Id-basiertes `__hash__`/`__eq__` an `Person`
|
||||||
|
(`libs/Strukturdaten.py`); Integer-Ids sind zudem `PYTHONHASHSEED`-unabhängig. Auf
|
||||||
|
`work/hochzeit` verifiziert: gleicher Seed → bytegleicher Plan, anderer Seed → abweichend.
|
||||||
- [x] Rechtsform geklärt: Betrieb über die bestehende **MiSta GmbH** (Impressum), keine
|
- [x] Rechtsform geklärt: Betrieb über die bestehende **MiSta GmbH** (Impressum), keine
|
||||||
Neugründung — Ausgründung aus der Holding erst bei Erfolg (Konzeptentscheidung Nr. 7)
|
Neugründung — Ausgründung aus der Holding erst bei Erfolg (Konzeptentscheidung Nr. 7)
|
||||||
- [x] Namensfrage geklärt: **"Sitz & Platz"** für Deutschland, **Sitzwunder/SeatWonder**
|
- [x] Namensfrage geklärt: **"Sitz & Platz"** für Deutschland, **Sitzwunder/SeatWonder**
|
||||||
@@ -186,22 +193,37 @@ Die folgenden Grundsatzfragen sind entschieden und gelten für alle Meilensteine
|
|||||||
**Ziel:** Eine Person kann übers Web eine Hochzeit planen, ohne Login. Ergebnis: PDF/SVG-Export.
|
**Ziel:** Eine Person kann übers Web eine Hochzeit planen, ohne Login. Ergebnis: PDF/SVG-Export.
|
||||||
Session-basiert, nichts wird dauerhaft gespeichert (schont Datenschutz-Aufwand in dieser Phase).
|
Session-basiert, nichts wird dauerhaft gespeichert (schont Datenschutz-Aufwand in dieser Phase).
|
||||||
|
|
||||||
- [ ] REST-API um den bestehenden Kern (FastAPI empfohlen: async, OpenAPI-Doku gratis,
|
- [x] REST-API um den bestehenden Kern (FastAPI) — umgesetzt in `web/main.py`,
|
||||||
gut für Traffic-Spitzen an Wochenenden)
|
Start per `bin/run_web.bat`/`.sh` (uvicorn --reload, Port 8000), Swagger unter `/docs`
|
||||||
- `POST /sitzung` — legt eine Arbeits-Session an (Tische + Personen)
|
- `POST /sitzung` — legt eine Arbeits-Session an (in-memory, TTL 24h)
|
||||||
- `POST /sitzung/{id}/tische` — Tisch-Layout (Ersatz für `tische.ini`)
|
- `POST /sitzung/{id}/tische` — Tisch-Layout als JSON (Ersatz für `tische.ini`);
|
||||||
|
Nachbarliste wird aus räumlicher Nähe der Koordinaten abgeleitet
|
||||||
- `POST /sitzung/{id}/personen` — CSV-Upload (Ersatz für `bestellung.xml`)
|
- `POST /sitzung/{id}/personen` — CSV-Upload (Ersatz für `bestellung.xml`)
|
||||||
- `POST /sitzung/{id}/berechnen` — startet die GA-Optimierung
|
- `POST /sitzung/{id}/berechnen` — startet die GA-Optimierung (jeder Aufruf = neue Variante)
|
||||||
- `GET /sitzung/{id}/ergebnis.svg` — liefert `alsSVG()`-Resultat
|
- `GET /sitzung/{id}/ergebnis` + `GET /sitzung/{id}/ergebnis.svg` — Ergebnis als JSON/SVG
|
||||||
- [ ] **CSV-Format definieren und Parser bauen** (Analogon zu `XMLConfig`):
|
- [x] **CSV-Format definiert und Parser gebaut** — `libs/CSVConfig.py` (Adapter analog
|
||||||
Spalten z.B. `Vorname;Nachname;Titel;Gruppe;Tisch(optional=VIP)`
|
`XMLConfig`): Spalten `Vorname;Nachname;Titel;Gruppe;Tisch;Anzahl`; `Tisch` = VIP-
|
||||||
→ wird zu `Personen`/`Gruppen`/VIP-Map, exakt wie `XMLConfig.HandleBestellung()`
|
Fixplatz, `Anzahl` = Sammelbuchungs-Expansion, leere `Gruppe` = Einzelgast;
|
||||||
heute — reiner Adapter, kein Kernumbau.
|
`MagNicht`/`MagGern` werden akzeptiert aber noch ignoriert (Konzeptentscheidung Nr. 10)
|
||||||
- [ ] **Interaktiver Tisch-Editor** (Frontend, React/Vue + SVG):
|
- [x] Einfache Browser-Testoberfläche (`web/static/index.html`): Tisch-Tabelle mit
|
||||||
Kreise per Drag & Drop platzieren, Kapazität einstellen, Nachbarschaft automatisch
|
Presets, CSV-Textfeld/-Upload, Berechnen-Button, Kennzahlen + SVG-Anzeige —
|
||||||
aus räumlicher Nähe ableiten (statt manueller `Nachbarliste`-Pflege in `tische.ini`)
|
Zwischenschritt, wird durch den Konva-Tisch-Editor (unten) abgelöst
|
||||||
|
- [x] **Interaktiver Tisch-Editor** (Frontend): Kreise per Drag & Drop platzieren,
|
||||||
|
Kapazität einstellen (+/−/Direkteingabe), Tische hinzufügen/löschen, Nachbarschaft
|
||||||
|
live aus räumlicher Nähe abgeleitet (gleiche Radius-Logik wie `_NachbarnAbleiten`
|
||||||
|
im Backend, Radius per Slider). Umgesetzt als `web/static/editor.html` —
|
||||||
|
**buildfrei, Inline-SVG + Vanilla-JS** statt React/Konva, weil das bestehende
|
||||||
|
Frontend keine Build-Toolchain (npm/package.json) hat; das State-Modell
|
||||||
|
(`{id, plaetze, x, y}`) ist dasselbe wie für eine spätere Konva-Portierung.
|
||||||
|
Backend um `GET /sitzung/{id}/tische` (Layout-Round-Trip) ergänzt, Session wird
|
||||||
|
per `localStorage` mit der Testoberfläche geteilt. Nebenbei behoben: fehlender
|
||||||
|
`import configparser` in `web/main.py` (der `/tische-datei`-Upload wäre sonst mit
|
||||||
|
`NameError` abgestürzt).
|
||||||
- Baut direkt auf `alsSVG()`-Geometrie auf (Radius-Berechnung ist bereits da)
|
- Baut direkt auf `alsSVG()`-Geometrie auf (Radius-Berechnung ist bereits da)
|
||||||
- [ ] Undo/Redo, "Variante neu berechnen"-Button
|
- [x] **Undo/Redo** im Editor: Snapshot-History (Stapel je Vor-Zustand von `state.tische`),
|
||||||
|
ein Drag zählt als ein Schritt; Tastatur `Strg+Z` / `Strg+Y` (bzw. `Strg+Shift+Z`),
|
||||||
|
`Entf` löscht den ausgewählten Tisch. "Variante neu berechnen" liegt bereits als
|
||||||
|
wiederholter `POST .../berechnen` in der Testoberfläche vor (jeder Klick = neue Variante).
|
||||||
- [ ] Hosting: einfacher Single-Server-Betrieb bei **Hetzner** reicht (Konzeptentscheidung
|
- [ ] Hosting: einfacher Single-Server-Betrieb bei **Hetzner** reicht (Konzeptentscheidung
|
||||||
Nr. 6 — kein Kubernetes-Overkill für MVP)
|
Nr. 6 — kein Kubernetes-Overkill für MVP)
|
||||||
|
|
||||||
@@ -221,15 +243,39 @@ verarbeitet werden (was bei jedem Webserver der Fall ist).
|
|||||||
|
|
||||||
**Ziel:** Nutzer bekommt mehrere Vorschläge statt einer festen Lösung, kann vergleichen.
|
**Ziel:** Nutzer bekommt mehrere Vorschläge statt einer festen Lösung, kann vergleichen.
|
||||||
|
|
||||||
- [ ] `Farm.TopN(n)` nutzen, um z.B. 3–5 unterschiedliche gute Lösungen zurückzugeben
|
- [x] `Farm.TopN(n)` nutzen, um z.B. 3–5 unterschiedliche gute Lösungen zurückzugeben:
|
||||||
(ggf. mit verschiedenen Zufalls-Seeds parallel starten für Diversität)
|
`POST /berechnen?varianten=N` (1–5, Default 3) nimmt `TopN` über den ganzen Endpool
|
||||||
- [ ] Vergleichsansicht im Frontend: Varianten nebeneinander, Kennzahlen sichtbar machen
|
und dedupliziert über eine Sitzordnungs-Signatur (`frozenset` aus Tisch-Id ×
|
||||||
(Wertigkeit, Anzahl Gruppentrennungen, "Alleine sitzende Personen")
|
Personen-Ids), damit Mutations-Verwandte mit identischer Sitzordnung nicht als
|
||||||
- [ ] Performance: bei sehr großen Sälen (200+ Personen) ggf. `Zyklus`-Parameter
|
"Varianten" zählen. Liefert der Pool weniger unterschiedliche Sitzordnungen, kommen
|
||||||
(Anzahl Generationen/Population) an Problemgröße koppeln, damit Antwortzeit
|
weniger zurück; ein weiterer Berechnen-Klick startet einen frischen Lauf.
|
||||||
im Web-Kontext (Sekunden, nicht Minuten) bleibt — Lasttest nötig
|
Seed-parallele Läufe für noch mehr Diversität ("ggf.") waren nicht nötig —
|
||||||
- [ ] Optional: Hintergrund-Job-Queue (z.B. Celery/RQ), falls Berechnung >5s dauert,
|
ein Lauf liefert im Test bereits 3 paarweise verschiedene Varianten.
|
||||||
damit der Webserver nicht blockiert
|
`GET /ergebnis.svg?variante=k` rendert jede Variante einzeln.
|
||||||
|
- [x] Vergleichsansicht im Frontend: Varianten-Karten nebeneinander mit Kennzahlen
|
||||||
|
(Wertigkeit, getrennte Gruppen + Teilungen gesamt, allein sitzende Personen —
|
||||||
|
letzteres via `LeuteAllein()`, zählt nur Personen aus mehrköpfigen Gruppen ohne
|
||||||
|
Gruppenmitglied am Tisch); Klick auf eine Karte schaltet Tische-/Gruppen-Tabellen
|
||||||
|
und den SVG-Raumplan auf die Variante um.
|
||||||
|
- [x] Performance: Lasttest erledigt (2026-07-12) — `work/innenhoefe` (300 Gäste,
|
||||||
|
88 Tische) rechnet mit dem **Adaptiv**-Profil (Web-Default) in ~1,7–1,9 s
|
||||||
|
(5–7 Generationen, inkl. Python-Start), Easy in ~0,3 s. Beides weit unter der
|
||||||
|
5-s-Schwelle → `Zyklus`-Parameter-Kopplung an die Problemgröße ist **nicht nötig**;
|
||||||
|
erst wieder prüfen, falls Zyklen deutlich vergrößert werden (siehe Risiko Nr. 2).
|
||||||
|
- [x] Optional: Hintergrund-Job-Queue (z.B. Celery/RQ), falls Berechnung >5s dauert —
|
||||||
|
**entfällt nach dem Lasttest** (s.o.): Adaptiv bleibt bei ~2 s, der Webserver
|
||||||
|
blockiert nicht spürbar. Entscheidung dokumentiert, bei Bedarf reaktivierbar.
|
||||||
|
|
||||||
|
**Tech-Debt / Modernisierung (Code-Review 2026-07-11):** Beim Umbau bereits erledigt sind
|
||||||
|
`eval()` → `ast.literal_eval` (bzw. ein sicherer Mini-Auswerter für die String-Ausdrücke
|
||||||
|
in `zyklus.cfg`) und `defaultdict(set)` in `Plaetze`. Bewusst *nicht* umgesetzt, für M2 zu
|
||||||
|
prüfen: **GA-Kern auf [DEAP](https://deap.readthedocs.io/) umstellen** (fertige
|
||||||
|
Population/Selektion/Statistik — würde das eigene `Farm`/`Entwicklung`-Gerüst ablösen und
|
||||||
|
`TopN` sowie die Diversitäts-Seeds quasi geschenkt liefern); **SVG-Erzeugung** in
|
||||||
|
`Sitzplatzverteilung.alsSVG`/`Entwicklung.alsSVG` von String-Konkatenation auf `svgwrite`
|
||||||
|
oder Jinja2-Templates; **Container-/Datenklassen** (`Person`, `Gruppe`, …) als
|
||||||
|
`@dataclass`. `Sitzplatzverteilung.TopX` bleibt bewusst handgeschrieben (die monoton
|
||||||
|
sinkende Schwelle prägt das Mutationsverhalten, siehe Kommentar im Code).
|
||||||
|
|
||||||
**Aufwand:** ~3–4 Wochen, aufbauend auf Meilenstein 1.
|
**Aufwand:** ~3–4 Wochen, aufbauend auf Meilenstein 1.
|
||||||
|
|
||||||
@@ -314,8 +360,16 @@ parallel anlaufen — eher ~4–4,5 Monate bis M4-Abschluss.
|
|||||||
1. **Datenschutz wird unterschätzt** — sobald echte Gästelisten dauerhaft gespeichert
|
1. **Datenschutz wird unterschätzt** — sobald echte Gästelisten dauerhaft gespeichert
|
||||||
werden (ab M3), ist das kein Nebenthema mehr. Frühzeitig Rechtsberatung einholen,
|
werden (ab M3), ist das kein Nebenthema mehr. Frühzeitig Rechtsberatung einholen,
|
||||||
nicht erst kurz vor Launch.
|
nicht erst kurz vor Launch.
|
||||||
2. **GA-Performance bei großen Sälen** — noch nicht lastgetestet mit z.B. 300+ Personen
|
2. **GA-Performance bei großen Sälen** — erster Datenpunkt (2026-07-11): das Beispiel
|
||||||
und vielen Tischen; ggf. Optimierungsbedarf vor M2.
|
`work/innenhoefe` mit 300 Gästen an 88 Tischen rechnet mit dem Easy-Zyklus in ~0,4 s
|
||||||
|
durch — weit unter der 5-s-Schwelle, ab der M2 eine Job-Queue vorsieht. Zweiter
|
||||||
|
Datenpunkt (2026-07-12, M2-Lasttest): dasselbe Beispiel mit dem **Adaptiv**-Profil
|
||||||
|
(Web-Default) braucht ~1,7–1,9 s (5–7 Generationen, 3 Seeds, inkl. Python-Start) —
|
||||||
|
Job-Queue und Parameter-Kopplung bleiben unnötig. Weiter offen ist nur die
|
||||||
|
Lösungsgüte-Frage: bei 4er-Tischen mit großen Gruppen (Wertigkeit ~−560) legen die
|
||||||
|
vielen Trennungen nahe, dass mehr GA-Iterationen (größere `Geduld`/`Start`-Werte)
|
||||||
|
bessere Pläne liefern könnten — das würde die Laufzeit dann wieder Richtung
|
||||||
|
5-s-Schwelle schieben und wäre neu zu messen.
|
||||||
3. **Wettbewerb ist real und etabliert** — siehe Abschnitt "Marktübersicht" oben.
|
3. **Wettbewerb ist real und etabliert** — siehe Abschnitt "Marktübersicht" oben.
|
||||||
PerfectTablePlan verfolgt seit Jahren denselben GA-Ansatz, allerdings als Desktop-Tool.
|
PerfectTablePlan verfolgt seit Jahren denselben GA-Ansatz, allerdings als Desktop-Tool.
|
||||||
Differenzierung muss über Web-nativ + DSGVO-Hosting + detailliertere Regeln
|
Differenzierung muss über Web-nativ + DSGVO-Hosting + detailliertere Regeln
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"""
|
"""
|
||||||
Liest eine Gaesteliste im CSV-Format ein — der Web-Ersatz fuer bestellung.xml
|
Liest eine Gaesteliste im CSV-Format ein — der Web-Ersatz fuer bestellung.json
|
||||||
(Meilenstein 1 der Roadmap, Adapter analog zu XMLConfig in Strukturdaten.py).
|
(Meilenstein 1 der Roadmap, Adapter analog zu JSONConfig in Strukturdaten.py).
|
||||||
|
|
||||||
CSV-Format (Kopfzeile noetig, Spaltenreihenfolge egal, Trennzeichen ; oder ,):
|
CSV-Format (Kopfzeile noetig, Spaltenreihenfolge egal, Trennzeichen ; oder ,):
|
||||||
|
|
||||||
@@ -12,10 +12,10 @@ CSV-Format (Kopfzeile noetig, Spaltenreihenfolge egal, Trennzeichen ; oder ,):
|
|||||||
zusammen und sollen moeglichst zusammen sitzen.
|
zusammen und sollen moeglichst zusammen sitzen.
|
||||||
Leer = Einzelperson (bildet eine eigene Ein-Personen-Gruppe).
|
Leer = Einzelperson (bildet eine eigene Ein-Personen-Gruppe).
|
||||||
- Tisch: optionale Tischnummer — die Person ist VIP und wird fest an
|
- Tisch: optionale Tischnummer — die Person ist VIP und wird fest an
|
||||||
diesen Tisch gesetzt (wie <Tisch> in bestellung.xml).
|
diesen Tisch gesetzt (wie "tisch" in bestellung.json).
|
||||||
VIPs laufen nicht durch die GA-Platzierung.
|
VIPs laufen nicht durch die GA-Platzierung.
|
||||||
- Anzahl: optionale Reservierungsanzahl — expandiert die Zeile in so
|
- Anzahl: optionale Reservierungsanzahl — expandiert die Zeile in so
|
||||||
viele identische Buchungen (wie <Anzahl> in bestellung.xml,
|
viele identische Buchungen (wie "anzahl" in bestellung.json,
|
||||||
z.B. fuer anonyme Sammelbuchungen). Leer = 1.
|
z.B. fuer anonyme Sammelbuchungen). Leer = 1.
|
||||||
|
|
||||||
Zusaetzlich werden die Spalten "MagNicht" und "MagGern" akzeptiert,
|
Zusaetzlich werden die Spalten "MagNicht" und "MagGern" akzeptiert,
|
||||||
@@ -35,7 +35,7 @@ from Strukturdaten import Person, Personen, Gruppe, Gruppen
|
|||||||
|
|
||||||
|
|
||||||
class CSVConfig:
|
class CSVConfig:
|
||||||
"""aus CSV Text/Datei alles einlesen (Rueckgabe wie XMLConfig.laden,
|
"""aus CSV Text/Datei alles einlesen (Rueckgabe wie JSONConfig.laden,
|
||||||
plus Gruppennamen fuer die Anzeige im Web-Frontend)"""
|
plus Gruppennamen fuer die Anzeige im Web-Frontend)"""
|
||||||
|
|
||||||
PflichtSpalten = ['vorname', 'nachname']
|
PflichtSpalten = ['vorname', 'nachname']
|
||||||
@@ -46,11 +46,11 @@ class CSVConfig:
|
|||||||
"""parst den CSV-Text und baut Personen/Gruppen/VIPs auf
|
"""parst den CSV-Text und baut Personen/Gruppen/VIPs auf
|
||||||
|
|
||||||
Rueckgabe: [ PN, GN, VIPGruppe, VipHash, GruppenNamen ]
|
Rueckgabe: [ PN, GN, VIPGruppe, VipHash, GruppenNamen ]
|
||||||
- PN: Personen-Container (ohne VIPs, wie XMLConfig)
|
- PN: Personen-Container (ohne VIPs, wie JSONConfig)
|
||||||
- GN: Gruppen-Container (ohne VIP-Gruppe, wie XMLConfig)
|
- GN: Gruppen-Container (ohne VIP-Gruppe, wie JSONConfig)
|
||||||
- VIPGruppe: Gruppe(0) mit allen fest gesetzten Personen
|
- VIPGruppe: Gruppe(0) mit allen fest gesetzten Personen
|
||||||
- VipHash: { PersonId: Tischnummer } fuer VIPsSetzen()
|
- VipHash: { PersonId: Tischnummer } fuer VIPsSetzen()
|
||||||
- GruppenNamen: { GruppenId: Anzeigename } (neu gegenueber XMLConfig)
|
- GruppenNamen: { GruppenId: Anzeigename }
|
||||||
"""
|
"""
|
||||||
# Trennzeichen automatisch bestimmen: die Kopfzeile entscheidet
|
# Trennzeichen automatisch bestimmen: die Kopfzeile entscheidet
|
||||||
Kopfzeile = Text.lstrip('').splitlines()[0] if Text.strip() else ''
|
Kopfzeile = Text.lstrip('').splitlines()[0] if Text.strip() else ''
|
||||||
@@ -84,6 +84,11 @@ class CSVConfig:
|
|||||||
VIPGruppe = Gruppe( 0 )
|
VIPGruppe = Gruppe( 0 )
|
||||||
VipHash = {}
|
VipHash = {}
|
||||||
GruppenNamen = {}
|
GruppenNamen = {}
|
||||||
|
# fest platzierte ("fixierte") Gruppen fuer die Anzeige: Name ->
|
||||||
|
# {'tisch': Tischnummer, 'anzahl': Personenzahl}. VIPs laufen nicht
|
||||||
|
# durch die GA-Platzierung, sollen in der Gaesteliste aber sichtbar
|
||||||
|
# (grau hinterlegt) erscheinen.
|
||||||
|
FixierteGruppen = {}
|
||||||
|
|
||||||
# Gruppen entstehen beim ersten Auftreten ihres Namens;
|
# Gruppen entstehen beim ersten Auftreten ihres Namens;
|
||||||
# Einzelpersonen (leerer Gruppenname) bekommen eine eigene Gruppe
|
# Einzelpersonen (leerer Gruppenname) bekommen eine eigene Gruppe
|
||||||
@@ -126,9 +131,13 @@ class CSVConfig:
|
|||||||
PID = PID + 1
|
PID = PID + 1
|
||||||
P = Person( PID, Vorname, Nachname, Titel )
|
P = Person( PID, Vorname, Nachname, Titel )
|
||||||
if TischNr is not None:
|
if TischNr is not None:
|
||||||
# VIP: fester Tisch, keine GA-Platzierung
|
# fixiert: fester Tisch, keine GA-Platzierung
|
||||||
VipHash[ PID ] = TischNr
|
VipHash[ PID ] = TischNr
|
||||||
VIPGruppe.Person_dazu( P )
|
VIPGruppe.Person_dazu( P )
|
||||||
|
Name = GruppenName if GruppenName else 'Fixiert Tisch %d' % TischNr
|
||||||
|
Eintrag = FixierteGruppen.setdefault(
|
||||||
|
Name, { 'tisch': TischNr, 'anzahl': 0 } )
|
||||||
|
Eintrag['anzahl'] = Eintrag['anzahl'] + 1
|
||||||
else:
|
else:
|
||||||
PN.PersonAdd( P )
|
PN.PersonAdd( P )
|
||||||
if GruppenName == '':
|
if GruppenName == '':
|
||||||
@@ -155,7 +164,7 @@ class CSVConfig:
|
|||||||
if G.Anzahl() > 0:
|
if G.Anzahl() > 0:
|
||||||
GN.Gruppe_dazu( G )
|
GN.Gruppe_dazu( G )
|
||||||
|
|
||||||
return [ PN, GN, VIPGruppe, VipHash, GruppenNamen ]
|
return [ PN, GN, VIPGruppe, VipHash, GruppenNamen, FixierteGruppen ]
|
||||||
|
|
||||||
def laden(self, FileName):
|
def laden(self, FileName):
|
||||||
"""lese alle Eingangsdaten aus einer CSV-Datei ein"""
|
"""lese alle Eingangsdaten aus einer CSV-Datei ein"""
|
||||||
@@ -179,12 +188,14 @@ Einzel;Gast;;;;
|
|||||||
"""
|
"""
|
||||||
print("\n-- Parse Beispiel-CSV:")
|
print("\n-- Parse Beispiel-CSV:")
|
||||||
C = CSVConfig()
|
C = CSVConfig()
|
||||||
[ PN, GN, VIPGruppe, VipHash, GruppenNamen ] = C.HandleGaesteliste( Beispiel )
|
[ PN, GN, VIPGruppe, VipHash, GruppenNamen, FixierteGruppen ] = \
|
||||||
|
C.HandleGaesteliste( Beispiel )
|
||||||
print(PN)
|
print(PN)
|
||||||
print(GN)
|
print(GN)
|
||||||
print(VIPGruppe)
|
print(VIPGruppe)
|
||||||
print(VipHash)
|
print(VipHash)
|
||||||
print(GruppenNamen)
|
print(GruppenNamen)
|
||||||
|
print(FixierteGruppen)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -0,0 +1,165 @@
|
|||||||
|
"""
|
||||||
|
Farbschema fuer die SVG-Ausgabe (Sitzplatzverteilung.alsSVG).
|
||||||
|
|
||||||
|
Laedt ein Farbprofil aus cfg/farben.cfg und ordnet jeder Gruppe eine Farbe zu.
|
||||||
|
Zwei Modi (siehe cfg/farben.cfg fuer Details):
|
||||||
|
- 'palette': eine Farbliste, zyklisch je Gruppe (nach Gruppen-Id sortiert)
|
||||||
|
- 'kategorien': trennt nach Art (Hochzeit) in Familie / Verein / VIP und
|
||||||
|
faerbt sie ueber je einen Farbverlauf ein.
|
||||||
|
|
||||||
|
Waehlbar per --farben <Sektion> (libs/platz.py) bzw. PLATZ_FARBENART (web).
|
||||||
|
"""
|
||||||
|
|
||||||
|
__author__ = "Michael Stangl"
|
||||||
|
__copyright__ = "Copyright (c) 2026 Michael Stangl"
|
||||||
|
__license__ = "Python"
|
||||||
|
|
||||||
|
import configparser
|
||||||
|
import os
|
||||||
|
from collections import Counter, defaultdict
|
||||||
|
|
||||||
|
|
||||||
|
def _hex_zu_rgb(h):
|
||||||
|
h = h.strip().lstrip('#')
|
||||||
|
return tuple( int(h[i:i+2], 16) for i in (0, 2, 4) )
|
||||||
|
|
||||||
|
|
||||||
|
def _rgb_zu_hex(rgb):
|
||||||
|
return '#%02x%02x%02x' % tuple( max(0, min(255, int(round(c)))) for c in rgb )
|
||||||
|
|
||||||
|
|
||||||
|
def _verlauf(start, ende, t):
|
||||||
|
"""Farbe im linearen RGB-Verlauf start->ende an Position t in [0,1]"""
|
||||||
|
a, b = _hex_zu_rgb(start), _hex_zu_rgb(ende)
|
||||||
|
return _rgb_zu_hex( tuple( a[i] + (b[i] - a[i]) * t for i in range(3) ) )
|
||||||
|
|
||||||
|
|
||||||
|
def _verlauf_liste(start, ende, n):
|
||||||
|
"""n Farben gleichmaessig ueber den Verlauf start->ende (n>=1)"""
|
||||||
|
if n <= 1:
|
||||||
|
return [ _verlauf(start, ende, 0.0) ]
|
||||||
|
return [ _verlauf(start, ende, j / (n - 1)) for j in range(n) ]
|
||||||
|
|
||||||
|
|
||||||
|
class Farbschema:
|
||||||
|
"""ordnet Gruppen Farben zu, gesteuert durch ein Profil aus farben.cfg"""
|
||||||
|
|
||||||
|
# Rueckfall-Palette, falls keine Config / kein gueltiges Profil geladen wurde
|
||||||
|
Standard = [
|
||||||
|
'#e6194b', '#3cb44b', '#4363d8', '#f58231', '#911eb4',
|
||||||
|
'#42d4f4', '#f032e6', '#bfef45', '#fabed4', '#469990',
|
||||||
|
'#dcbeff', '#9a6324', '#800000', '#aaffc3', '#000075' ]
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.Modus = 'palette'
|
||||||
|
self.Palette = list(self.Standard)
|
||||||
|
self.FamilienVerlaeufe = [ ('#1f4e9c', '#2fae5f'), ('#f2c200', '#e8590c') ]
|
||||||
|
self.VereinVerlauf = ('#7b2fbf', '#9aa0a6')
|
||||||
|
self.VIPVerlauf = ('#e63946', '#8b0000')
|
||||||
|
|
||||||
|
def laden(self, FileName, Sektion='grosse_gruppen'):
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
config.read( os.path.expanduser(FileName) )
|
||||||
|
if not config.has_section( Sektion ):
|
||||||
|
raise ValueError(
|
||||||
|
"Farbprofil '%s' nicht in %s gefunden (vorhanden: %s)"
|
||||||
|
% ( Sektion, FileName, ', '.join(config.sections()) or '-' ) )
|
||||||
|
self.Modus = config.get( Sektion, 'Modus', fallback='palette' ).strip()
|
||||||
|
if config.has_option( Sektion, 'Palette' ):
|
||||||
|
self.Palette = self._farbliste( config.get( Sektion, 'Palette' ) )
|
||||||
|
if config.has_option( Sektion, 'FamilienVerlaeufe' ):
|
||||||
|
self.FamilienVerlaeufe = self._verlaeufe(
|
||||||
|
config.get( Sektion, 'FamilienVerlaeufe' ) )
|
||||||
|
if config.has_option( Sektion, 'VereinVerlauf' ):
|
||||||
|
self.VereinVerlauf = self._verlaeufe( config.get( Sektion, 'VereinVerlauf' ) )[0]
|
||||||
|
if config.has_option( Sektion, 'VIPVerlauf' ):
|
||||||
|
self.VIPVerlauf = self._verlaeufe( config.get( Sektion, 'VIPVerlauf' ) )[0]
|
||||||
|
return self
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _farbliste(text):
|
||||||
|
return [ f.strip() for f in text.replace('\n', ',').split(',') if f.strip() ]
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _verlaeufe(text):
|
||||||
|
"""'A -> B, C -> D' -> [(A,B),(C,D)]; ein einzelner Wert wird zu (v,v)"""
|
||||||
|
ergebnis = []
|
||||||
|
for teil in text.replace('\n', ',').split(','):
|
||||||
|
teil = teil.strip()
|
||||||
|
if not teil:
|
||||||
|
continue
|
||||||
|
if '->' in teil:
|
||||||
|
a, b = teil.split('->', 1)
|
||||||
|
ergebnis.append( (a.strip(), b.strip()) )
|
||||||
|
else:
|
||||||
|
ergebnis.append( (teil, teil) )
|
||||||
|
return ergebnis or [ ('#888888', '#888888') ]
|
||||||
|
|
||||||
|
def farben(self, Gruppen):
|
||||||
|
"""ordnet den Gruppen Farben zu.
|
||||||
|
|
||||||
|
Rueckgabe: (GidZuFarbe {Gruppen-Id: hexfarbe}, VIPFarbe hexfarbe).
|
||||||
|
VIPFarbe gilt fuer Personen ohne GA-Gruppe (feste Platzierung)."""
|
||||||
|
GruppenListe = sorted( Gruppen, key=lambda g: g.Id )
|
||||||
|
if self.Modus == 'kategorien':
|
||||||
|
return self._kategorien( GruppenListe )
|
||||||
|
return self._palette( GruppenListe )
|
||||||
|
|
||||||
|
def _palette(self, GruppenListe):
|
||||||
|
pal = self.Palette or self.Standard
|
||||||
|
GidZuFarbe = { G.Id: pal[i % len(pal)] for i, G in enumerate(GruppenListe) }
|
||||||
|
return GidZuFarbe, '#888888'
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _nachname(G):
|
||||||
|
"""dominanter Nachname der Gruppe, wenn ihn die Mehrheit traegt (bei
|
||||||
|
>= 2 Mitgliedern) - sonst None (dann gilt die Gruppe als Verein/
|
||||||
|
gemischt). Anonyme Sammelbuchungen (alle Mitglieder derselbe Name,
|
||||||
|
z.B. 13x 'Gast Musikverein') sind keine Familie, sondern gelten als
|
||||||
|
Verein - daher werden mindestens zwei VERSCHIEDENE Personen verlangt."""
|
||||||
|
personen = list( G )
|
||||||
|
if len(personen) < 2:
|
||||||
|
return None
|
||||||
|
if len({ (P._Vorname, P._Name) for P in personen }) < 2:
|
||||||
|
return None # anonymer Block (alle identisch) -> kein Familienname
|
||||||
|
namen = [ P._Name for P in personen ]
|
||||||
|
name, anzahl = Counter(namen).most_common(1)[0]
|
||||||
|
return name if anzahl * 2 > len(namen) else None
|
||||||
|
|
||||||
|
def _kategorien(self, GruppenListe):
|
||||||
|
# 1. klassifizieren: Familien (nach Nachname) vs. Vereine
|
||||||
|
familien = defaultdict(list) # Nachname -> [Gruppen]
|
||||||
|
vereine = []
|
||||||
|
for G in GruppenListe:
|
||||||
|
nn = self._nachname( G )
|
||||||
|
if nn is not None:
|
||||||
|
familien[nn].append( G )
|
||||||
|
else:
|
||||||
|
vereine.append( G )
|
||||||
|
GidZuFarbe = {}
|
||||||
|
# 2. Familien: jeder Nachname kommt (alphabetisch, abwechselnd) in einen
|
||||||
|
# Farbbereich - Blau->Gruen ODER Gelb->Orange. Innerhalb eines
|
||||||
|
# Bereichs werden ALLE zugehoerigen Familiengruppen ueber den Verlauf
|
||||||
|
# gespreizt, damit verschiedene Familien verschiedene Toene haben;
|
||||||
|
# Gruppen desselben Nachnamens bleiben benachbart (ein zusammen-
|
||||||
|
# haengendes Band). So laeuft z.B. eine mehrteilige Familie Brandt
|
||||||
|
# ueber benachbarte Gelb->Orange-Toene, waehrend Familie Peters einen
|
||||||
|
# anderen Blau->Gruen-Ton bekommt.
|
||||||
|
Nachnamen = sorted( familien )
|
||||||
|
Bereich = { nn: i % len(self.FamilienVerlaeufe)
|
||||||
|
for i, nn in enumerate(Nachnamen) }
|
||||||
|
GruppenImBereich = defaultdict(list)
|
||||||
|
for nn in Nachnamen:
|
||||||
|
for G in sorted( familien[nn], key=lambda g: g.Id ):
|
||||||
|
GruppenImBereich[ Bereich[nn] ].append( G )
|
||||||
|
for b, gruppen in GruppenImBereich.items():
|
||||||
|
start, ende = self.FamilienVerlaeufe[b]
|
||||||
|
for farbe, G in zip( _verlauf_liste(start, ende, len(gruppen)), gruppen ):
|
||||||
|
GidZuFarbe[G.Id] = farbe
|
||||||
|
# 3. Vereine: ein Verlauf (z.B. Violett -> Grau) ueber alle Vereine
|
||||||
|
vstart, vende = self.VereinVerlauf
|
||||||
|
for farbe, G in zip( _verlauf_liste(vstart, vende, len(vereine)),
|
||||||
|
sorted(vereine, key=lambda g: g.Id) ):
|
||||||
|
GidZuFarbe[G.Id] = farbe
|
||||||
|
# 4. VIP-Farbe: Startfarbe des VIP-Verlaufs (i.d.R. Rot)
|
||||||
|
return GidZuFarbe, self.VIPVerlauf[0]
|
||||||
@@ -11,11 +11,14 @@ __license__ = "Python"
|
|||||||
|
|
||||||
from itertools import chain
|
from itertools import chain
|
||||||
from random import *
|
from random import *
|
||||||
|
import ast
|
||||||
import configparser, os
|
import configparser, os
|
||||||
import copy
|
import copy
|
||||||
|
import hashlib
|
||||||
|
import html
|
||||||
import math
|
import math
|
||||||
|
from collections import defaultdict
|
||||||
from functools import total_ordering
|
from functools import total_ordering
|
||||||
from xml.dom import minidom
|
|
||||||
|
|
||||||
|
|
||||||
# Strukturklassen: Person, Gruppe, Tisch
|
# Strukturklassen: Person, Gruppe, Tisch
|
||||||
@@ -29,6 +32,16 @@ class Person:
|
|||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return ' Person %s: "%s %s %s"' % ( self.Id, self._Titel,
|
return ' Person %s: "%s %s %s"' % ( self.Id, self._Titel,
|
||||||
self._Vorname, self._Name)
|
self._Vorname, self._Name)
|
||||||
|
def __hash__(self):
|
||||||
|
# stabil ueber die (eindeutige, fortlaufende) Id hashen statt ueber
|
||||||
|
# die Objekt-Identitaet: sonst haengt die Iterations-/pop()-Reihenfolge
|
||||||
|
# der set() aus Person-Objekten (Gruppe._Personen) an der Speicher-
|
||||||
|
# adresse und variiert pro Prozesslauf - das machte selbst mit --seed
|
||||||
|
# den GA-Lauf nichtreproduzierbar. Integer-Ids sind zudem nicht von
|
||||||
|
# PYTHONHASHSEED betroffen, daher prozessstabil.
|
||||||
|
return hash( self.Id )
|
||||||
|
def __eq__(self, other):
|
||||||
|
return isinstance( other, Person ) and self.Id == other.Id
|
||||||
|
|
||||||
@total_ordering
|
@total_ordering
|
||||||
class Gruppe:
|
class Gruppe:
|
||||||
@@ -256,11 +269,14 @@ class Tische:
|
|||||||
config.read( os.path.expanduser(FileName) )
|
config.read( os.path.expanduser(FileName) )
|
||||||
for section in config.sections():
|
for section in config.sections():
|
||||||
Tid = int(section)
|
Tid = int(section)
|
||||||
Nummer = eval(config.get( section, 'Nummer' ))
|
# ast.literal_eval statt eval: tische.ini kann eine hochgeladene
|
||||||
nPl = eval(config.get( section, 'Plaetze' ))
|
# Fremddatei sein (Web-M1), da darf kein beliebiger Code laufen.
|
||||||
Koords = eval(config.get( section, 'Koordinaten' ))
|
# Erlaubt weiterhin Zahlen, Tupel und Listen wie zuvor.
|
||||||
Nachbarn = eval(config.get( section, 'Nachbarliste' ))
|
Nummer = ast.literal_eval(config.get( section, 'Nummer' ))
|
||||||
Hofid = eval(config.get( section, 'Hof' ))
|
nPl = ast.literal_eval(config.get( section, 'Plaetze' ))
|
||||||
|
Koords = ast.literal_eval(config.get( section, 'Koordinaten' ))
|
||||||
|
Nachbarn = ast.literal_eval(config.get( section, 'Nachbarliste' ))
|
||||||
|
Hofid = ast.literal_eval(config.get( section, 'Hof' ))
|
||||||
T = Tisch( Tid, Plaetze=nPl, Koordinaten=Koords, Nachbarliste=Nachbarn, Hof=Hofid, Nummer=Nummer )
|
T = Tisch( Tid, Plaetze=nPl, Koordinaten=Koords, Nachbarliste=Nachbarn, Hof=Hofid, Nummer=Nummer )
|
||||||
self.Tisch_dazu( T )
|
self.Tisch_dazu( T )
|
||||||
def vonId(self, SearchedId):
|
def vonId(self, SearchedId):
|
||||||
@@ -281,19 +297,21 @@ class Tische:
|
|||||||
class Plaetze:
|
class Plaetze:
|
||||||
"""Informationen ueber freie oder benachbarte Plaetze"""
|
"""Informationen ueber freie oder benachbarte Plaetze"""
|
||||||
def __init__(self, Tische):
|
def __init__(self, Tische):
|
||||||
# mache Listen mit den Tischen mit n Freien Plaetzen
|
# je Anzahl freier Plaetze ein Set von Tisch-Ids. defaultdict(set)
|
||||||
self.__TIDsNFreie = []
|
# erspart die manuelle Vorbelegung und liefert fuer noch nie
|
||||||
|
# gesehene Fuellstaende automatisch ein leeres Set.
|
||||||
|
self.__TIDsNFreie = defaultdict(set)
|
||||||
self.__Groesster = Tische.Groesster
|
self.__Groesster = Tische.Groesster
|
||||||
self.__Tische = Tische
|
self.__Tische = Tische
|
||||||
for i in range( self.__Groesster + 1 ):
|
|
||||||
self.__TIDsNFreie.append( set() )
|
|
||||||
for T in Tische.TischListe:
|
for T in Tische.TischListe:
|
||||||
n_freie = T.freiePlaetze()
|
n_freie = T.freiePlaetze()
|
||||||
self.__TIDsNFreie[n_freie].add(T.Id)
|
self.__TIDsNFreie[n_freie].add(T.Id)
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
result = "\n-- Tische mit n Freien Plaetzen:\n"
|
result = "\n-- Tische mit n Freien Plaetzen:\n"
|
||||||
for i in range(self.__Groesster+1):
|
for i in range(self.__Groesster+1):
|
||||||
result = result + " " +repr(i) + " :" + repr(self.__TIDsNFreie[i]) + "\n"
|
# .get statt [i], damit das Anzeigen keine leeren Eintraege
|
||||||
|
# ins defaultdict schreibt
|
||||||
|
result = result + " " +repr(i) + " :" + repr(self.__TIDsNFreie.get(i, set())) + "\n"
|
||||||
return result
|
return result
|
||||||
def IdsnFreie(self, n_freie):
|
def IdsnFreie(self, n_freie):
|
||||||
"""gibt ein Set mit allen Tischids zurueck, wo noch X freie Plaetze sind"""
|
"""gibt ein Set mit allen Tischids zurueck, wo noch X freie Plaetze sind"""
|
||||||
@@ -363,30 +381,49 @@ class Plaetze:
|
|||||||
# Strafliste. Was ist wie schlecht?
|
# Strafliste. Was ist wie schlecht?
|
||||||
class Strafliste:
|
class Strafliste:
|
||||||
"""enthaelt die Informationen zur Vergabe der Wertigkeit einer Sitzplatzverteilung"""
|
"""enthaelt die Informationen zur Vergabe der Wertigkeit einer Sitzplatzverteilung"""
|
||||||
def __init__(self, GruppenTrennen={}, NichtNachbar=-5, Allein=-20, TischWert={}):
|
def __init__(self, GruppenTrennen={}, NichtNachbar=-5, Allein=-20, TischWert={}, AbstandFaktor=0.0):
|
||||||
self.GruppenTrennen = GruppenTrennen
|
self.GruppenTrennen = GruppenTrennen
|
||||||
self.NichtNachbar = NichtNachbar
|
self.NichtNachbar = NichtNachbar
|
||||||
self.Allein = Allein
|
self.Allein = Allein
|
||||||
self.TischWert = TischWert
|
self.TischWert = TischWert
|
||||||
|
# Strafpunkte je normierter Abstandseinheit (0..100) zwischen
|
||||||
|
# getrennten Teilen einer Gruppe; 0 = Abstand wird nicht bestraft.
|
||||||
|
self.AbstandFaktor = AbstandFaktor
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
"""Drucke alle Bestrafungen auf der Konsole aus"""
|
"""Drucke alle Bestrafungen auf der Konsole aus"""
|
||||||
return ("+ Strafliste:\n"
|
return ("+ Strafliste:\n"
|
||||||
"Trennen von Gruppen (Groesse:Strafe): %s\n"
|
"Trennen von Gruppen (Groesse:Strafe): %s\n"
|
||||||
"Strafe kein Gruppenmitglied am Nachbartisch : %s\n"
|
"Strafe kein Gruppenmitglied am Nachbartisch : %s\n"
|
||||||
"Strafe fuer eine Person allein: %s"
|
"Strafe fuer eine Person allein: %s\n"
|
||||||
|
"Straffaktor je Abstandseinheit getrennter Gruppen: %s"
|
||||||
% ( self.GruppenTrennen,
|
% ( self.GruppenTrennen,
|
||||||
self.NichtNachbar,
|
self.NichtNachbar,
|
||||||
self.Allein) )
|
self.Allein,
|
||||||
def gibPunkte(self, Typ, Gruppengroesse=0, N_Teilungen=0, freiePlaetze=0):
|
self.AbstandFaktor) )
|
||||||
|
def gibPunkte(self, Typ, Gruppengroesse=0, N_Teilungen=0, freiePlaetze=0, Abstand=0.0):
|
||||||
if Typ == 'allein':
|
if Typ == 'allein':
|
||||||
return self.Allein
|
return self.Allein
|
||||||
elif Typ == 'nichtNachbar':
|
elif Typ == 'nichtNachbar':
|
||||||
return self.NichtNachbar
|
return self.NichtNachbar
|
||||||
|
elif Typ == 'Abstand':
|
||||||
|
# Abstand ist bereits auf 0..100 normiert (siehe bewerten());
|
||||||
|
# je groesser der Abstand, desto mehr Strafe.
|
||||||
|
return self.AbstandFaktor * Abstand
|
||||||
elif Typ == 'Tischbesetzung':
|
elif Typ == 'Tischbesetzung':
|
||||||
try:
|
# Strafe fuer freie Plaetze an einem (teil-)belegten Tisch. Gibt
|
||||||
|
# es keinen exakten Eintrag fuer 'freiePlaetze', wird auf den
|
||||||
|
# naechstkleineren konfigurierten Wert zurueckgegriffen, damit man
|
||||||
|
# nicht jede moegliche Platzzahl auflisten muss (z.B. deckt ein
|
||||||
|
# Eintrag fuer 4 auch 5..7 ab, bis der naechste Eintrag greift).
|
||||||
|
# Auch ein komplett leerer Tisch (freiePlaetze == Plaetze) wird
|
||||||
|
# bewertet - er trifft in der Regel den hoechsten konfigurierten
|
||||||
|
# Eintrag (z.B. 8 frei bei 8er-Tisch) oder dessen Fallback.
|
||||||
|
if freiePlaetze in self.TischWert:
|
||||||
return self.TischWert[freiePlaetze]
|
return self.TischWert[freiePlaetze]
|
||||||
except KeyError:
|
kleinere = [ k for k in self.TischWert if k < freiePlaetze ]
|
||||||
return 0
|
if kleinere:
|
||||||
|
return self.TischWert[ max(kleinere) ]
|
||||||
|
return 0
|
||||||
elif Typ == 'Trennung':
|
elif Typ == 'Trennung':
|
||||||
if (N_Teilungen == 0):
|
if (N_Teilungen == 0):
|
||||||
return 0
|
return 0
|
||||||
@@ -402,15 +439,45 @@ class Strafliste:
|
|||||||
return self.gibPunkte('Trennung',Gruppengroesse-1, N_Teilungen)
|
return self.gibPunkte('Trennung',Gruppengroesse-1, N_Teilungen)
|
||||||
else:
|
else:
|
||||||
raise IndexError("Bezeichner gibts nicht")
|
raise IndexError("Bezeichner gibts nicht")
|
||||||
def laden( self, FileName ):
|
def laden( self, FileName, Sektion='default' ):
|
||||||
print("-- Strafliste laden")
|
"""laedt ein Strafpunkte-Profil aus einer Sektion der strafen.cfg.
|
||||||
|
|
||||||
|
Jede Sektion ist ein vollstaendiges Bewertungs-'Vorgehen' mit allen
|
||||||
|
Angaben in einem gemeinsamen Namensraum. Der Aufrufer waehlt das
|
||||||
|
Profil ueber 'Sektion' (Vorgabe 'default'); so lassen sich mehrere
|
||||||
|
Bewertungsstrategien in derselben Datei pflegen. Die Trennungs-
|
||||||
|
Straffen stehen unter den Schluesseln 'Anzahl_Trennungen_N'."""
|
||||||
|
print("-- Strafliste laden (Profil '%s')" % Sektion)
|
||||||
config = configparser.ConfigParser()
|
config = configparser.ConfigParser()
|
||||||
config.read( os.path.expanduser(FileName) )
|
config.read( os.path.expanduser(FileName) )
|
||||||
self.NichtNachbar = eval(config.get( 'Globals', 'NichtNachbar' ))
|
if not config.has_section( Sektion ):
|
||||||
self.Allein = eval(config.get( 'Globals', 'Allein' ))
|
raise ValueError(
|
||||||
self.TischWert = eval( config.get( 'Globals', 'TischWertigkeiten' ) )
|
"Strafprofil '%s' nicht in %s gefunden (vorhanden: %s)"
|
||||||
for (k,v) in config.items( 'Trennung' ):
|
% ( Sektion, FileName, ', '.join(config.sections()) or '-' ) )
|
||||||
self.GruppenTrennen[int(k)] = eval(v)
|
# ast.literal_eval statt eval: die Werte sind reine Literale
|
||||||
|
# (Zahlen und Dicts wie {2:-10}), also kein Code noetig.
|
||||||
|
self.NichtNachbar = ast.literal_eval(config.get( Sektion, 'NichtNachbar' ))
|
||||||
|
self.Allein = ast.literal_eval(config.get( Sektion, 'Allein' ))
|
||||||
|
# TischWertigkeiten ist optional; fehlt der Schluessel, werden freie
|
||||||
|
# Plaetze gar nicht bestraft (leeres Dict -> gibPunkte('Tischbesetzung')
|
||||||
|
# gibt 0), wodurch mehr Teilbelegungen moeglich sind.
|
||||||
|
if config.has_option( Sektion, 'TischWertigkeiten' ):
|
||||||
|
self.TischWert = ast.literal_eval( config.get( Sektion, 'TischWertigkeiten' ) )
|
||||||
|
else:
|
||||||
|
self.TischWert = {}
|
||||||
|
# AbstandFaktor ist optional; fehlt er, wird der Abstand getrennter
|
||||||
|
# Gruppen nicht bestraft (Faktor 0).
|
||||||
|
if config.has_option( Sektion, 'AbstandFaktor' ):
|
||||||
|
self.AbstandFaktor = ast.literal_eval(config.get( Sektion, 'AbstandFaktor' ))
|
||||||
|
# Trennungs-Straffen: Schluessel 'Anzahl_Trennungen_N' -> N Trennungen.
|
||||||
|
# frisches Dict, damit nicht der (mutable) Konstruktor-Default geteilt
|
||||||
|
# wird und Reste eines frueheren laden() bleiben.
|
||||||
|
self.GruppenTrennen = {}
|
||||||
|
for (k, v) in config.items( Sektion ):
|
||||||
|
# configparser liefert Schluessel klein geschrieben
|
||||||
|
if k.startswith( 'anzahl_trennungen_' ):
|
||||||
|
N = int( k.rsplit( '_', 1 )[-1] )
|
||||||
|
self.GruppenTrennen[N] = ast.literal_eval(v)
|
||||||
|
|
||||||
|
|
||||||
# Sitzplatzverteilung, bestehend aus den Einzelelementen
|
# Sitzplatzverteilung, bestehend aus den Einzelelementen
|
||||||
@@ -540,7 +607,8 @@ class Sitzplatzverteilung:
|
|||||||
'#42d4f4', '#f032e6', '#bfef45', '#fabed4', '#469990',
|
'#42d4f4', '#f032e6', '#bfef45', '#fabed4', '#469990',
|
||||||
'#dcbeff', '#9a6324', '#800000', '#aaffc3', '#000075' ]
|
'#dcbeff', '#9a6324', '#800000', '#aaffc3', '#000075' ]
|
||||||
|
|
||||||
def alsSVG(self, OutputSVG, PersonenRadius=12, Puffer=10):
|
def alsSVG(self, OutputSVG, PersonenRadius=12, Puffer=10, Verbindungen=True,
|
||||||
|
GruppenNamen=None, Farbschema=None):
|
||||||
"""Zeichnet die Sitzplatzverteilung als SVG:
|
"""Zeichnet die Sitzplatzverteilung als SVG:
|
||||||
|
|
||||||
Tische werden als weisse Kreise dargestellt, Personen als
|
Tische werden als weisse Kreise dargestellt, Personen als
|
||||||
@@ -548,7 +616,28 @@ class Sitzplatzverteilung:
|
|||||||
Das Koordinatenraster der Tische wird so skaliert, dass alle
|
Das Koordinatenraster der Tische wird so skaliert, dass alle
|
||||||
Personenkreise in ihrem Tischkreis Platz haben und sich die
|
Personenkreise in ihrem Tischkreis Platz haben und sich die
|
||||||
Tischkreise untereinander nicht ueberschneiden.
|
Tischkreise untereinander nicht ueberschneiden.
|
||||||
|
|
||||||
|
Ist Verbindungen=True (Vorgabe), wird jede ueber mehrere Tische
|
||||||
|
getrennte Gruppe zusaetzlich mit einer Linie in ihrer Gruppenfarbe
|
||||||
|
verbunden, so dass die Zusammengehoerigkeit sichtbar bleibt.
|
||||||
|
|
||||||
|
Jeder Personenkreis bekommt ein <title>-Kind (nativer Browser-
|
||||||
|
Tooltip beim Hover: "Vorname Nachname — Gruppe") sowie die Attribute
|
||||||
|
class="person" und data-gruppe/data-gid, damit eine einbettende
|
||||||
|
Seite darauf ein Hover-/Kasten-Verhalten aufsetzen kann. Optional
|
||||||
|
liefert GruppenNamen ({Gid: Anzeigename}) die lesbaren Gruppennamen;
|
||||||
|
fehlt es, wird "Gruppe <Id>" verwendet.
|
||||||
"""
|
"""
|
||||||
|
GruppenNamen = GruppenNamen or {}
|
||||||
|
|
||||||
|
def GruppenName(G):
|
||||||
|
if G is None:
|
||||||
|
return 'fixiert'
|
||||||
|
return GruppenNamen.get( G.Id, 'Gruppe %s' % G.Id )
|
||||||
|
|
||||||
|
def PersonName(P):
|
||||||
|
Teile = [ t for t in (P._Titel, P._Vorname, P._Name) if t ]
|
||||||
|
return ' '.join( Teile )
|
||||||
# Tischradius je Tisch berechnen: gross genug, damit alle
|
# Tischradius je Tisch berechnen: gross genug, damit alle
|
||||||
# Personenkreise (auf einem inneren Kreis gleichmaessig verteilt)
|
# Personenkreise (auf einem inneren Kreis gleichmaessig verteilt)
|
||||||
# nebeneinander Platz haben, ohne sich zu beruehren. Der Faktor
|
# nebeneinander Platz haben, ohne sich zu beruehren. Der Faktor
|
||||||
@@ -596,14 +685,48 @@ class Sitzplatzverteilung:
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
GidZuFarbe = {}
|
# Feste Gruppenfarben: einmal fuer die vollstaendige Gruppenliste (nach
|
||||||
|
# Gruppen-Id) vergeben - NICHT lazy nach der Sitz-Reihenfolge. Da alle
|
||||||
|
# Varianten dieselbe Gruppenmenge mit denselben Ids teilen, hat so jede
|
||||||
|
# Gruppe in jeder Variante (und ueber Laeufe hinweg) dieselbe Farbe.
|
||||||
|
# Mit Farbschema (aus farben.cfg) kommen die Farben von dort (z.B. nach
|
||||||
|
# Familie/Verein/VIP getrennt); ohne dient die eingebaute Palette als
|
||||||
|
# Rueckfall (zyklisch je Gruppe).
|
||||||
|
if Farbschema is not None:
|
||||||
|
GidZuFarbe, VIPFarbe = Farbschema.farben( self.Gruppen )
|
||||||
|
else:
|
||||||
|
GidZuFarbe = {}
|
||||||
|
for Index, G in enumerate( sorted( self.Gruppen, key=lambda g: g.Id ) ):
|
||||||
|
GidZuFarbe[G.Id] = self.SVGGruppenFarben[
|
||||||
|
Index % len(self.SVGGruppenFarben) ]
|
||||||
|
VIPFarbe = '#888888'
|
||||||
def FarbeVonGruppe(G):
|
def FarbeVonGruppe(G):
|
||||||
if G is None:
|
if G is None:
|
||||||
return '#888888'
|
return VIPFarbe # VIP / feste Platzierung (ohne GA-Gruppe)
|
||||||
if G.Id not in GidZuFarbe:
|
return GidZuFarbe.get( G.Id, VIPFarbe )
|
||||||
Index = len(GidZuFarbe) % len(self.SVGGruppenFarben)
|
|
||||||
GidZuFarbe[G.Id] = self.SVGGruppenFarben[Index]
|
# Fuer jede Gruppe pro Tisch den Mittelpunkt (Zentroid) ihrer
|
||||||
return GidZuFarbe[G.Id]
|
# an diesem Tisch sitzenden Personenkreise sammeln (fuer die
|
||||||
|
# Verbindungslinien getrennter Gruppen).
|
||||||
|
GidZuTischZentroiden = {}
|
||||||
|
for T in self.Tische:
|
||||||
|
Mx, My = TischMitte(T)
|
||||||
|
Plaetze = list(T)
|
||||||
|
n = len(Plaetze)
|
||||||
|
SitzRadius = SitzRadiusVon( T.Plaetze )
|
||||||
|
GidZuSummen = {}
|
||||||
|
for i, P in enumerate(Plaetze):
|
||||||
|
Winkel = 2 * math.pi * i / max(n, 1) - math.pi / 2
|
||||||
|
Px = Mx + SitzRadius * math.cos(Winkel)
|
||||||
|
Py = My + SitzRadius * math.sin(Winkel)
|
||||||
|
G = GruppeVonPerson(P)
|
||||||
|
if G is None:
|
||||||
|
continue
|
||||||
|
sx, sy, cnt = GidZuSummen.get( G.Id, (0.0, 0.0, 0) )
|
||||||
|
GidZuSummen[G.Id] = (sx + Px, sy + Py, cnt + 1)
|
||||||
|
for Gid, (sx, sy, cnt) in GidZuSummen.items():
|
||||||
|
GidZuTischZentroiden.setdefault( Gid, [] ).append(
|
||||||
|
(sx / cnt, sy / cnt) )
|
||||||
|
|
||||||
Teile = []
|
Teile = []
|
||||||
Teile.append( '<?xml version="1.0" encoding="UTF-8"?>\n' )
|
Teile.append( '<?xml version="1.0" encoding="UTF-8"?>\n' )
|
||||||
@@ -612,16 +735,48 @@ class Sitzplatzverteilung:
|
|||||||
'viewBox="0 0 %g %g">\n' % (Breite, Hoehe, Breite, Hoehe) )
|
'viewBox="0 0 %g %g">\n' % (Breite, Hoehe, Breite, Hoehe) )
|
||||||
Teile.append( '<rect width="100%" height="100%" fill="white"/>\n' )
|
Teile.append( '<rect width="100%" height="100%" fill="white"/>\n' )
|
||||||
|
|
||||||
|
# Getrennte Gruppen (an mehr als einem Tisch vertreten) mit einer
|
||||||
|
# Linie in ihrer Gruppenfarbe verbinden, damit die Zusammengehoerigkeit
|
||||||
|
# sichtbar bleibt. Die Linie laeuft durch die Tisch-Zentroiden der
|
||||||
|
# Gruppe (Mittelpunkte ihrer Personenkreise je Tisch); bei mehr als
|
||||||
|
# zwei Tischen als durchgehender Streckenzug entlang der laengsten
|
||||||
|
# Achse. Die Linienbreite entspricht dem halben Sitzdurchmesser
|
||||||
|
# (= Sitzradius = PersonenRadius). Vor den Tischen gezeichnet, damit
|
||||||
|
# sie darunter liegt. Nur wenn Verbindungen aktiv sind.
|
||||||
|
LinienBreite = PersonenRadius
|
||||||
|
for Gid, Zentroiden in ( GidZuTischZentroiden.items() if Verbindungen
|
||||||
|
else [] ):
|
||||||
|
if len(Zentroiden) < 2:
|
||||||
|
continue
|
||||||
|
# Zentroiden entlang der am weitesten auseinanderliegenden Achse
|
||||||
|
# ordnen, damit der Streckenzug sie ohne Ueberkreuzungen durchlaeuft
|
||||||
|
F1, F2 = Zentroiden[0], Zentroiden[1]
|
||||||
|
MaxDist2 = -1.0
|
||||||
|
for i in range(len(Zentroiden)):
|
||||||
|
for j in range(i + 1, len(Zentroiden)):
|
||||||
|
ax, ay = Zentroiden[i]
|
||||||
|
bx, by = Zentroiden[j]
|
||||||
|
d2 = (ax - bx) ** 2 + (ay - by) ** 2
|
||||||
|
if d2 > MaxDist2:
|
||||||
|
MaxDist2 = d2
|
||||||
|
F1, F2 = Zentroiden[i], Zentroiden[j]
|
||||||
|
Dx, Dy = F2[0] - F1[0], F2[1] - F1[1]
|
||||||
|
Geordnet = sorted( Zentroiden,
|
||||||
|
key=lambda P: (P[0] - F1[0]) * Dx + (P[1] - F1[1]) * Dy )
|
||||||
|
Punkte = ' '.join( '%g,%g' % (px, py) for (px, py) in Geordnet )
|
||||||
|
Farbe = FarbeVonGruppe( self.Gruppen.vonId(Gid) )
|
||||||
|
Teile.append(
|
||||||
|
'<polyline points="%s" fill="none" stroke="%s" '
|
||||||
|
'stroke-width="%g" stroke-linecap="round" '
|
||||||
|
'stroke-linejoin="round" stroke-opacity="0.5"/>\n'
|
||||||
|
% (Punkte, Farbe, LinienBreite) )
|
||||||
|
|
||||||
for T in self.Tische:
|
for T in self.Tische:
|
||||||
Mx, My = TischMitte(T)
|
Mx, My = TischMitte(T)
|
||||||
TR = TidZuRadius[T.Id]
|
TR = TidZuRadius[T.Id]
|
||||||
Teile.append(
|
Teile.append(
|
||||||
'<circle cx="%g" cy="%g" r="%g" fill="white" '
|
'<circle cx="%g" cy="%g" r="%g" fill="white" '
|
||||||
'stroke="black" stroke-width="1.5"/>\n' % (Mx, My, TR) )
|
'stroke="black" stroke-width="1.5"/>\n' % (Mx, My, TR) )
|
||||||
Teile.append(
|
|
||||||
'<text x="%g" y="%g" text-anchor="middle" '
|
|
||||||
'font-size="10" fill="black">Tisch %s</text>\n'
|
|
||||||
% (Mx, My - TR - 2, T.Id) )
|
|
||||||
|
|
||||||
Plaetze = list(T)
|
Plaetze = list(T)
|
||||||
n = len(Plaetze)
|
n = len(Plaetze)
|
||||||
@@ -630,15 +785,49 @@ class Sitzplatzverteilung:
|
|||||||
Winkel = 2 * math.pi * i / max(n, 1) - math.pi / 2
|
Winkel = 2 * math.pi * i / max(n, 1) - math.pi / 2
|
||||||
Px = Mx + SitzRadius * math.cos(Winkel)
|
Px = Mx + SitzRadius * math.cos(Winkel)
|
||||||
Py = My + SitzRadius * math.sin(Winkel)
|
Py = My + SitzRadius * math.sin(Winkel)
|
||||||
Farbe = FarbeVonGruppe( GruppeVonPerson(P) )
|
G = GruppeVonPerson(P)
|
||||||
|
Farbe = FarbeVonGruppe( G )
|
||||||
|
GName = GruppenName( G )
|
||||||
|
PName = PersonName( P )
|
||||||
|
# data-gid: -1 fuer VIPs/ohne Gruppe (keine self.Gruppen-Id)
|
||||||
|
Gid = G.Id if G is not None else -1
|
||||||
Teile.append(
|
Teile.append(
|
||||||
'<circle cx="%g" cy="%g" r="%g" fill="%s" '
|
'<circle class="person" data-gid="%s" data-gruppe="%s" '
|
||||||
'stroke="black" stroke-width="1"/>\n'
|
'data-name="%s" cx="%g" cy="%g" r="%g" fill="%s" '
|
||||||
% (Px, Py, PersonenRadius, Farbe) )
|
'stroke="black" stroke-width="1"><title>%s — %s</title>'
|
||||||
|
'</circle>\n'
|
||||||
|
% ( Gid, html.escape(GName, quote=True),
|
||||||
|
html.escape(PName, quote=True),
|
||||||
|
Px, Py, PersonenRadius, Farbe,
|
||||||
|
html.escape(PName), html.escape(GName) ) )
|
||||||
|
|
||||||
|
# Tischnummer und Platzzahl zentriert in die Tischmitte (nach den
|
||||||
|
# Personenkreisen gezeichnet, damit sie oben liegen; eine halb-
|
||||||
|
# transparente weisse Ellipse darunter haelt beide Zeilen auch
|
||||||
|
# ueber Personenkreisen lesbar, falls die Tischmitte belegt ist).
|
||||||
|
# Obere Zeile: Tischnummer (gross/fett), darunter die Platzzahl.
|
||||||
|
Teile.append(
|
||||||
|
'<ellipse cx="%g" cy="%g" rx="%g" ry="%g" fill="white" '
|
||||||
|
'fill-opacity="0.75"/>\n'
|
||||||
|
% (Mx, My, PersonenRadius, PersonenRadius * 1.3) )
|
||||||
|
Teile.append(
|
||||||
|
'<text x="%g" y="%g" text-anchor="middle" '
|
||||||
|
'dominant-baseline="central" font-size="%g" '
|
||||||
|
'font-weight="bold" fill="black">%s</text>\n'
|
||||||
|
% (Mx, My - PersonenRadius * 0.4, PersonenRadius * 1.1, T.Nummer) )
|
||||||
|
Teile.append(
|
||||||
|
'<text x="%g" y="%g" text-anchor="middle" '
|
||||||
|
'dominant-baseline="central" font-size="%g" '
|
||||||
|
'fill="#333">%d Pl.</text>\n'
|
||||||
|
% (Mx, My + PersonenRadius * 0.7, PersonenRadius * 0.62, T.Plaetze) )
|
||||||
|
|
||||||
Teile.append( '</svg>\n' )
|
Teile.append( '</svg>\n' )
|
||||||
|
|
||||||
fout = open( OutputSVG, 'w' )
|
# als UTF-8 schreiben (die SVG deklariert encoding="UTF-8"): Namen
|
||||||
|
# enthalten Umlaute und der Gedankenstrich im <title> ist non-ASCII;
|
||||||
|
# ohne dies wuerde die Windows-Standardkodierung (cp1252) die Datei
|
||||||
|
# ungueltig machen.
|
||||||
|
fout = open( OutputSVG, 'w', encoding='utf-8' )
|
||||||
fout.writelines( Teile )
|
fout.writelines( Teile )
|
||||||
fout.close()
|
fout.close()
|
||||||
|
|
||||||
@@ -650,7 +839,10 @@ class Sitzplatzverteilung:
|
|||||||
G = self.Gruppen.vonId(Gid)
|
G = self.Gruppen.vonId(Gid)
|
||||||
self.GruppeEntfernen(G)
|
self.GruppeEntfernen(G)
|
||||||
SchlechteGruppen.append(G)
|
SchlechteGruppen.append(G)
|
||||||
self.GruppenSetzen( SchlechteGruppen )
|
# beim Reseat die groessten zuerst, damit sie die durch das Entfernen
|
||||||
|
# frei gewordenen (ganzen) Tische bekommen und wieder zusammenkommen,
|
||||||
|
# statt erneut getrennt zu werden
|
||||||
|
self.GruppenSetzen( SchlechteGruppen, GrosseZuerst=True )
|
||||||
self.bewerten()
|
self.bewerten()
|
||||||
|
|
||||||
print("mutiert: ", self.value)
|
print("mutiert: ", self.value)
|
||||||
@@ -672,6 +864,14 @@ class Sitzplatzverteilung:
|
|||||||
|
|
||||||
#self.GruppenWertAdd( Gruppe, self.Strafen.gibPunkte( 'nichtNachbar') )
|
#self.GruppenWertAdd( Gruppe, self.Strafen.gibPunkte( 'nichtNachbar') )
|
||||||
|
|
||||||
|
# Bezugsgroesse fuer den Abstand getrennter Gruppen: maximale
|
||||||
|
# Ausdehnung der Tischanordnung (groessere von Breite/Laenge im
|
||||||
|
# Koordinatenraster). Ein Abstand von dieser Groesse entspricht dem
|
||||||
|
# normierten Wert 100 (Gruppenteile an gegenueberliegenden Enden).
|
||||||
|
Xs = [ T.X_Koordinate for T in self.Tische ]
|
||||||
|
Ys = [ T.Y_Koordinate for T in self.Tische ]
|
||||||
|
MaxAusdehnung = max( max(Xs) - min(Xs), max(Ys) - min(Ys) ) if Xs else 0
|
||||||
|
|
||||||
# schauen wie oft eine Gruppe getrennt wurde
|
# schauen wie oft eine Gruppe getrennt wurde
|
||||||
for G in self.Gruppen:
|
for G in self.Gruppen:
|
||||||
NTeilungen = self.GruppenTeilungGet(G)
|
NTeilungen = self.GruppenTeilungGet(G)
|
||||||
@@ -679,6 +879,23 @@ class Sitzplatzverteilung:
|
|||||||
self.GruppenWertSet( G, Strafpunkte )
|
self.GruppenWertSet( G, Strafpunkte )
|
||||||
self.GesamtWertAdd( Strafpunkte )
|
self.GesamtWertAdd( Strafpunkte )
|
||||||
|
|
||||||
|
# Bei getrennten Gruppen zusaetzlich den raeumlichen Abstand
|
||||||
|
# zwischen den belegten Tischen bestrafen: groesser = schlechter.
|
||||||
|
if NTeilungen >= 1 and MaxAusdehnung > 0:
|
||||||
|
Tische = [ self.Tische.vonId(Tid) for Tid in self.Gid_Tid[G.Id] ]
|
||||||
|
MaxDist = 0.0
|
||||||
|
for i in range(len(Tische)):
|
||||||
|
for j in range(i + 1, len(Tische)):
|
||||||
|
dx = Tische[i].X_Koordinate - Tische[j].X_Koordinate
|
||||||
|
dy = Tische[i].Y_Koordinate - Tische[j].Y_Koordinate
|
||||||
|
d = math.sqrt( dx * dx + dy * dy )
|
||||||
|
if d > MaxDist:
|
||||||
|
MaxDist = d
|
||||||
|
Abstand = MaxDist / MaxAusdehnung * 100
|
||||||
|
AbstandStrafe = self.Strafen.gibPunkte( 'Abstand', Abstand=Abstand )
|
||||||
|
self.GruppenWertAdd( G, AbstandStrafe )
|
||||||
|
self.GesamtWertAdd( AbstandStrafe )
|
||||||
|
|
||||||
# schauen ob Leute an einem Tisch allein sind
|
# schauen ob Leute an einem Tisch allein sind
|
||||||
Strafpunkte = self.Strafen.gibPunkte( 'allein' )
|
Strafpunkte = self.Strafen.gibPunkte( 'allein' )
|
||||||
for T in self.Tische:
|
for T in self.Tische:
|
||||||
@@ -707,8 +924,15 @@ class Sitzplatzverteilung:
|
|||||||
self.PersonSetzen( neuePerson, Tisch )
|
self.PersonSetzen( neuePerson, Tisch )
|
||||||
|
|
||||||
# Gruppenspezifische Funktionen
|
# Gruppenspezifische Funktionen
|
||||||
def GruppenSetzen(self, Gruppen ):
|
def GruppenSetzen(self, Gruppen, GrosseZuerst=False ):
|
||||||
"""setzt mal die grossen mal die kleinen Gruppen auf beliebige Plaetze"""
|
"""setzt Gruppen auf freie Plaetze.
|
||||||
|
|
||||||
|
GrosseZuerst=False (Erstbelegung): mal die grossen, mal die kleinen
|
||||||
|
zuerst (Zufall) - erzeugt Vielfalt in der Startpopulation.
|
||||||
|
GrosseZuerst=True (Mutation): konsequent die groesste Gruppe zuerst,
|
||||||
|
damit sie einen noch komplett freien Tisch bekommt und nicht getrennt
|
||||||
|
werden muss, weil kleine Gruppen die freien Tische schon anbrechen.
|
||||||
|
"""
|
||||||
# Mache Liste der Gruppen, der Groesse nach sortiert
|
# Mache Liste der Gruppen, der Groesse nach sortiert
|
||||||
Gruppenliste = []
|
Gruppenliste = []
|
||||||
for G in Gruppen:
|
for G in Gruppen:
|
||||||
@@ -716,11 +940,18 @@ class Sitzplatzverteilung:
|
|||||||
|
|
||||||
# uns setzte sie auf freie Plaetze
|
# uns setzte sie auf freie Plaetze
|
||||||
while len(Gruppenliste) > 0:
|
while len(Gruppenliste) > 0:
|
||||||
wahl = choice(['grosse', 'kleine'])
|
if GrosseZuerst:
|
||||||
if wahl == 'grosse':
|
# groesste zuerst: sie beanspruchen die noch komplett freien
|
||||||
G = Gruppenliste.pop(0)
|
# Tische, bevor kleine Gruppen diese teilbelegen (sonst muessen
|
||||||
|
# grosse Gruppen mangels ganzem Tisch getrennt werden)
|
||||||
|
G = max( Gruppenliste, key=lambda g: g.Anzahl() )
|
||||||
|
Gruppenliste.remove(G)
|
||||||
else:
|
else:
|
||||||
G = Gruppenliste.pop(-1)
|
wahl = choice(['grosse', 'kleine'])
|
||||||
|
if wahl == 'grosse':
|
||||||
|
G = Gruppenliste.pop(0)
|
||||||
|
else:
|
||||||
|
G = Gruppenliste.pop(-1)
|
||||||
self.GruppeSetzen(G)
|
self.GruppeSetzen(G)
|
||||||
def GruppeSetzen(self, Gruppe, Tisch=None ):
|
def GruppeSetzen(self, Gruppe, Tisch=None ):
|
||||||
"""setzt eine Gruppe irgendwohin wo Platz ist
|
"""setzt eine Gruppe irgendwohin wo Platz ist
|
||||||
@@ -868,7 +1099,12 @@ class Sitzplatzverteilung:
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
Anzahl_von_Gid[G.Id] = 1
|
Anzahl_von_Gid[G.Id] = 1
|
||||||
for Gid, Anzahl in Anzahl_von_Gid.items():
|
for Gid, Anzahl in Anzahl_von_Gid.items():
|
||||||
if Anzahl == 1:
|
# 'Allein' meint: eine Person ist von ihrer (mehrkoepfigen) Gruppe
|
||||||
|
# getrennt und sitzt ohne Gruppenmitglied am Tisch. Eine Gruppe der
|
||||||
|
# Groesse 1 (alleinreisender Gast) hat kein Gruppenmitglied, das
|
||||||
|
# fehlen koennte - sie ist nie "allein" in diesem Sinne und wird
|
||||||
|
# daher nicht bestraft (sie darf mit anderen am Tisch sitzen).
|
||||||
|
if Anzahl == 1 and self.Gruppen.vonId(Gid).Anzahl() > 1:
|
||||||
Gids.append(Gid)
|
Gids.append(Gid)
|
||||||
return Gids
|
return Gids
|
||||||
|
|
||||||
@@ -887,6 +1123,44 @@ class Sitzplatzverteilung:
|
|||||||
return len( self.Gid_Tid[Gruppe.Id] ) - 1
|
return len( self.Gid_Tid[Gruppe.Id] ) - 1
|
||||||
except KeyError:
|
except KeyError:
|
||||||
return 0
|
return 0
|
||||||
|
def getGruppenId(self):
|
||||||
|
"""eindeutige Id der Loesung auf GRUPPEN-Ebene (personen-unabhaengig).
|
||||||
|
|
||||||
|
Signatur: je Tisch, welche Gruppen mit wie vielen Mitgliedern dort
|
||||||
|
sitzen. Zwei Loesungen mit identischer Gruppen-Verteilung bekommen
|
||||||
|
dieselbe Id - egal welche konkreten Personen die geteilten Plaetze
|
||||||
|
einnehmen (die Teilung einer 5er-Gruppe auf die Tische 3 und 4 ist
|
||||||
|
dieselbe Sitzordnung, gleich welche Personen wohin kommen). Da die
|
||||||
|
Bewertung (Strafliste) nur von den Gruppen-Anzahlen je Tisch, den
|
||||||
|
Nachbarschaften und der Auslastung abhaengt, haben Loesungen mit
|
||||||
|
gleicher getGruppenId auch dieselbe Wertigkeit. Diese Id dient dem
|
||||||
|
Vergleich der Loesungen (Dedup), damit dieselbe Sitzordnung nicht
|
||||||
|
mehrfach als eigene Loesung gehalten und bewertet wird."""
|
||||||
|
Teile = []
|
||||||
|
for T in sorted( self.Tische, key=lambda t: t.Id ):
|
||||||
|
Zaehler = {}
|
||||||
|
for P in T:
|
||||||
|
try:
|
||||||
|
Gid = self.Gruppen.GruppeVonPid( P.Id ).Id
|
||||||
|
except KeyError:
|
||||||
|
Gid = -1 # VIP / feste Platzierung (ohne GA-Gruppe)
|
||||||
|
Zaehler[Gid] = Zaehler.get( Gid, 0 ) + 1
|
||||||
|
Teile.append( (T.Id, tuple(sorted( Zaehler.items() ))) )
|
||||||
|
return hashlib.sha1( repr(Teile).encode('utf-8') ).hexdigest()[:16]
|
||||||
|
def getPersonenId(self):
|
||||||
|
"""eindeutige Id der Loesung auf PERSONEN-Ebene.
|
||||||
|
|
||||||
|
Signatur: je Tisch die alphabetisch sortierten Personennamen.
|
||||||
|
Identifiziert WIRKLICH identische Sitzbelegungen (dieselben Personen
|
||||||
|
an denselben Tischen) - feiner als getGruppenId, das nur die Gruppen-
|
||||||
|
Verteilung vergleicht."""
|
||||||
|
Teile = []
|
||||||
|
for T in sorted( self.Tische, key=lambda t: t.Id ):
|
||||||
|
Namen = sorted(
|
||||||
|
' '.join( s for s in (P._Titel, P._Vorname, P._Name) if s )
|
||||||
|
for P in T )
|
||||||
|
Teile.append( (T.Id, tuple(Namen)) )
|
||||||
|
return hashlib.sha1( repr(Teile).encode('utf-8') ).hexdigest()[:16]
|
||||||
def VIPsSetzen(self, VIPListe, VIPs, Tische ):
|
def VIPsSetzen(self, VIPListe, VIPs, Tische ):
|
||||||
"""setze die VIPs auf Ihre Plaetze"""
|
"""setze die VIPs auf Ihre Plaetze"""
|
||||||
#print " VIPsSetzen:"
|
#print " VIPsSetzen:"
|
||||||
@@ -897,11 +1171,19 @@ class Sitzplatzverteilung:
|
|||||||
Tisch = Tische.vonId(TischId)
|
Tisch = Tische.vonId(TischId)
|
||||||
self.PersonSetzen( Person, Tisch )
|
self.PersonSetzen( Person, Tisch )
|
||||||
def TopX(self, Liste, Anzahl=-1 ):
|
def TopX(self, Liste, Anzahl=-1 ):
|
||||||
"""gibt eine Liste mit X Ids zurueck, die die schlechtesten Wertungen haben"""
|
"""gibt eine Liste mit X Ids zurueck, die die schlechtesten Wertungen haben
|
||||||
|
|
||||||
|
Achtung: Dies ist bewusst *nicht* heapq.nsmallest. Der laufende
|
||||||
|
Schwellwert Min sinkt monoton mit, so dass nur Ids aufgenommen
|
||||||
|
werden, die waehrend der Iteration einen neuen Tiefpunkt erreichen
|
||||||
|
oder gleichziehen. Das Ergebnis haengt an der Iterationsreihenfolge
|
||||||
|
und praegt das Mutationsverhalten des GA (mutieren() ->
|
||||||
|
SchlechteGruppenTopX). Eine Umstellung auf heapq wuerde die
|
||||||
|
Loesungsfindung veraendern und ist daher bewusst unterlassen.
|
||||||
|
"""
|
||||||
Min = 0
|
Min = 0
|
||||||
RListe=[]
|
RListe=[]
|
||||||
Wertigkeit=[]
|
Wertigkeit=[]
|
||||||
# TODO filter verwenden
|
|
||||||
for Id, Wert in Liste.items():
|
for Id, Wert in Liste.items():
|
||||||
if Wert <= Min:
|
if Wert <= Min:
|
||||||
RListe.append(Id)
|
RListe.append(Id)
|
||||||
@@ -911,92 +1193,112 @@ class Sitzplatzverteilung:
|
|||||||
|
|
||||||
|
|
||||||
# Sitzplatzverteilung, bestehend aus den Einzelelementen
|
# Sitzplatzverteilung, bestehend aus den Einzelelementen
|
||||||
class XMLConfig:
|
class JSONConfig:
|
||||||
"""aus Xml file alles einlesen"""
|
"""liest die Gaesteliste aus einer bestellung.json ein
|
||||||
def getText(self, nodelist):
|
(Nachfolger des frueheren XMLConfig; JSON hat die alte XML-Form
|
||||||
rc = ""
|
abgeloest, siehe doc/dateiformate.md).
|
||||||
for node in nodelist:
|
|
||||||
if node.nodeType == node.TEXT_NODE:
|
Erwartete Struktur:
|
||||||
rc = rc + node.data
|
{
|
||||||
return rc
|
"gruppen": [
|
||||||
def handlePersonNode( self, person ):
|
{
|
||||||
"""Personendaten erfassen"""
|
"name": "Familie Huber", # optional, nur Anzeige
|
||||||
info = {}
|
"tisch": 1, # optional -> VIP-Fixplatz
|
||||||
try:
|
"anzahl": 1, # optional -> Sammelbuchung
|
||||||
Titel = person.getElementsByTagName("Titel")[0]
|
"personen": [
|
||||||
info["Titel"] = self.getText(Titel.childNodes)
|
{"vorname": "Anna", "nachname": "Huber", "titel": ""}
|
||||||
except IndexError:
|
]
|
||||||
info["Titel"] = ""
|
}
|
||||||
Vorname = person.getElementsByTagName("Vorname")[0]
|
]
|
||||||
Nachname = person.getElementsByTagName("Nachname")[0]
|
}
|
||||||
info["Vorname"] = self.getText(Vorname.childNodes)
|
|
||||||
info["Nachname"] = self.getText(Nachname.childNodes)
|
"tisch" macht die ganze Gruppe zu VIPs an diesem Tisch (laeuft
|
||||||
return info
|
nicht durch die GA-Platzierung). "anzahl" > 1 vervielfacht jede
|
||||||
def HandleBestellung(self, Bestellung):
|
Person der Gruppe in so viele identische Buchungen (anonyme
|
||||||
"""alle Bloecke in der XML Bestellung parsen"""
|
Sammelbuchung). "titel" ist optional.
|
||||||
PidListe = []
|
"""
|
||||||
VipHash = {}
|
def HandleBestellung(self, Daten):
|
||||||
|
"""die geladene JSON-Struktur in Personen/Gruppen/VIPs zerlegen
|
||||||
|
|
||||||
|
Rueckgabe: [ PN, GN, VIPGruppe, VipHash, GruppenNamen ]
|
||||||
|
(wie CSVConfig; das fruehere XMLConfig gab die ersten vier
|
||||||
|
Elemente zurueck - Aufrufer, die GruppenNamen nicht brauchen,
|
||||||
|
koennen es ignorieren.)
|
||||||
|
"""
|
||||||
|
if not isinstance( Daten, dict ) or 'gruppen' not in Daten:
|
||||||
|
raise ValueError("bestellung.json braucht ein Objekt mit dem "
|
||||||
|
"Schluessel 'gruppen'")
|
||||||
|
|
||||||
PN = Personen()
|
PN = Personen()
|
||||||
GN = Gruppen()
|
GN = Gruppen()
|
||||||
VIPGruppe = Gruppe( 0 )
|
VIPGruppe = Gruppe( 0 )
|
||||||
|
VipHash = {}
|
||||||
|
GruppenNamen = {}
|
||||||
|
|
||||||
print('-HandleBestellung')
|
|
||||||
AlleGruppenXML = Bestellung.getElementsByTagName("Gruppe")
|
|
||||||
PID = 0
|
PID = 0
|
||||||
GID = 0
|
GID = 0
|
||||||
for GruppeXML in AlleGruppenXML:
|
for Index, GruppeJSON in enumerate( Daten['gruppen'] ):
|
||||||
GID = GID + 1
|
if 'personen' not in GruppeJSON:
|
||||||
print('-- GID ' + repr(GID))
|
raise ValueError("Gruppe %d: 'personen' fehlt" % (Index + 1))
|
||||||
G = Gruppe( GID )
|
|
||||||
|
|
||||||
IsVip = False
|
IsVip = 'tisch' in GruppeJSON and GruppeJSON['tisch'] is not None
|
||||||
AnzahlReservierungen = 1
|
if IsVip:
|
||||||
for Node in GruppeXML.childNodes:
|
try:
|
||||||
if Node.nodeName == 'Tisch':
|
TischNr = int( GruppeJSON['tisch'] )
|
||||||
TischNr = self.getText(Node.childNodes)
|
except (TypeError, ValueError):
|
||||||
print('TischNr:', TischNr)
|
raise ValueError("Gruppe %d: 'tisch' ist keine "
|
||||||
IsVip = True
|
"Tischnummer" % (Index + 1))
|
||||||
if Node.nodeName == 'Anzahl':
|
|
||||||
AnzahlReservierungen = int(self.getText(Node.childNodes))
|
|
||||||
print('Anzahl der Reservierungen:', AnzahlReservierungen)
|
|
||||||
IsContingent = True
|
|
||||||
|
|
||||||
for Node in GruppeXML.childNodes:
|
try:
|
||||||
if Node.nodeName == 'Person':
|
AnzahlReservierungen = int( GruppeJSON.get( 'anzahl', 1 ) )
|
||||||
NRes = 0
|
except (TypeError, ValueError):
|
||||||
for i in range(int(AnzahlReservierungen)):
|
raise ValueError("Gruppe %d: 'anzahl' ist keine Zahl"
|
||||||
NRes = NRes + 1
|
% (Index + 1))
|
||||||
PID = PID + 1
|
if AnzahlReservierungen < 1:
|
||||||
print("PID =" + repr(PID))
|
raise ValueError("Gruppe %d: 'anzahl' muss >= 1 sein"
|
||||||
info = self.handlePersonNode( Node )
|
% (Index + 1))
|
||||||
|
|
||||||
|
# regulaere (nicht-VIP) Gruppen bekommen eine GID
|
||||||
|
if not IsVip:
|
||||||
|
GID = GID + 1
|
||||||
|
G = Gruppe( GID )
|
||||||
|
GruppenNamen[ GID ] = GruppeJSON.get( 'name', 'Gruppe %d' % GID )
|
||||||
|
|
||||||
|
for PersonJSON in GruppeJSON['personen']:
|
||||||
|
Vorname = str( PersonJSON.get( 'vorname', '' ) ).strip()
|
||||||
|
Nachname = str( PersonJSON.get( 'nachname', '' ) ).strip()
|
||||||
|
Titel = str( PersonJSON.get( 'titel', '' ) ).strip()
|
||||||
|
if Vorname == '' or Nachname == '':
|
||||||
|
raise ValueError("Gruppe %d: jede Person braucht Vorname "
|
||||||
|
"und Nachname" % (Index + 1))
|
||||||
|
for i in range( AnzahlReservierungen ):
|
||||||
|
PID = PID + 1
|
||||||
|
P = Person( PID, Vorname, Nachname, Titel )
|
||||||
|
if IsVip:
|
||||||
|
VipHash[ PID ] = TischNr
|
||||||
|
VIPGruppe.Person_dazu( P )
|
||||||
|
else:
|
||||||
|
PN.PersonAdd( P )
|
||||||
|
G.Person_dazu( P )
|
||||||
|
|
||||||
|
if not IsVip:
|
||||||
|
if G.Anzahl() > 0:
|
||||||
|
GN.Gruppe_dazu( G )
|
||||||
|
else:
|
||||||
|
# leere Gruppe wieder verwerfen
|
||||||
|
del GruppenNamen[ GID ]
|
||||||
|
GID = GID - 1
|
||||||
|
|
||||||
|
return [ PN, GN, VIPGruppe, VipHash, GruppenNamen ]
|
||||||
|
|
||||||
Vorname = info["Vorname"]
|
|
||||||
Nachname = info["Nachname"]
|
|
||||||
Titel = info["Titel"]
|
|
||||||
P = Person( PID, Vorname, Nachname, Titel)
|
|
||||||
if IsVip == True:
|
|
||||||
PidListe.append( int(PID) )
|
|
||||||
VipHash[ int(PID) ] = int(TischNr)
|
|
||||||
VIPGruppe.Person_dazu( P )
|
|
||||||
else:
|
|
||||||
PN.PersonAdd( P )
|
|
||||||
G.Person_dazu( P )
|
|
||||||
if (G.Anzahl() > 0) & (IsVip != True):
|
|
||||||
GN.Gruppe_dazu( G )
|
|
||||||
if IsVip == True:
|
|
||||||
GID = GID - 1
|
|
||||||
print(PN)
|
|
||||||
print(GN)
|
|
||||||
print(VIPGruppe)
|
|
||||||
print(VipHash)
|
|
||||||
print('==========')
|
|
||||||
return [ PN, GN, VIPGruppe, VipHash ]
|
|
||||||
def laden(self, Bestellung):
|
def laden(self, Bestellung):
|
||||||
"""lese alle Eingangsdaten aus einem XML File ein"""
|
"""lese alle Eingangsdaten aus einer JSON-Datei ein"""
|
||||||
fsock = open( Bestellung, 'r')
|
import json
|
||||||
xmlini = minidom.parse(fsock)
|
# utf-8-sig schluckt ein evtl. vorhandenes BOM
|
||||||
return self.HandleBestellung(xmlini)
|
fsock = open( Bestellung, 'r', encoding='utf-8-sig' )
|
||||||
|
Daten = json.load( fsock )
|
||||||
|
fsock.close()
|
||||||
|
return self.HandleBestellung( Daten )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,9 +6,37 @@ from random import *
|
|||||||
from itertools import chain
|
from itertools import chain
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
from functools import total_ordering
|
from functools import total_ordering
|
||||||
|
import ast
|
||||||
import configparser, os
|
import configparser, os
|
||||||
|
|
||||||
|
|
||||||
|
def _StringAusdruck(text):
|
||||||
|
"""wertet einen einfachen String-Ausdruck sicher aus.
|
||||||
|
|
||||||
|
zyklus.cfg nutzt kompakte Schreibweisen wie
|
||||||
|
'e,'+'s,z,m,j,z,'*3+'s'
|
||||||
|
also String-Literale, mit '+' verkettet und mit '*' vervielfacht.
|
||||||
|
ast.literal_eval kann das nicht (nur reine Literale), eval() waere
|
||||||
|
unsicher. Dieser Mini-Auswerter erlaubt ausschliesslich str-Literale,
|
||||||
|
ganze Zahlen sowie die Operatoren + und * - kein Funktionsaufruf,
|
||||||
|
keine Namen, kein beliebiger Code.
|
||||||
|
"""
|
||||||
|
knoten = ast.parse(text, mode='eval').body
|
||||||
|
|
||||||
|
def rechne(n):
|
||||||
|
if isinstance(n, ast.Constant) and isinstance(n.value, (str, int)):
|
||||||
|
return n.value
|
||||||
|
if isinstance(n, ast.BinOp) and isinstance(n.op, (ast.Add, ast.Mult)):
|
||||||
|
links, rechts = rechne(n.left), rechne(n.right)
|
||||||
|
return links + rechts if isinstance(n.op, ast.Add) else links * rechts
|
||||||
|
raise ValueError("unerlaubter Ausdruck in zyklus.cfg: %r" % text)
|
||||||
|
|
||||||
|
ergebnis = rechne(knoten)
|
||||||
|
if not isinstance(ergebnis, str):
|
||||||
|
raise ValueError("zyklus.cfg-Ausdruck ergibt keinen String: %r" % text)
|
||||||
|
return ergebnis
|
||||||
|
|
||||||
|
|
||||||
__author__ = "Michael Stangl"
|
__author__ = "Michael Stangl"
|
||||||
__version__ = "$Revision: $"
|
__version__ = "$Revision: $"
|
||||||
__date__ = "$Date: $"
|
__date__ = "$Date: $"
|
||||||
@@ -33,6 +61,15 @@ class Loesung:
|
|||||||
print(" lade Loesung " + repr(self.Id))
|
print(" lade Loesung " + repr(self.Id))
|
||||||
def speichern(self):
|
def speichern(self):
|
||||||
print(" speichere Loesung " + repr(self.Id))
|
print(" speichere Loesung " + repr(self.Id))
|
||||||
|
def getGruppenId(self):
|
||||||
|
"""Id fuer den Dedup-Vergleich (Basis: jede Loesung eigenstaendig).
|
||||||
|
Unterklassen ueberladen dies mit einer inhaltlichen Signatur, so
|
||||||
|
dass gleiche Loesungen dieselbe Id bekommen und nicht mehrfach
|
||||||
|
gehalten werden."""
|
||||||
|
return id(self)
|
||||||
|
def getPersonenId(self):
|
||||||
|
"""feinere Id fuer wirklich identische Loesungen (Basis: eigenstaendig)"""
|
||||||
|
return id(self)
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return ' L '+ repr(self.Id)
|
return ' L '+ repr(self.Id)
|
||||||
def __eq__(self,other):
|
def __eq__(self,other):
|
||||||
@@ -46,13 +83,30 @@ class Zyklus:
|
|||||||
wann sollen Objekte generiert, gekreuzt, mutiert und selektiert werden
|
wann sollen Objekte generiert, gekreuzt, mutiert und selektiert werden
|
||||||
wieviele sind davon jeweils betroffen
|
wieviele sind davon jeweils betroffen
|
||||||
"""
|
"""
|
||||||
|
# adaptive Vorgaben, falls das Profil kein eigenes Feld setzt
|
||||||
|
AdaptivDefaults = {
|
||||||
|
'Start': 40, # Groesse der Startpopulation (Anfangswert)
|
||||||
|
'MutationProLoesung': 2,# wie oft jede Loesung je Generation mutiert wird
|
||||||
|
'Schrumpfung': 0.85, # Faktor, um den die Population je Generation faellt
|
||||||
|
'MinPopulation': 5, # untere Schranke der Population
|
||||||
|
'MaxGenerationen': 50, # harte Obergrenze der Generationen
|
||||||
|
'Geduld': 3, # Generationen ohne Verbesserung bis zum Abbruch
|
||||||
|
'Schwelle': 1.0 } # als Verbesserung zaehlende Mindestdifferenz
|
||||||
|
|
||||||
def __init__(self, Name='default',
|
def __init__(self, Name='default',
|
||||||
Abfolge='e,m,s',
|
Abfolge='e,m,s',
|
||||||
Anzahl='10,10,10'):
|
Anzahl='10,10,10'):
|
||||||
self.Name = Name
|
self.Name = Name
|
||||||
self.Abfolge = Abfolge.split(',')
|
self.Abfolge = Abfolge.split(',')
|
||||||
self.Anzahl = Anzahl.split(',')
|
self.Anzahl = Anzahl.split(',')
|
||||||
|
# 'statisch' = klassische Abfolge/Anzahl abspielen;
|
||||||
|
# 'adaptiv' = Generationen-Schleife mit Abbruch bei Konvergenz.
|
||||||
|
self.Modus = 'statisch'
|
||||||
|
self.Adaptiv = {}
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
|
if self.Modus == 'adaptiv':
|
||||||
|
return( "Zyklus: %s (adaptiv)\n"
|
||||||
|
" Parameter: %s\n" % ( self.Name, self.Adaptiv ) )
|
||||||
return( "Zyklus: %s\n"
|
return( "Zyklus: %s\n"
|
||||||
" Zyklusabfolge: %s\n"
|
" Zyklusabfolge: %s\n"
|
||||||
" Anzahl : %s\n"
|
" Anzahl : %s\n"
|
||||||
@@ -65,11 +119,367 @@ class Zyklus:
|
|||||||
ZyklusPath= os.path.join( FileName )
|
ZyklusPath= os.path.join( FileName )
|
||||||
config.read( ZyklusPath )
|
config.read( ZyklusPath )
|
||||||
self.Name = ZyklusName
|
self.Name = ZyklusName
|
||||||
Abfolge = eval( config.get( ZyklusName, 'Abfolge' ))
|
# Adaptives Profil, sobald ein 'Start'-Feld vorhanden ist. Dann wird
|
||||||
Anzahl = eval( config.get( ZyklusName, 'Anzahl' ))
|
# die Aktionsabfolge nicht aus der Config gelesen, sondern von der
|
||||||
|
# Farm generationenweise erzeugt (mit Abbruch bei Konvergenz).
|
||||||
|
if config.has_option( ZyklusName, 'Start' ):
|
||||||
|
self.Modus = 'adaptiv'
|
||||||
|
self.Adaptiv = dict(self.AdaptivDefaults)
|
||||||
|
for Feld in self.AdaptivDefaults:
|
||||||
|
if config.has_option( ZyklusName, Feld ):
|
||||||
|
self.Adaptiv[Feld] = ast.literal_eval(
|
||||||
|
config.get( ZyklusName, Feld ) )
|
||||||
|
return
|
||||||
|
self.Modus = 'statisch'
|
||||||
|
Abfolge = _StringAusdruck( config.get( ZyklusName, 'Abfolge' ))
|
||||||
|
Anzahl = _StringAusdruck( config.get( ZyklusName, 'Anzahl' ))
|
||||||
self.Abfolge = Abfolge.split(',')
|
self.Abfolge = Abfolge.split(',')
|
||||||
self.Anzahl = Anzahl.split(',')
|
self.Anzahl = Anzahl.split(',')
|
||||||
pass
|
|
||||||
|
class Entwicklung:
|
||||||
|
"""Beobachtungsobjekt: zeichnet den Verlauf der Loesungsfindung auf.
|
||||||
|
|
||||||
|
Nach jeder Zyklus-Aktion wird ein Messpunkt erfasst (bester,
|
||||||
|
durchschnittlicher und schlechtester Wert im aktuellen Pool).
|
||||||
|
alsSVG() zeichnet daraus eine Verlaufsgrafik: Zeitachse (Aktions-
|
||||||
|
index) nach rechts, Wertigkeit auf der Y-Achse. Domaenen-agnostisch;
|
||||||
|
funktioniert mit jeder Loesung, die ein Attribut .value hat.
|
||||||
|
"""
|
||||||
|
# Buchstaben der Zyklus-Abfolge -> lesbare Namen fuer die Beschriftung
|
||||||
|
AktionsNamen = {
|
||||||
|
'e': 'erzeugen', 'm': 'mutieren', 's': 'selektieren',
|
||||||
|
'S': 'zufaellig', 'j': 'behalten', 'z': 'Generation' }
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
# je Messpunkt: (Schrittindex, Aktion, bester, schnitt, schlechtester, N)
|
||||||
|
self.Punkte = []
|
||||||
|
|
||||||
|
def erfassen(self, Aktion, Pool):
|
||||||
|
"""einen Messpunkt aus dem aktuellen Pool aufnehmen"""
|
||||||
|
if not Pool:
|
||||||
|
return
|
||||||
|
Werte = [ L.value for L in Pool ]
|
||||||
|
self.Punkte.append( (
|
||||||
|
len(self.Punkte),
|
||||||
|
Aktion,
|
||||||
|
max(Werte),
|
||||||
|
sum(Werte) / len(Werte),
|
||||||
|
min(Werte),
|
||||||
|
len(Werte) ) )
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
r = "-- Entwicklung (%d Messpunkte):\n" % len(self.Punkte)
|
||||||
|
for (i, Aktion, best, schnitt, schlecht, n) in self.Punkte:
|
||||||
|
r = r + (" %3d %-12s best=%s schnitt=%.1f schlecht=%s (N=%d)\n"
|
||||||
|
% (i, self.AktionsNamen.get(Aktion, Aktion),
|
||||||
|
best, schnitt, schlecht, n))
|
||||||
|
return r
|
||||||
|
|
||||||
|
def alsSVG(self, OutputSVG, Breite=900, Hoehe=650, Rand=60, PoolHoehe=150):
|
||||||
|
"""zeichnet den aufgezeichneten Verlauf als SVG-Liniendiagramm
|
||||||
|
|
||||||
|
Oberes Panel: Wertigkeit (beste/durchschnittliche/schlechteste
|
||||||
|
Loesung) ueber die Zyklus-Aktionen. Unteres Panel (PoolHoehe hoch):
|
||||||
|
Anzahl der erzeugten Verteilungen im Pool je Schritt, auf derselben
|
||||||
|
Zeitachse. Beide Panels teilen sich die X-Achse.
|
||||||
|
"""
|
||||||
|
if not self.Punkte:
|
||||||
|
raise ValueError("keine Messpunkte aufgezeichnet")
|
||||||
|
|
||||||
|
AlleWerte = []
|
||||||
|
for (_i, _a, best, schnitt, schlecht, _n) in self.Punkte:
|
||||||
|
AlleWerte.extend( (best, schnitt, schlecht) )
|
||||||
|
WMin, WMax = min(AlleWerte), max(AlleWerte)
|
||||||
|
if WMax == WMin:
|
||||||
|
WMax = WMin + 1 # flache Linie nicht auf den Rand kleben
|
||||||
|
|
||||||
|
# Pool-Groessen (N je Messpunkt, Index 5)
|
||||||
|
NMax = max( p[5] for p in self.Punkte )
|
||||||
|
if NMax == 0:
|
||||||
|
NMax = 1
|
||||||
|
|
||||||
|
N = len(self.Punkte)
|
||||||
|
PlotBreite = Breite - 2 * Rand
|
||||||
|
# Oberes Panel (Wertigkeit) reicht von Rand bis kurz vor das
|
||||||
|
# untere Panel; dazwischen ein kleiner Zwischenraum (Luecke).
|
||||||
|
Luecke = 50
|
||||||
|
OberUnten = Hoehe - Rand - PoolHoehe - Luecke # Unterkante oberes Panel
|
||||||
|
OberHoehe = OberUnten - Rand
|
||||||
|
UnterOben = OberUnten + Luecke # Oberkante unteres Panel
|
||||||
|
UnterUnten = Hoehe - Rand # Unterkante unteres Panel
|
||||||
|
|
||||||
|
def X(i):
|
||||||
|
if N == 1:
|
||||||
|
return Rand + PlotBreite / 2
|
||||||
|
return Rand + PlotBreite * i / (N - 1)
|
||||||
|
|
||||||
|
def Y(wert):
|
||||||
|
# hoher (besserer) Wert oben, niedriger unten
|
||||||
|
return Rand + OberHoehe * (WMax - wert) / (WMax - WMin)
|
||||||
|
|
||||||
|
def YPool(n):
|
||||||
|
# 0 an der Unterkante des unteren Panels, NMax an der Oberkante
|
||||||
|
return UnterUnten - (UnterUnten - UnterOben) * n / NMax
|
||||||
|
|
||||||
|
def Polyline(Index, Farbe, Beschriftung):
|
||||||
|
punkte = ' '.join( '%.1f,%.1f' % (X(i), Y(p[Index]))
|
||||||
|
for i, p in enumerate(self.Punkte) )
|
||||||
|
return ('<polyline points="%s" fill="none" stroke="%s" '
|
||||||
|
'stroke-width="2"/>\n' % (punkte, Farbe), Beschriftung, Farbe)
|
||||||
|
|
||||||
|
Teile = []
|
||||||
|
Teile.append( '<?xml version="1.0" encoding="UTF-8"?>\n' )
|
||||||
|
Teile.append(
|
||||||
|
'<svg xmlns="http://www.w3.org/2000/svg" width="%d" height="%d" '
|
||||||
|
'viewBox="0 0 %d %d" font-family="sans-serif">\n'
|
||||||
|
% (Breite, Hoehe, Breite, Hoehe) )
|
||||||
|
Teile.append( '<rect width="100%" height="100%" fill="white"/>\n' )
|
||||||
|
Teile.append(
|
||||||
|
'<text x="%d" y="30" text-anchor="middle" font-size="16" '
|
||||||
|
'fill="#333">Entwicklung der Loesungsfindung</text>\n'
|
||||||
|
% (Breite // 2) )
|
||||||
|
|
||||||
|
# --- Oberes Panel: Wertigkeit ---
|
||||||
|
# Achsen
|
||||||
|
Teile.append(
|
||||||
|
'<line x1="%d" y1="%d" x2="%d" y2="%.1f" stroke="#333" '
|
||||||
|
'stroke-width="1.5"/>\n' % (Rand, Rand, Rand, OberUnten) )
|
||||||
|
Teile.append(
|
||||||
|
'<line x1="%d" y1="%.1f" x2="%d" y2="%.1f" stroke="#333" '
|
||||||
|
'stroke-width="1.5"/>\n'
|
||||||
|
% (Rand, OberUnten, Breite - Rand, OberUnten) )
|
||||||
|
|
||||||
|
# Y-Gitter + Beschriftung (5 Linien)
|
||||||
|
for k in range(6):
|
||||||
|
wert = WMin + (WMax - WMin) * k / 5
|
||||||
|
y = Y(wert)
|
||||||
|
Teile.append(
|
||||||
|
'<line x1="%d" y1="%.1f" x2="%d" y2="%.1f" stroke="#eee" '
|
||||||
|
'stroke-width="1"/>\n' % (Rand, y, Breite - Rand, y) )
|
||||||
|
Teile.append(
|
||||||
|
'<text x="%d" y="%.1f" text-anchor="end" font-size="11" '
|
||||||
|
'fill="#666">%.0f</text>\n' % (Rand - 8, y + 4, wert) )
|
||||||
|
Teile.append(
|
||||||
|
'<text x="18" y="%.1f" text-anchor="middle" font-size="12" '
|
||||||
|
'fill="#333" transform="rotate(-90 18 %.1f)">Wertigkeit '
|
||||||
|
'(hoeher = besser)</text>\n'
|
||||||
|
% ((Rand + OberUnten) / 2, (Rand + OberUnten) / 2) )
|
||||||
|
|
||||||
|
# die drei Kurven
|
||||||
|
Kurven = [
|
||||||
|
Polyline(2, '#2f6f4f', 'beste Loesung'),
|
||||||
|
Polyline(3, '#c08a2d', 'Durchschnitt'),
|
||||||
|
Polyline(4, '#a03030', 'schlechteste Loesung') ]
|
||||||
|
for (svg, _besch, _farbe) in Kurven:
|
||||||
|
Teile.append( svg )
|
||||||
|
|
||||||
|
# Legende oben rechts
|
||||||
|
LegX = Breite - Rand - 160
|
||||||
|
LegY = Rand + 10
|
||||||
|
for k, (_svg, besch, farbe) in enumerate(Kurven):
|
||||||
|
y = LegY + k * 18
|
||||||
|
Teile.append(
|
||||||
|
'<line x1="%d" y1="%d" x2="%d" y2="%d" stroke="%s" '
|
||||||
|
'stroke-width="2"/>\n' % (LegX, y, LegX + 24, y, farbe) )
|
||||||
|
Teile.append(
|
||||||
|
'<text x="%d" y="%d" font-size="11" fill="#333">%s</text>\n'
|
||||||
|
% (LegX + 30, y + 4, besch) )
|
||||||
|
|
||||||
|
# --- Unteres Panel: Anzahl erzeugter Verteilungen (Pool-Groesse) ---
|
||||||
|
Teile.append(
|
||||||
|
'<text x="%d" y="%.1f" text-anchor="middle" font-size="13" '
|
||||||
|
'fill="#333">Anzahl erzeugter Verteilungen im Pool</text>\n'
|
||||||
|
% (Breite // 2, UnterOben - 12) )
|
||||||
|
# Achsen
|
||||||
|
Teile.append(
|
||||||
|
'<line x1="%d" y1="%.1f" x2="%d" y2="%.1f" stroke="#333" '
|
||||||
|
'stroke-width="1.5"/>\n' % (Rand, UnterOben, Rand, UnterUnten) )
|
||||||
|
Teile.append(
|
||||||
|
'<line x1="%d" y1="%.1f" x2="%d" y2="%.1f" stroke="#333" '
|
||||||
|
'stroke-width="1.5"/>\n'
|
||||||
|
% (Rand, UnterUnten, Breite - Rand, UnterUnten) )
|
||||||
|
# Y-Gitter + Beschriftung (0, Mitte, Max)
|
||||||
|
for n in (0, NMax // 2, NMax):
|
||||||
|
y = YPool(n)
|
||||||
|
Teile.append(
|
||||||
|
'<line x1="%d" y1="%.1f" x2="%d" y2="%.1f" stroke="#eee" '
|
||||||
|
'stroke-width="1"/>\n' % (Rand, y, Breite - Rand, y) )
|
||||||
|
Teile.append(
|
||||||
|
'<text x="%d" y="%.1f" text-anchor="end" font-size="11" '
|
||||||
|
'fill="#666">%d</text>\n' % (Rand - 8, y + 4, n) )
|
||||||
|
# Poolgroessen-Kurve
|
||||||
|
punkte = ' '.join( '%.1f,%.1f' % (X(i), YPool(p[5]))
|
||||||
|
for i, p in enumerate(self.Punkte) )
|
||||||
|
Teile.append(
|
||||||
|
'<polyline points="%s" fill="none" stroke="#4060a0" '
|
||||||
|
'stroke-width="2"/>\n' % punkte )
|
||||||
|
|
||||||
|
# X-Beschriftung: Aktionsbuchstaben unter dem unteren Panel (bei
|
||||||
|
# wenigen Punkten alle, sonst ausgeduennt, damit die Achse lesbar
|
||||||
|
# bleibt)
|
||||||
|
Schritt = max(1, N // 30)
|
||||||
|
for i, p in enumerate(self.Punkte):
|
||||||
|
if i % Schritt == 0 or i == N - 1:
|
||||||
|
Teile.append(
|
||||||
|
'<text x="%.1f" y="%.1f" text-anchor="middle" font-size="10" '
|
||||||
|
'fill="#999">%s</text>\n' % (X(i), UnterUnten + 16, p[1]) )
|
||||||
|
Teile.append(
|
||||||
|
'<text x="%d" y="%d" text-anchor="middle" font-size="12" '
|
||||||
|
'fill="#333">Zyklus-Aktion (Zeit)</text>\n'
|
||||||
|
% (Breite // 2, Hoehe - 12) )
|
||||||
|
|
||||||
|
Teile.append( '</svg>\n' )
|
||||||
|
|
||||||
|
fout = open( OutputSVG, 'w' )
|
||||||
|
fout.writelines( Teile )
|
||||||
|
fout.close()
|
||||||
|
|
||||||
|
|
||||||
|
class Abstammung:
|
||||||
|
"""Beobachtungsobjekt: zeichnet den Stammbaum aller Loesungen auf.
|
||||||
|
|
||||||
|
Jede Loesung bekommt von der Farm eine fortlaufende Abstammungs-Id.
|
||||||
|
Jede Loesung hat eine fortlaufende Nummer (Id 1..N); die Abstammung
|
||||||
|
ergibt sich aus dem gemerkten Vorgaenger (Eltern-Id), nicht aus der Id
|
||||||
|
selbst. Beim Erzeugen entsteht ein Wurzelknoten (keine Eltern), beim
|
||||||
|
Mutieren ein Kindknoten mit Verweis auf die Eltern-Id. alsSVG() zeichnet
|
||||||
|
daraus einen Baum: Generationen als Zeilen (oben Start, nach unten
|
||||||
|
spaeter), Knoten als Punkte (Farbe = Wertigkeit), Mutationskanten
|
||||||
|
Eltern->Kind. Domaenen-agnostisch; funktioniert mit jeder Loesung, die
|
||||||
|
.value hat.
|
||||||
|
"""
|
||||||
|
def __init__(self):
|
||||||
|
# je Knoten: Id -> dict(eltern, generation, value, aktion)
|
||||||
|
self.Knoten = {}
|
||||||
|
|
||||||
|
def erfassen(self, Id, Eltern, Generation, value, Aktion):
|
||||||
|
self.Knoten[Id] = { 'eltern': Eltern, 'generation': Generation,
|
||||||
|
'value': value, 'aktion': Aktion }
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "-- Abstammung (%d Loesungen)\n" % len(self.Knoten)
|
||||||
|
|
||||||
|
def alsSVG(self, OutputSVG, HervorId=None, Breite=1200, Rand=60,
|
||||||
|
KnotenAbstand=26, ZeilenHoehe=90):
|
||||||
|
"""zeichnet den aufgezeichneten Stammbaum als SVG.
|
||||||
|
|
||||||
|
HervorId (optional): Id der hervorzuhebenden Loesung (z.B. der
|
||||||
|
finalen besten). Ihr Ast (die Kette ihrer Vorgaenger) wird kraeftig
|
||||||
|
gezeichnet und der Knoten mit seiner Nummer beschriftet, so dass man
|
||||||
|
die ganze Abstammung im Baum verfolgen kann."""
|
||||||
|
if not self.Knoten:
|
||||||
|
raise ValueError("keine Abstammung aufgezeichnet")
|
||||||
|
|
||||||
|
# Ahnenkette der hervorgehobenen Loesung bestimmen (fuer die
|
||||||
|
# kraeftige Darstellung ihres Astes)
|
||||||
|
Ahnen = set()
|
||||||
|
Id = HervorId
|
||||||
|
while Id is not None and Id in self.Knoten:
|
||||||
|
Ahnen.add(Id)
|
||||||
|
Id = self.Knoten[Id]['eltern']
|
||||||
|
|
||||||
|
# Knoten nach Generation gruppieren
|
||||||
|
Generationen = {}
|
||||||
|
for Id, K in self.Knoten.items():
|
||||||
|
Generationen.setdefault( K['generation'], [] ).append(Id)
|
||||||
|
GenListe = sorted(Generationen)
|
||||||
|
# je Generation die Knoten stabil sortieren (nach Id), damit das Bild
|
||||||
|
# reproduzierbar ist
|
||||||
|
for g in Generationen:
|
||||||
|
Generationen[g].sort()
|
||||||
|
|
||||||
|
MaxBreiteKnoten = max( len(v) for v in Generationen.values() )
|
||||||
|
PlotBreite = max( Breite - 2 * Rand, MaxBreiteKnoten * KnotenAbstand )
|
||||||
|
Breite = PlotBreite + 2 * Rand
|
||||||
|
Hoehe = Rand * 2 + (len(GenListe) - 1) * ZeilenHoehe + 40
|
||||||
|
|
||||||
|
# Position (x,y) je Knoten-Id bestimmen
|
||||||
|
Pos = {}
|
||||||
|
for gi, g in enumerate(GenListe):
|
||||||
|
Ids = Generationen[g]
|
||||||
|
n = len(Ids)
|
||||||
|
y = Rand + gi * ZeilenHoehe
|
||||||
|
for k, Id in enumerate(Ids):
|
||||||
|
# horizontal mittig ausrichten
|
||||||
|
if n == 1:
|
||||||
|
x = Rand + PlotBreite / 2
|
||||||
|
else:
|
||||||
|
x = Rand + PlotBreite * k / (n - 1)
|
||||||
|
Pos[Id] = (x, y)
|
||||||
|
|
||||||
|
# Wertebereich fuer die Knotenfarbe (gut = gruen, schlecht = rot)
|
||||||
|
Werte = [ K['value'] for K in self.Knoten.values() ]
|
||||||
|
WMin, WMax = min(Werte), max(Werte)
|
||||||
|
if WMax == WMin:
|
||||||
|
WMax = WMin + 1
|
||||||
|
def Farbe(v):
|
||||||
|
t = (v - WMin) / (WMax - WMin) # 0 schlecht .. 1 gut
|
||||||
|
r = int(200 * (1 - t) + 40 * t)
|
||||||
|
gg = int(50 * (1 - t) + 140 * t)
|
||||||
|
b = int(50 * (1 - t) + 80 * t)
|
||||||
|
return '#%02x%02x%02x' % (r, gg, b)
|
||||||
|
|
||||||
|
Teile = []
|
||||||
|
Teile.append( '<?xml version="1.0" encoding="UTF-8"?>\n' )
|
||||||
|
Teile.append(
|
||||||
|
'<svg xmlns="http://www.w3.org/2000/svg" width="%d" height="%d" '
|
||||||
|
'viewBox="0 0 %d %d" font-family="sans-serif">\n'
|
||||||
|
% (Breite, Hoehe, Breite, Hoehe) )
|
||||||
|
Teile.append( '<rect width="100%" height="100%" fill="white"/>\n' )
|
||||||
|
Teile.append(
|
||||||
|
'<text x="%d" y="30" text-anchor="middle" font-size="16" '
|
||||||
|
'fill="#333">Abstammung der Loesungen (Mutationsbaum)</text>\n'
|
||||||
|
% (Breite // 2) )
|
||||||
|
|
||||||
|
# zuerst die Kanten Eltern -> Kind (darunter liegend). Kanten entlang
|
||||||
|
# des hervorgehobenen Astes kraeftig, der Rest blass.
|
||||||
|
for Id, K in self.Knoten.items():
|
||||||
|
Eltern = K['eltern']
|
||||||
|
if Eltern is None or Eltern not in Pos or Id not in Pos:
|
||||||
|
continue
|
||||||
|
x1, y1 = Pos[Eltern]
|
||||||
|
x2, y2 = Pos[Id]
|
||||||
|
ImAst = Id in Ahnen and Eltern in Ahnen
|
||||||
|
Stil = ('stroke="#c04040" stroke-width="2.5"' if ImAst
|
||||||
|
else 'stroke="#bbb" stroke-width="1"')
|
||||||
|
Teile.append(
|
||||||
|
'<line x1="%.1f" y1="%.1f" x2="%.1f" y2="%.1f" %s/>\n'
|
||||||
|
% (x1, y1, x2, y2, Stil) )
|
||||||
|
|
||||||
|
# dann die Knoten
|
||||||
|
for Id, K in self.Knoten.items():
|
||||||
|
if Id not in Pos:
|
||||||
|
continue
|
||||||
|
x, y = Pos[Id]
|
||||||
|
r = 7 if Id in Ahnen else 5
|
||||||
|
Rahmen = ('stroke="#c04040" stroke-width="2"' if Id in Ahnen
|
||||||
|
else 'stroke="#333" stroke-width="0.5"')
|
||||||
|
Teile.append(
|
||||||
|
'<circle cx="%.1f" cy="%.1f" r="%d" fill="%s" %s>'
|
||||||
|
'<title>Id %s, Wert %.1f</title></circle>\n'
|
||||||
|
% (x, y, r, Farbe(K['value']), Rahmen, Id, K['value']) )
|
||||||
|
|
||||||
|
# die hervorgehobene Loesung mit ihrer sprechenden Abstammungs-Id
|
||||||
|
# beschriften (aus ihr laesst sich die ganze Herkunft ablesen)
|
||||||
|
if HervorId in Pos:
|
||||||
|
x, y = Pos[HervorId]
|
||||||
|
Teile.append(
|
||||||
|
'<text x="%.1f" y="%.1f" text-anchor="middle" font-size="12" '
|
||||||
|
'font-weight="bold" fill="#c04040">%s</text>\n'
|
||||||
|
% (x, y + 22, HervorId) )
|
||||||
|
|
||||||
|
# Generationsbeschriftung links
|
||||||
|
for gi, g in enumerate(GenListe):
|
||||||
|
y = Rand + gi * ZeilenHoehe
|
||||||
|
Teile.append(
|
||||||
|
'<text x="%d" y="%.1f" text-anchor="end" font-size="11" '
|
||||||
|
'fill="#666">Gen %s</text>\n' % (Rand - 12, y + 4, g) )
|
||||||
|
|
||||||
|
Teile.append( '</svg>\n' )
|
||||||
|
fout = open( OutputSVG, 'w' )
|
||||||
|
fout.writelines( Teile )
|
||||||
|
fout.close()
|
||||||
|
|
||||||
|
|
||||||
class Farm:
|
class Farm:
|
||||||
"""enthaelt und pflegt Loesungsobjekte, kreuzt, mutiert, selektiert sie"""
|
"""enthaelt und pflegt Loesungsobjekte, kreuzt, mutiert, selektiert sie"""
|
||||||
@@ -77,15 +487,40 @@ class Farm:
|
|||||||
"""initialisiere die Farm
|
"""initialisiere die Farm
|
||||||
|
|
||||||
mit einem definerten Zyklus fuer die Zucht und dem gewunschten zu Zuchtobjekt
|
mit einem definerten Zyklus fuer die Zucht und dem gewunschten zu Zuchtobjekt
|
||||||
|
|
||||||
|
Beobachtung: self.Entwicklung zeichnet nach jeder Zyklus-Aktion
|
||||||
|
den Pool-Zustand auf und laesst sich per alsSVG() visualisieren.
|
||||||
"""
|
"""
|
||||||
self.Position = 0
|
self.Position = 0
|
||||||
self.Pool = []
|
self.Pool = []
|
||||||
self.PoolNeu = []
|
self.PoolNeu = []
|
||||||
self.Zyklus = Zyklus
|
self.Zyklus = Zyklus
|
||||||
self.Klasse = Klasse
|
self.Klasse = Klasse
|
||||||
for Aktion, Zahl in zip(Zyklus.Abfolge,Zyklus.Anzahl):
|
self.Entwicklung = Entwicklung()
|
||||||
#print 'Aktion:',Aktion
|
# Abstammung: jede Loesung bekommt eine fortlaufende _absid; die
|
||||||
#print 'Zahl:',Zahl
|
# aktuelle Generationsnummer waechst mit jedem Erzeugen/Mutieren.
|
||||||
|
self.Abstammung = Abstammung()
|
||||||
|
self._AbsZaehler = 0 # vergibt fortlaufende Loesungs-Ids 1..N
|
||||||
|
self._Generation = 0
|
||||||
|
# schon gesehene Loesungs-Signaturen (getGruppenId), damit dieselbe
|
||||||
|
# Sitzordnung nicht mehrfach gehalten und bewertet wird.
|
||||||
|
self._GeseheneGruppenIds = set()
|
||||||
|
if getattr(Zyklus, 'Modus', 'statisch') == 'adaptiv':
|
||||||
|
self._LaufAdaptiv(Klasse, *Arguments, **keywords)
|
||||||
|
else:
|
||||||
|
self._LaufStatisch(Klasse, *Arguments, **keywords)
|
||||||
|
|
||||||
|
def _Aufzeichnen(self, Aktion):
|
||||||
|
"""nach einer Aktion den aktuellen Pool-Zustand fuer die
|
||||||
|
Entwicklungsgrafik erfassen. Der beobachtete Pool ist der, in dem
|
||||||
|
gerade die Loesungen liegen: PoolNeu, sobald dort etwas gesammelt
|
||||||
|
wurde, sonst Pool."""
|
||||||
|
self.Entwicklung.erfassen(
|
||||||
|
Aktion, self.PoolNeu if self.PoolNeu else self.Pool )
|
||||||
|
|
||||||
|
def _LaufStatisch(self, Klasse, *Arguments, **keywords):
|
||||||
|
"""klassischer Ablauf: die Abfolge/Anzahl aus zyklus.cfg abspielen."""
|
||||||
|
for Aktion, Zahl in zip(self.Zyklus.Abfolge, self.Zyklus.Anzahl):
|
||||||
self.Position = self.Position + 1
|
self.Position = self.Position + 1
|
||||||
if Aktion == 'e':
|
if Aktion == 'e':
|
||||||
self.LoesungenErzeugen(int(Zahl), Klasse, *Arguments, **keywords)
|
self.LoesungenErzeugen(int(Zahl), Klasse, *Arguments, **keywords)
|
||||||
@@ -101,10 +536,86 @@ class Farm:
|
|||||||
self.NeueGeneration()
|
self.NeueGeneration()
|
||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
|
self._Aufzeichnen(Aktion)
|
||||||
|
|
||||||
|
def _LaufAdaptiv(self, Klasse, *Arguments, **keywords):
|
||||||
|
"""adaptiver Ablauf: viele Startloesungen, dann Generationen mit
|
||||||
|
schrumpfender Population; Abbruch, sobald sich die beste Bewertung
|
||||||
|
ueber 'Geduld' Generationen um weniger als 'Schwelle' verbessert."""
|
||||||
|
P = self.Zyklus.Adaptiv
|
||||||
|
Population = max( int(P['Start']), int(P['MinPopulation']) )
|
||||||
|
|
||||||
|
# Startpopulation erzeugen (der 'maximale Anfangswert')
|
||||||
|
self.LoesungenErzeugen(Population, Klasse, *Arguments, **keywords)
|
||||||
|
self._Aufzeichnen('e')
|
||||||
|
|
||||||
|
BesterWert = max(self.Pool).value
|
||||||
|
OhneVerbesserung = 0
|
||||||
|
for Gen in range(int(P['MaxGenerationen'])):
|
||||||
|
self.Position = self.Position + 1
|
||||||
|
|
||||||
|
# Mutationskinder erzeugen (in PoolNeu) und die Eltern (Pool)
|
||||||
|
# dazunehmen, so dass PoolNeu Eltern + Kinder als Kandidaten haelt.
|
||||||
|
self.LoesungenMutieren( int(P['MutationProLoesung']) )
|
||||||
|
self._Aufzeichnen('m')
|
||||||
|
self.LoesungenBehalten() # PoolNeu += Pool
|
||||||
|
self.NeueGeneration() # Pool = PoolNeu (Kandidaten), PoolNeu leer
|
||||||
|
self._Aufzeichnen('j')
|
||||||
|
|
||||||
|
# Population fuer die naechste Generation schrumpfen (nie unter
|
||||||
|
# MinPopulation) und den Kandidatenpool auf die besten K trunkieren.
|
||||||
|
Population = max( int(P['MinPopulation']),
|
||||||
|
int(Population * float(P['Schrumpfung'])) )
|
||||||
|
self.PopulationBegrenzen( Population )
|
||||||
|
self._Aufzeichnen('s')
|
||||||
|
|
||||||
|
# Konvergenz pruefen
|
||||||
|
AktuellBest = max(self.Pool).value
|
||||||
|
if AktuellBest - BesterWert >= float(P['Schwelle']):
|
||||||
|
OhneVerbesserung = 0
|
||||||
|
else:
|
||||||
|
OhneVerbesserung = OhneVerbesserung + 1
|
||||||
|
if AktuellBest > BesterWert:
|
||||||
|
BesterWert = AktuellBest
|
||||||
|
print("+ Generation %d: bester Wert %.1f, Population %d, "
|
||||||
|
"ohne Verbesserung %d" % (Gen + 1, AktuellBest, len(self.Pool),
|
||||||
|
OhneVerbesserung))
|
||||||
|
if OhneVerbesserung >= int(P['Geduld']):
|
||||||
|
print("+ Abbruch: %d Generationen ohne nennenswerte "
|
||||||
|
"Verbesserung" % OhneVerbesserung)
|
||||||
|
break
|
||||||
|
def _NeueId(self):
|
||||||
|
"""neue Id fuer eine Loesung: eine fortlaufende Nummer 1..N ueber
|
||||||
|
alle je erzeugten Loesungen (Wurzeln wie Mutationskinder gleich).
|
||||||
|
Die Abstammung ergibt sich nicht aus der Id, sondern aus dem
|
||||||
|
separat gemerkten Vorgaenger (siehe erfassen(..., Eltern))."""
|
||||||
|
self._AbsZaehler = self._AbsZaehler + 1
|
||||||
|
return self._AbsZaehler
|
||||||
|
|
||||||
|
def _LoesungIstNeu(self, L):
|
||||||
|
"""Kontrolle nach jeder Erzeugung: True, wenn die Loesung eine bisher
|
||||||
|
ungesehene Sitzordnung hat (Vergleich ueber getGruppenId, also auf
|
||||||
|
Gruppen-Ebene) - und merkt sie dann vor. Duplikate (gleiche Sitz-
|
||||||
|
ordnung) werden so nicht noch einmal gehalten und bewertet.
|
||||||
|
Loesungen ohne getGruppenId gelten immer als neu (kein Dedup)."""
|
||||||
|
Hole = getattr(L, 'getGruppenId', None)
|
||||||
|
if Hole is None:
|
||||||
|
return True
|
||||||
|
Gid = Hole()
|
||||||
|
if Gid in self._GeseheneGruppenIds:
|
||||||
|
return False
|
||||||
|
self._GeseheneGruppenIds.add(Gid)
|
||||||
|
return True
|
||||||
|
|
||||||
def LoesungenErzeugen(self, N, Klasse, *Arguments, **keywords):
|
def LoesungenErzeugen(self, N, Klasse, *Arguments, **keywords):
|
||||||
""" Erzeuge Loesungen"""
|
""" Erzeuge Loesungen (bereits gesehene Sitzordnungen werden verworfen)"""
|
||||||
for i in range(N):
|
for i in range(N):
|
||||||
L = Klasse( *Arguments, **keywords )
|
L = Klasse( *Arguments, **keywords )
|
||||||
|
if not self._LoesungIstNeu(L):
|
||||||
|
continue # gleiche Sitzordnung schon vorhanden -> nicht behalten
|
||||||
|
L._absid = self._NeueId() # Wurzel: kein Vorgaenger
|
||||||
|
self.Abstammung.erfassen(
|
||||||
|
L._absid, None, self._Generation, getattr(L, 'value', 0), 'e' )
|
||||||
self.Pool.append(L)
|
self.Pool.append(L)
|
||||||
#print(repr(len(self.Pool)) + ' Loesungsobjekte erzeugt')
|
#print(repr(len(self.Pool)) + ' Loesungsobjekte erzeugt')
|
||||||
def LoesungenKreuzen(self,N):
|
def LoesungenKreuzen(self,N):
|
||||||
@@ -115,11 +626,22 @@ class Farm:
|
|||||||
def LoesungenMutieren(self, N):
|
def LoesungenMutieren(self, N):
|
||||||
"""veraendere die Loesung, so dass sie hoffentlich besser wird"""
|
"""veraendere die Loesung, so dass sie hoffentlich besser wird"""
|
||||||
print("+ Loesungen mutieren: ", N)
|
print("+ Loesungen mutieren: ", N)
|
||||||
|
self._Generation = self._Generation + 1
|
||||||
for n in range(N):
|
for n in range(N):
|
||||||
#print(" -"+repr(n+1)+" mal")
|
#print(" -"+repr(n+1)+" mal")
|
||||||
for L in chain(self.Pool):
|
for L in chain(self.Pool):
|
||||||
O = deepcopy(L)
|
O = deepcopy(L)
|
||||||
self.PoolNeu.append(O.mutieren())
|
Kind = O.mutieren()
|
||||||
|
if not self._LoesungIstNeu(Kind):
|
||||||
|
continue # gleiche Sitzordnung schon gesehen -> verwerfen
|
||||||
|
# Kind bekommt eine neue fortlaufende Nummer; der Vorgaenger
|
||||||
|
# (Eltern-Id) wird separat in der Abstammung gemerkt.
|
||||||
|
ElternId = getattr(L, '_absid', None)
|
||||||
|
Kind._absid = self._NeueId()
|
||||||
|
self.Abstammung.erfassen(
|
||||||
|
Kind._absid, ElternId, self._Generation,
|
||||||
|
getattr(Kind, 'value', 0), 'm' )
|
||||||
|
self.PoolNeu.append(Kind)
|
||||||
#print(self)
|
#print(self)
|
||||||
def LoesungenBehalten(self):
|
def LoesungenBehalten(self):
|
||||||
"""Behalte alle Eltern aus dem alten Pool"""
|
"""Behalte alle Eltern aus dem alten Pool"""
|
||||||
@@ -141,6 +663,15 @@ class Farm:
|
|||||||
self.PoolNeu.append(L)
|
self.PoolNeu.append(L)
|
||||||
self.Pool.remove(L)
|
self.Pool.remove(L)
|
||||||
#print(self)
|
#print(self)
|
||||||
|
def PopulationBegrenzen(self, K):
|
||||||
|
"""Trunkierungs-Selektion: behalte im Pool nur die K besten
|
||||||
|
Loesungen und verwirf den Rest. Anders als LoesungenAuswaehlen
|
||||||
|
(das additiv nach PoolNeu verschiebt) veraendert dies den Pool an
|
||||||
|
Ort und Stelle - fuer die adaptive Generationenschleife, damit die
|
||||||
|
Population wirklich schrumpft."""
|
||||||
|
K = max( 0, min( K, len(self.Pool) ) )
|
||||||
|
self.Pool = sorted( self.Pool, reverse=True )[:K]
|
||||||
|
print("+ Population auf %d beste begrenzt" % K)
|
||||||
def LoesungenZufaelligAuswaehlen(self, N):
|
def LoesungenZufaelligAuswaehlen(self, N):
|
||||||
"""Selektiere zufaellig Loesungen"""
|
"""Selektiere zufaellig Loesungen"""
|
||||||
print("+ zufaellig auswaehlen -"+ repr(N) + "-")
|
print("+ zufaellig auswaehlen -"+ repr(N) + "-")
|
||||||
@@ -159,6 +690,15 @@ class Farm:
|
|||||||
print("+ speichern")
|
print("+ speichern")
|
||||||
def Bester(self):
|
def Bester(self):
|
||||||
return max(self.Pool)
|
return max(self.Pool)
|
||||||
|
def TopN(self, N):
|
||||||
|
"""die N besten Loesungen, absteigend nach Wertigkeit sortiert.
|
||||||
|
|
||||||
|
Erweiterung von Bester() (das nur die einzelne beste liefert): gibt
|
||||||
|
eine Liste der bis zu N besten Loesungen zurueck, damit sich mehrere
|
||||||
|
gute Alternativen betrachten lassen. N wird auf [0, len(Pool)]
|
||||||
|
begrenzt; bei N >= Poolgroesse ist es der ganze Pool (sortiert)."""
|
||||||
|
N = max( 0, min( N, len(self.Pool) ) )
|
||||||
|
return sorted( self.Pool, reverse=True )[:N]
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|||||||
@@ -11,65 +11,122 @@ __license__ = "Python"
|
|||||||
|
|
||||||
from ga import *
|
from ga import *
|
||||||
from Strukturdaten import *
|
from Strukturdaten import *
|
||||||
import configparser
|
from Farben import Farbschema
|
||||||
import optparse
|
import optparse
|
||||||
|
import random
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
||||||
# Kommandozeilenoption --indir: Verzeichnis mit den Eingabedateien
|
# Kommandozeilenoption --indir: Verzeichnis mit den Eingabedateien
|
||||||
# (tische.ini, bestellung.xml) und Ziel fuer die Ausgabedateien
|
# (tische.ini, bestellung.json) und Ziel fuer die Ausgabedateien
|
||||||
# (TischePersonen.txt, PersonenTische.csv)
|
# (TischePersonen.txt, PersonenTische.csv)
|
||||||
parser = optparse.OptionParser()
|
parser = optparse.OptionParser()
|
||||||
parser.add_option( "--indir", dest="indir", default=None,
|
parser.add_option( "--indir", dest="indir", default=None,
|
||||||
help="Verzeichnis mit tische.ini und bestellung.xml; "
|
help="Verzeichnis mit tische.ini und bestellung.json; "
|
||||||
"dort werden auch TischePersonen.txt und PersonenTische.csv abgelegt" )
|
"dort werden auch TischePersonen.txt und PersonenTische.csv abgelegt" )
|
||||||
parser.add_option( "--tosvg", dest="tosvg", action="store_true", default=False,
|
parser.add_option( "--tosvg", dest="tosvg", action="store_true", default=False,
|
||||||
help="zusaetzlich eine Sitzplatzverteilung.svg im --indir Verzeichnis "
|
help="zusaetzlich eine Sitzplatzverteilung.svg im --indir Verzeichnis "
|
||||||
"erzeugen (Tische als weisse Kreise, Personen als farbige "
|
"erzeugen (Tische als weisse Kreise, Personen als farbige "
|
||||||
"Kreise je Gruppe)" )
|
"Kreise je Gruppe)" )
|
||||||
|
parser.add_option( "--show-connections", dest="showconn", action="store_true",
|
||||||
|
default=True,
|
||||||
|
help="in der Sitzplatzverteilung.svg jede ueber mehrere Tische "
|
||||||
|
"getrennte Gruppe mit einer Linie in ihrer Gruppenfarbe "
|
||||||
|
"verbinden (Vorgabe: an; nur mit --tosvg wirksam)" )
|
||||||
|
parser.add_option( "--hide-connections", dest="showconn",
|
||||||
|
action="store_false",
|
||||||
|
help="die Verbindungslinien getrennter Gruppen in der "
|
||||||
|
"Sitzplatzverteilung.svg nicht zeichnen" )
|
||||||
|
parser.add_option( "--show-development", dest="showdev", action="store_true",
|
||||||
|
default=False,
|
||||||
|
help="zusaetzlich eine Entwicklung.svg im --indir Verzeichnis "
|
||||||
|
"erzeugen: Verlauf der Loesungsfindung (Zeitachse nach rechts, "
|
||||||
|
"beste/durchschnittliche/schlechteste Wertigkeit auf der Y-Achse)" )
|
||||||
|
parser.add_option( "--show-lineage", dest="showlineage", action="store_true",
|
||||||
|
default=False,
|
||||||
|
help="zusaetzlich eine Abstammung.svg im --indir Verzeichnis "
|
||||||
|
"erzeugen: Stammbaum aller Loesungen (Mutationsbaum); der Ast der "
|
||||||
|
"finalen besten Loesung ist hervorgehoben und mit ihrer "
|
||||||
|
"Abstammungs-Id beschriftet" )
|
||||||
|
parser.add_option( "--zyklus-art", dest="zyklusart", default="Adaptiv",
|
||||||
|
help="Name des GA-Profils in zyklus.cfg (Vorgabe: Adaptiv). "
|
||||||
|
"Weitere mitgelieferte Profile: Easy, Simple" )
|
||||||
|
parser.add_option( "--strafen", dest="strafen", default="default",
|
||||||
|
help="Name des Strafpunkte-Profils (Sektion in strafen.cfg; "
|
||||||
|
"Vorgabe: default). Erlaubt mehrere Bewertungs-Vorgehen in einer "
|
||||||
|
"Datei, z.B. --strafen locker" )
|
||||||
|
parser.add_option( "--farben", dest="farben", default="grosse_gruppen",
|
||||||
|
help="Name des Farbprofils fuer die SVG-Ausgabe (Sektion in "
|
||||||
|
"farben.cfg; Vorgabe: grosse_gruppen). Fuer Hochzeiten: "
|
||||||
|
"--farben hochzeit (Familien/Vereine/VIPs getrennt)" )
|
||||||
|
parser.add_option( "--seed", dest="seed", type="int", default=None,
|
||||||
|
help="Zufalls-Startwert (int) fuer random.seed(), macht den Lauf "
|
||||||
|
"reproduzierbar. Ohne Angabe laeuft der GA nichtdeterministisch. "
|
||||||
|
"Fuer Support-Rueckfragen ('warum sitzt Tante Erna dort?') mit "
|
||||||
|
"demselben --seed exakt denselben Sitzplan erneut erzeugen" )
|
||||||
(options, args) = parser.parse_args()
|
(options, args) = parser.parse_args()
|
||||||
|
|
||||||
|
# Determinismus auf Wunsch: den globalen Zufallsgenerator seeden, bevor
|
||||||
|
# irgendeine GA-Aktion laeuft. Der gesamte Algorithmus (ga.py und
|
||||||
|
# Strukturdaten.py nutzen 'from random import *') zieht aus demselben
|
||||||
|
# Modul-RNG, daher genuegt ein einziges random.seed() hier.
|
||||||
|
if options.seed is not None:
|
||||||
|
random.seed( options.seed )
|
||||||
|
print( "Determinismus: random.seed(%d) - Lauf ist reproduzierbar"
|
||||||
|
% options.seed )
|
||||||
|
|
||||||
if options.indir is None:
|
if options.indir is None:
|
||||||
parser.error( "--indir ist erforderlich" )
|
parser.error( "--indir ist erforderlich" )
|
||||||
InDir = os.path.expandvars( os.path.expanduser( options.indir ) )
|
InDir = os.path.expandvars( os.path.expanduser( options.indir ) )
|
||||||
if not os.path.isdir( InDir ):
|
if not os.path.isdir( InDir ):
|
||||||
parser.error( "--indir '%s' ist kein Verzeichnis" % InDir )
|
parser.error( "--indir '%s' ist kein Verzeichnis" % InDir )
|
||||||
|
|
||||||
# lade Vorgaben fuer Optimierungszyklus und
|
# zyklus.cfg (GA-Profile) und strafen.cfg (Strafpunkte) direkt aus dem
|
||||||
config = configparser.ConfigParser()
|
# per $PLATZ_CFG bestimmten cfg-Verzeichnis laden. Das GA-Profil waehlt
|
||||||
ConfigPath= os.path.join( os.getenv('PLATZ_CFG'), 'platz.cfg')
|
# der Schalter --zyklus-art (Vorgabe: Adaptiv).
|
||||||
config.read( os.path.expandvars( ConfigPath ))
|
CfgDir = os.getenv('PLATZ_CFG')
|
||||||
|
if not CfgDir:
|
||||||
Zyklusconfig = os.path.normpath( config.get( 'Config', 'Zyklusdatei' ))
|
parser.error( "Umgebungsvariable PLATZ_CFG ist nicht gesetzt "
|
||||||
Zyklusconfig = os.path.expandvars( Zyklusconfig )
|
"(bin/setenv aufrufen)" )
|
||||||
Zyklusart = config.get( 'Config', 'Zyklusart' )
|
Zyklusconfig = os.path.join( CfgDir, 'zyklus.cfg' )
|
||||||
|
Zyklusart = options.zyklusart
|
||||||
Strafenconfig = os.path.normpath(config.get( 'Config', 'Strafendatei' ))
|
Strafenconfig = os.path.join( CfgDir, 'strafen.cfg' )
|
||||||
Strafenconfig = os.path.expandvars( Strafenconfig )
|
Strafenart = options.strafen
|
||||||
## print Strafenconfig
|
Farbenconfig = os.path.join( CfgDir, 'farben.cfg' )
|
||||||
|
Farbenart = options.farben
|
||||||
|
|
||||||
# lade Eingabedateien
|
# lade Eingabedateien
|
||||||
Tischconfig = os.path.join( InDir, 'tische.ini' )
|
Tischconfig = os.path.join( InDir, 'tische.ini' )
|
||||||
Bestellung = os.path.join( InDir, 'bestellung.xml' )
|
Bestellung = os.path.join( InDir, 'bestellung.json' )
|
||||||
|
|
||||||
# lade Ausgabedateien
|
# lade Ausgabedateien
|
||||||
AusgabeTP= os.path.join( InDir, 'TischePersonen.txt' )
|
AusgabeTP= os.path.join( InDir, 'TischePersonen.txt' )
|
||||||
AusgabePT = os.path.join( InDir, 'PersonenTische.csv' )
|
AusgabePT = os.path.join( InDir, 'PersonenTische.csv' )
|
||||||
AusgabeSVG = os.path.join( InDir, 'Sitzplatzverteilung.svg' )
|
AusgabeSVG = os.path.join( InDir, 'Sitzplatzverteilung.svg' )
|
||||||
|
AusgabeEntwicklung = os.path.join( InDir, 'Entwicklung.svg' )
|
||||||
|
AusgabeAbstammung = os.path.join( InDir, 'Abstammung.svg' )
|
||||||
|
|
||||||
Z = Zyklus()
|
Z = Zyklus()
|
||||||
Z.laden( Zyklusconfig, Zyklusart )
|
Z.laden( Zyklusconfig, Zyklusart )
|
||||||
print(Z)
|
print(Z)
|
||||||
SL = Strafliste()
|
SL = Strafliste()
|
||||||
SL.laden( Strafenconfig )
|
try:
|
||||||
|
SL.laden( Strafenconfig, Strafenart )
|
||||||
|
except ValueError as Fehler:
|
||||||
|
parser.error( str(Fehler) )
|
||||||
print(SL)
|
print(SL)
|
||||||
|
FS = Farbschema()
|
||||||
|
try:
|
||||||
|
FS.laden( Farbenconfig, Farbenart )
|
||||||
|
except ValueError as Fehler:
|
||||||
|
parser.error( str(Fehler) )
|
||||||
TE = Tische()
|
TE = Tische()
|
||||||
TE.laden( Tischconfig )
|
TE.laden( Tischconfig )
|
||||||
print(TE)
|
print(TE)
|
||||||
|
|
||||||
InputFile = XMLConfig()
|
InputFile = JSONConfig()
|
||||||
[ PN, GN, VIPGruppe, VIPListePT ] = InputFile.laden( Bestellung )
|
[ PN, GN, VIPGruppe, VIPListePT, GruppenNamen ] = InputFile.laden( Bestellung )
|
||||||
print(PN)
|
print(PN)
|
||||||
print(GN)
|
print(GN)
|
||||||
print(VIPGruppe)
|
print(VIPGruppe)
|
||||||
@@ -82,7 +139,15 @@ if __name__ == '__main__':
|
|||||||
print(S)
|
print(S)
|
||||||
S.speichern( AusgabeTP, AusgabePT )
|
S.speichern( AusgabeTP, AusgabePT )
|
||||||
if options.tosvg:
|
if options.tosvg:
|
||||||
S.alsSVG( AusgabeSVG )
|
S.alsSVG( AusgabeSVG, Verbindungen=options.showconn,
|
||||||
|
GruppenNamen=GruppenNamen, Farbschema=FS )
|
||||||
|
if options.showdev:
|
||||||
|
F1.Entwicklung.alsSVG( AusgabeEntwicklung )
|
||||||
|
print( "Entwicklungsverlauf geschrieben:", AusgabeEntwicklung )
|
||||||
|
if options.showlineage:
|
||||||
|
F1.Abstammung.alsSVG( AusgabeAbstammung,
|
||||||
|
HervorId=getattr(S, '_absid', None) )
|
||||||
|
print( "Abstammungsbaum geschrieben:", AusgabeAbstammung )
|
||||||
|
|
||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -0,0 +1,376 @@
|
|||||||
|
"""
|
||||||
|
Plattformunabhaengige Prozessverwaltung fuer die Web-Testinstanz
|
||||||
|
(ersetzt die fruehere PowerShell-Loesung run_web_helper.ps1, damit
|
||||||
|
dasselbe Skript unter Windows und Linux funktioniert).
|
||||||
|
|
||||||
|
Aufruf (ueber bin/run_web.bat bzw. bin/run_web.sh oder direkt):
|
||||||
|
|
||||||
|
python libs/webserver.py start # Server im Hintergrund starten
|
||||||
|
python libs/webserver.py stop # Server beenden
|
||||||
|
python libs/webserver.py status # laeuft er? PID? Port?
|
||||||
|
python libs/webserver.py run # im Vordergrund (Strg+C beendet)
|
||||||
|
python libs/webserver.py # wie "run"
|
||||||
|
|
||||||
|
--port N weicht vom Standardport 8000 ab
|
||||||
|
|
||||||
|
Designentscheidung gegen Zombie-Prozesse: Im Hintergrundbetrieb
|
||||||
|
("start") laeuft uvicorn OHNE --reload als ein einzelner Prozess,
|
||||||
|
der per PID-Datei sauber beendet werden kann. Der Auto-Reload
|
||||||
|
(--reload) startet Arbeitsprozesse als multiprocessing-Spawn-Kinder,
|
||||||
|
die bei unsanftem Ende des Reloaders MIT geerbtem Server-Socket
|
||||||
|
weiterleben und den Port unsichtbar weiterbedienen koennen (unter
|
||||||
|
Windows tauchen sie weder als Socket-Besitzer noch mit "uvicorn" in
|
||||||
|
der Kommandozeile auf). Deshalb gibt es --reload nur im
|
||||||
|
Vordergrundmodus ("run"), wo Strg+C alles gemeinsam beendet.
|
||||||
|
"""
|
||||||
|
|
||||||
|
__author__ = "Michael Stangl"
|
||||||
|
__copyright__ = "Copyright (c) 2026 Michael Stangl"
|
||||||
|
__license__ = "Python"
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import signal
|
||||||
|
import socket
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import urllib.request
|
||||||
|
|
||||||
|
BASISDIR = os.path.dirname( os.path.dirname( os.path.abspath( __file__ ) ) )
|
||||||
|
WEBDIR = os.path.join( BASISDIR, 'web' )
|
||||||
|
LOGDIR = os.path.join( BASISDIR, 'log' )
|
||||||
|
PIDDATEI = os.path.join( LOGDIR, 'run_web.pid' )
|
||||||
|
LOGDATEI = os.path.join( LOGDIR, 'run_web.log' )
|
||||||
|
HOST = '127.0.0.1'
|
||||||
|
STANDARDPORT = 8000
|
||||||
|
APPTITEL = 'Sitz & Platz' # steht im OpenAPI-Titel von web/main.py
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------- Sonden
|
||||||
|
def PortOffen(Port):
|
||||||
|
"""True, wenn auf dem Port etwas Verbindungen annimmt"""
|
||||||
|
with socket.socket( socket.AF_INET, socket.SOCK_STREAM ) as s:
|
||||||
|
s.settimeout( 1.0 )
|
||||||
|
return s.connect_ex( (HOST, Port) ) == 0
|
||||||
|
|
||||||
|
|
||||||
|
def IstUnsereApp(Port):
|
||||||
|
"""True/False, ob auf dem Port unsere FastAPI-App antwortet;
|
||||||
|
None, wenn keine (verwertbare) Antwort kommt"""
|
||||||
|
try:
|
||||||
|
with urllib.request.urlopen(
|
||||||
|
'http://%s:%d/openapi.json' % (HOST, Port), timeout=3 ) as antwort:
|
||||||
|
daten = json.load( antwort )
|
||||||
|
return APPTITEL in daten.get( 'info', {} ).get( 'title', '' )
|
||||||
|
except Exception:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def PidLebt(Pid):
|
||||||
|
"""True, wenn der Prozess existiert (portabel)"""
|
||||||
|
if Pid is None or Pid <= 0:
|
||||||
|
return False
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
# os.kill(pid, 0) ist unter Windows unbrauchbar (wirft WinError 87
|
||||||
|
# statt zu pruefen). Stattdessen im Toolhelp-Snapshot nachsehen.
|
||||||
|
return Pid in _ProzessTabelle()
|
||||||
|
try:
|
||||||
|
os.kill( Pid, 0 )
|
||||||
|
return True
|
||||||
|
except PermissionError:
|
||||||
|
return True # existiert, gehoert aber jemand anderem
|
||||||
|
except OSError:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
# ------------------------------------------------------------- PID-Datei
|
||||||
|
def PidLesen():
|
||||||
|
try:
|
||||||
|
with open( PIDDATEI ) as f:
|
||||||
|
return int( f.read().strip() )
|
||||||
|
except (OSError, ValueError):
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def PidSchreiben(Pid):
|
||||||
|
os.makedirs( LOGDIR, exist_ok=True )
|
||||||
|
with open( PIDDATEI, 'w' ) as f:
|
||||||
|
f.write( '%d\n' % Pid )
|
||||||
|
|
||||||
|
|
||||||
|
def PidLoeschen():
|
||||||
|
try:
|
||||||
|
os.remove( PIDDATEI )
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def ListenerPid(Port):
|
||||||
|
"""PID des Prozesses, der auf dem Port lauscht (Fallback, wenn die
|
||||||
|
PID-Datei fehlt); None wenn nicht feststellbar"""
|
||||||
|
try:
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
ausgabe = subprocess.run(
|
||||||
|
['netstat', '-ano', '-p', 'tcp'],
|
||||||
|
capture_output=True, text=True, timeout=10 ).stdout
|
||||||
|
for zeile in ausgabe.splitlines():
|
||||||
|
teile = zeile.split()
|
||||||
|
# Zustandsspalte NICHT auf "LISTENING" pruefen - netstat
|
||||||
|
# ist lokalisiert (deutsch: "ABHOEREN"). Ein Listener ist
|
||||||
|
# an der Gegenstelle 0.0.0.0:0 erkennbar; PID = letzte Spalte.
|
||||||
|
if ( len(teile) >= 5 and teile[0] == 'TCP'
|
||||||
|
and teile[1].endswith( ':%d' % Port )
|
||||||
|
and teile[2] in ('0.0.0.0:0', '[::]:0') ):
|
||||||
|
return int( teile[-1] )
|
||||||
|
else:
|
||||||
|
ausgabe = subprocess.run(
|
||||||
|
['ss', '-tlnp'],
|
||||||
|
capture_output=True, text=True, timeout=10 ).stdout
|
||||||
|
for zeile in ausgabe.splitlines():
|
||||||
|
if ':%d ' % Port in zeile and 'pid=' in zeile:
|
||||||
|
return int( zeile.split('pid=')[1].split(',')[0] )
|
||||||
|
except (OSError, ValueError, subprocess.SubprocessError):
|
||||||
|
pass
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
# ------------------------------------------------- Prozessbaum-Hilfen
|
||||||
|
def _ProzessTabelle():
|
||||||
|
"""{ Pid: (ElternPid, Prozessname) } aller laufenden Prozesse -
|
||||||
|
Windows ueber einen Toolhelp-Snapshot (ctypes, Standardbibliothek),
|
||||||
|
Linux ueber /proc"""
|
||||||
|
tabelle = {}
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
import ctypes
|
||||||
|
import ctypes.wintypes as wt
|
||||||
|
|
||||||
|
class PROCESSENTRY32(ctypes.Structure):
|
||||||
|
_fields_ = [
|
||||||
|
('dwSize', wt.DWORD), ('cntUsage', wt.DWORD),
|
||||||
|
('th32ProcessID', wt.DWORD),
|
||||||
|
('th32DefaultHeapID', ctypes.POINTER( ctypes.c_ulong )),
|
||||||
|
('th32ModuleID', wt.DWORD), ('cntThreads', wt.DWORD),
|
||||||
|
('th32ParentProcessID', wt.DWORD),
|
||||||
|
('pcPriClassBase', ctypes.c_long),
|
||||||
|
('dwFlags', wt.DWORD), ('szExeFile', ctypes.c_char * 260) ]
|
||||||
|
|
||||||
|
TH32CS_SNAPPROCESS = 0x2
|
||||||
|
k32 = ctypes.windll.kernel32
|
||||||
|
schnappschuss = k32.CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 )
|
||||||
|
if schnappschuss == -1:
|
||||||
|
return tabelle
|
||||||
|
eintrag = PROCESSENTRY32()
|
||||||
|
eintrag.dwSize = ctypes.sizeof( PROCESSENTRY32 )
|
||||||
|
if k32.Process32First( schnappschuss, ctypes.byref( eintrag ) ):
|
||||||
|
while True:
|
||||||
|
tabelle[ int(eintrag.th32ProcessID) ] = (
|
||||||
|
int(eintrag.th32ParentProcessID),
|
||||||
|
eintrag.szExeFile.decode( errors='replace' ).lower() )
|
||||||
|
if not k32.Process32Next( schnappschuss,
|
||||||
|
ctypes.byref( eintrag ) ):
|
||||||
|
break
|
||||||
|
k32.CloseHandle( schnappschuss )
|
||||||
|
else:
|
||||||
|
for name in os.listdir( '/proc' ):
|
||||||
|
if not name.isdigit():
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
with open( '/proc/%s/stat' % name ) as f:
|
||||||
|
stat = f.read()
|
||||||
|
# Format: pid (comm) zustand ppid ... - comm kann
|
||||||
|
# Leerzeichen enthalten, daher an der Klammer trennen
|
||||||
|
kommando = stat[ stat.index('(') + 1 : stat.rindex(')') ]
|
||||||
|
felder = stat[ stat.rindex(')') + 2 : ].split()
|
||||||
|
tabelle[ int(name) ] = ( int(felder[1]), kommando.lower() )
|
||||||
|
except (OSError, ValueError, IndexError):
|
||||||
|
continue
|
||||||
|
return tabelle
|
||||||
|
|
||||||
|
|
||||||
|
def ProzessWurzel(Pid):
|
||||||
|
"""laeuft vom Prozess die Elternkette hoch, solange die Eltern auch
|
||||||
|
Python-Prozesse sind, und liefert die Wurzel des Python-Baums.
|
||||||
|
Noetig fuer fremde/alte --reload-Server: wird nur der Arbeits-
|
||||||
|
prozess beendet, startet der Reloader ihn sofort neu."""
|
||||||
|
tabelle = _ProzessTabelle()
|
||||||
|
aktuell = Pid
|
||||||
|
for _ in range( 10 ): # Schutz gegen Zyklen
|
||||||
|
eintrag = tabelle.get( aktuell )
|
||||||
|
if eintrag is None:
|
||||||
|
break
|
||||||
|
eltern, _name = eintrag
|
||||||
|
elternEintrag = tabelle.get( eltern )
|
||||||
|
if elternEintrag is None or not elternEintrag[1].startswith( 'python' ):
|
||||||
|
break
|
||||||
|
aktuell = eltern
|
||||||
|
return aktuell
|
||||||
|
|
||||||
|
|
||||||
|
# ------------------------------------------------------------- Aktionen
|
||||||
|
def UvicornKommando(Port, Reload):
|
||||||
|
Kommando = [ sys.executable, '-m', 'uvicorn', 'main:app',
|
||||||
|
'--app-dir', WEBDIR, '--port', str(Port) ]
|
||||||
|
if Reload:
|
||||||
|
Kommando.append( '--reload' )
|
||||||
|
return Kommando
|
||||||
|
|
||||||
|
|
||||||
|
def Starten(Port):
|
||||||
|
if PortOffen( Port ):
|
||||||
|
if IstUnsereApp( Port ):
|
||||||
|
print( 'Server laeuft bereits: http://localhost:%d' % Port )
|
||||||
|
else:
|
||||||
|
print( 'FEHLER: Port %d ist von einem fremden Programm belegt.' % Port )
|
||||||
|
return 1
|
||||||
|
|
||||||
|
os.makedirs( LOGDIR, exist_ok=True )
|
||||||
|
logdatei = open( LOGDATEI, 'w' )
|
||||||
|
|
||||||
|
# vom Terminal abkoppeln, damit der Server das Schliessen der
|
||||||
|
# Konsole ueberlebt; eigene Prozessgruppe fuer sauberes Beenden
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
flags = ( subprocess.DETACHED_PROCESS
|
||||||
|
| subprocess.CREATE_NEW_PROCESS_GROUP )
|
||||||
|
prozess = subprocess.Popen(
|
||||||
|
UvicornKommando( Port, Reload=False ),
|
||||||
|
stdout=logdatei, stderr=subprocess.STDOUT,
|
||||||
|
cwd=BASISDIR, creationflags=flags )
|
||||||
|
else:
|
||||||
|
prozess = subprocess.Popen(
|
||||||
|
UvicornKommando( Port, Reload=False ),
|
||||||
|
stdout=logdatei, stderr=subprocess.STDOUT,
|
||||||
|
cwd=BASISDIR, start_new_session=True )
|
||||||
|
PidSchreiben( prozess.pid )
|
||||||
|
|
||||||
|
# warten bis der Port antwortet (oder der Prozess frueh stirbt)
|
||||||
|
for _ in range( 30 ):
|
||||||
|
if prozess.poll() is not None:
|
||||||
|
print( 'FEHLER: Server sofort wieder beendet - siehe %s' % LOGDATEI )
|
||||||
|
PidLoeschen()
|
||||||
|
return 1
|
||||||
|
if PortOffen( Port ):
|
||||||
|
print( 'Server laeuft: http://localhost:%d (PID %d, Log: %s)'
|
||||||
|
% (Port, prozess.pid, os.path.relpath( LOGDATEI, BASISDIR )) )
|
||||||
|
print( 'Hinweis: Hintergrundbetrieb ohne Auto-Reload - fuer '
|
||||||
|
'Entwicklung mit Reload "run" im Vordergrund nutzen.' )
|
||||||
|
return 0
|
||||||
|
time.sleep( 0.5 )
|
||||||
|
print( 'FEHLER: Server antwortet nicht auf Port %d - siehe %s'
|
||||||
|
% (Port, LOGDATEI) )
|
||||||
|
return 1
|
||||||
|
|
||||||
|
|
||||||
|
def BaumBeenden(Pid):
|
||||||
|
"""beendet einen Prozess samt Kindprozessen (portabel)"""
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
subprocess.run( ['taskkill', '/PID', str(Pid), '/T', '/F'],
|
||||||
|
capture_output=True )
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
os.killpg( os.getpgid( Pid ), signal.SIGTERM )
|
||||||
|
except (ProcessLookupError, PermissionError, OSError):
|
||||||
|
try:
|
||||||
|
os.kill( Pid, signal.SIGTERM )
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
# kurze Gnadenfrist, dann hart nachsetzen
|
||||||
|
for _ in range( 10 ):
|
||||||
|
if not PidLebt( Pid ):
|
||||||
|
return
|
||||||
|
time.sleep( 0.3 )
|
||||||
|
try:
|
||||||
|
os.killpg( os.getpgid( Pid ), signal.SIGKILL )
|
||||||
|
except (ProcessLookupError, PermissionError, OSError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def Stoppen(Port):
|
||||||
|
gefunden = False
|
||||||
|
|
||||||
|
Pid = PidLesen()
|
||||||
|
if Pid is not None and PidLebt( Pid ):
|
||||||
|
BaumBeenden( Pid )
|
||||||
|
gefunden = True
|
||||||
|
|
||||||
|
# Fallback: PID-Datei fehlt/veraltet, aber es lauscht noch jemand -
|
||||||
|
# dann die Wurzel des Python-Prozessbaums beenden (sonst startet ein
|
||||||
|
# --reload-Elternprozess den abgeschossenen Worker sofort neu)
|
||||||
|
if PortOffen( Port ):
|
||||||
|
LPid = ListenerPid( Port )
|
||||||
|
if LPid is not None and PidLebt( LPid ):
|
||||||
|
BaumBeenden( ProzessWurzel( LPid ) )
|
||||||
|
gefunden = True
|
||||||
|
|
||||||
|
# nachpruefen, ob der Port wirklich frei geworden ist
|
||||||
|
for _ in range( 10 ):
|
||||||
|
if not PortOffen( Port ):
|
||||||
|
break
|
||||||
|
time.sleep( 0.3 )
|
||||||
|
PidLoeschen()
|
||||||
|
|
||||||
|
if PortOffen( Port ):
|
||||||
|
print( 'WARNUNG: Auf Port %d antwortet immer noch etwas. Moeglicher '
|
||||||
|
'verwaister Prozess mit geerbtem Socket - Kandidaten mit '
|
||||||
|
'"netstat -ano" (Windows) bzw. "ss -tlnp" (Linux) suchen.'
|
||||||
|
% Port )
|
||||||
|
return 1
|
||||||
|
print( 'Beendet.' if gefunden else 'Es lief nichts.' )
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
def Status(Port):
|
||||||
|
Pid = PidLesen()
|
||||||
|
if PortOffen( Port ):
|
||||||
|
Zusatz = ''
|
||||||
|
if Pid is not None and PidLebt( Pid ):
|
||||||
|
# uvicorn haelt den Port oft in einem Kindprozess des in der
|
||||||
|
# PID-Datei vermerkten Hauptprozesses - das ist derselbe Server
|
||||||
|
Zusatz = ' (PID %d)' % Pid
|
||||||
|
elif ( LPid := ListenerPid( Port ) ) is not None:
|
||||||
|
Zusatz = ' (Listener-PID %d, keine PID-Datei)' % LPid
|
||||||
|
if IstUnsereApp( Port ):
|
||||||
|
print( 'LAEUFT: http://localhost:%d%s' % (Port, Zusatz) )
|
||||||
|
return 0
|
||||||
|
print( 'BELEGT: Port %d antwortet, aber nicht mit unserer App%s'
|
||||||
|
% (Port, Zusatz) )
|
||||||
|
return 1
|
||||||
|
if Pid is not None and PidLebt( Pid ):
|
||||||
|
print( 'UNKLAR: Prozess %d aus der PID-Datei lebt, aber Port %d '
|
||||||
|
'antwortet nicht (Startphase oder haengt?)' % (Pid, Port) )
|
||||||
|
return 1
|
||||||
|
print( 'GESTOPPT: kein Server auf Port %d' % Port )
|
||||||
|
return 1
|
||||||
|
|
||||||
|
|
||||||
|
def Vordergrund(Port):
|
||||||
|
print( 'Starte Web-Testinstanz im Vordergrund mit Auto-Reload '
|
||||||
|
'(Strg+C zum Beenden) ...' )
|
||||||
|
try:
|
||||||
|
return subprocess.call( UvicornKommando( Port, Reload=True ),
|
||||||
|
cwd=BASISDIR )
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ Main
|
||||||
|
if __name__ == '__main__':
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description='verwaltet die lokale Web-Testinstanz (FastAPI/uvicorn)' )
|
||||||
|
parser.add_argument( 'aktion', nargs='?', default='run',
|
||||||
|
choices=['start', 'stop', 'status', 'run'],
|
||||||
|
help='start=Hintergrund, stop=beenden, status=anzeigen, '
|
||||||
|
'run=Vordergrund mit Auto-Reload (Standard)' )
|
||||||
|
parser.add_argument( '--port', type=int, default=STANDARDPORT,
|
||||||
|
help='Port der Testinstanz (Standard: %d)' % STANDARDPORT )
|
||||||
|
argumente = parser.parse_args()
|
||||||
|
|
||||||
|
if argumente.aktion == 'start':
|
||||||
|
sys.exit( Starten( argumente.port ) )
|
||||||
|
elif argumente.aktion == 'stop':
|
||||||
|
sys.exit( Stoppen( argumente.port ) )
|
||||||
|
elif argumente.aktion == 'status':
|
||||||
|
sys.exit( Status( argumente.port ) )
|
||||||
|
else:
|
||||||
|
sys.exit( Vordergrund( argumente.port ) )
|
||||||
@@ -1,8 +1,7 @@
|
|||||||
# Python-Abhaengigkeiten fuer platz
|
# Python-Abhaengigkeiten fuer platz
|
||||||
#
|
#
|
||||||
# Aktuell werden nur Module aus der Standardbibliothek verwendet
|
# Der Kern (libs/) verwendet nur die Standardbibliothek.
|
||||||
# (configparser, xml.dom.minidom, random, ...).
|
# Die folgenden Pakete braucht nur die Web-API (web/main.py, Roadmap M1):
|
||||||
# Keine externen Pakete erforderlich.
|
fastapi>=0.110
|
||||||
#
|
uvicorn[standard]>=0.29
|
||||||
# Beispiel:
|
python-multipart>=0.0.9
|
||||||
# requests==2.31.0
|
|
||||||
|
|||||||
@@ -18,7 +18,8 @@ import unittest
|
|||||||
|
|
||||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'libs'))
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'libs'))
|
||||||
|
|
||||||
from Strukturdaten import Gruppe, Gruppen, Person, Sitzplatzverteilung, Strafliste, Tisch, Tische
|
from Strukturdaten import Gruppe, Gruppen, JSONConfig, Person, Sitzplatzverteilung, Strafliste, Tisch, Tische
|
||||||
|
from ga import Abstammung, Entwicklung, Farm, Zyklus, _StringAusdruck
|
||||||
|
|
||||||
IMAGES_DIR = os.path.join(os.path.dirname(__file__), '..', 'doc', 'images')
|
IMAGES_DIR = os.path.join(os.path.dirname(__file__), '..', 'doc', 'images')
|
||||||
|
|
||||||
@@ -169,5 +170,240 @@ class TestSechsTischeKreisDreiergruppen(unittest.TestCase):
|
|||||||
"Tische %s der Gruppe %s sind keine Nachbarn" % (SV.Gid_Tid[G.Id], G.Id) )
|
"Tische %s der Gruppe %s sind keine Nachbarn" % (SV.Gid_Tid[G.Id], G.Id) )
|
||||||
|
|
||||||
|
|
||||||
|
class TestJSONConfig(unittest.TestCase):
|
||||||
|
"""Parsen der bestellung.json: Gruppen, VIP-Bindung, Anzahl-Expansion."""
|
||||||
|
|
||||||
|
def test_gruppen_vips_und_sammelbuchung(self):
|
||||||
|
Daten = {
|
||||||
|
"gruppen": [
|
||||||
|
{
|
||||||
|
"name": "Brautpaar",
|
||||||
|
"tisch": 1,
|
||||||
|
"personen": [
|
||||||
|
{"vorname": "Julia", "nachname": "Brandt"},
|
||||||
|
{"vorname": "Daniel", "nachname": "Sommer", "titel": "Dr."},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Familie Huber",
|
||||||
|
"personen": [
|
||||||
|
{"vorname": "Anna", "nachname": "Huber"},
|
||||||
|
{"vorname": "Berta", "nachname": "Huber"},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Musikverein",
|
||||||
|
"anzahl": 5,
|
||||||
|
"personen": [ {"vorname": "Gast", "nachname": "Musikverein"} ],
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
PN, GN, VIPGruppe, VipHash, GruppenNamen = JSONConfig().HandleBestellung(Daten)
|
||||||
|
|
||||||
|
# VIP-Gruppe: beide ans Tisch 1 gebunden, nicht in den GA-Gruppen
|
||||||
|
self.assertEqual( VIPGruppe.Anzahl(), 2 )
|
||||||
|
self.assertEqual( set(VipHash.values()), {1} )
|
||||||
|
self.assertEqual( len(VipHash), 2 )
|
||||||
|
|
||||||
|
# regulaere Gruppen: Familie Huber (2) + Musikverein (5x expandiert) = 7
|
||||||
|
self.assertEqual( GN.NLeute, 7 )
|
||||||
|
self.assertEqual( len(GN.GruppenListe), 2 )
|
||||||
|
|
||||||
|
# Sammelbuchung: die eine Musikverein-Person wurde 5x vervielfacht
|
||||||
|
Groessen = sorted( G.Anzahl() for G in GN.GruppenListe )
|
||||||
|
self.assertEqual( Groessen, [2, 5] )
|
||||||
|
|
||||||
|
# Anzeigenamen kommen durch
|
||||||
|
self.assertIn( "Familie Huber", GruppenNamen.values() )
|
||||||
|
self.assertIn( "Musikverein", GruppenNamen.values() )
|
||||||
|
|
||||||
|
def test_fehlende_pflichtfelder_werfen_fehler(self):
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
JSONConfig().HandleBestellung( {"keine_gruppen": []} )
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
JSONConfig().HandleBestellung(
|
||||||
|
{"gruppen": [ {"personen": [ {"vorname": "Nur"} ]} ]} )
|
||||||
|
|
||||||
|
|
||||||
|
class TestStringAusdruck(unittest.TestCase):
|
||||||
|
"""Der sichere Zyklus-Ausdruck-Auswerter (Ersatz fuer eval)."""
|
||||||
|
|
||||||
|
def test_verkettung_und_vervielfachung(self):
|
||||||
|
self.assertEqual(
|
||||||
|
_StringAusdruck("'e,'+'s,z,m,j,z,'*3+'s'"),
|
||||||
|
'e,s,z,m,j,z,s,z,m,j,z,s,z,m,j,z,s' )
|
||||||
|
self.assertEqual( _StringAusdruck("'e,s'"), 'e,s' )
|
||||||
|
|
||||||
|
def test_lehnt_code_ab(self):
|
||||||
|
# kein Funktionsaufruf, keine Namen, kein Import
|
||||||
|
for boese in ("__import__('os')", "open('x')", "1+1", "a+'b'"):
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
_StringAusdruck(boese)
|
||||||
|
|
||||||
|
|
||||||
|
class TestEntwicklung(unittest.TestCase):
|
||||||
|
"""Das Beobachtungsobjekt zeichnet den Verlauf auf und rendert SVG."""
|
||||||
|
|
||||||
|
class _L:
|
||||||
|
def __init__(self, value):
|
||||||
|
self.value = value
|
||||||
|
|
||||||
|
def test_erfassen_und_svg(self):
|
||||||
|
E = Entwicklung()
|
||||||
|
E.erfassen( 'e', [self._L(-200), self._L(-150), self._L(-90)] )
|
||||||
|
E.erfassen( 's', [self._L(-90), self._L(-70)] )
|
||||||
|
E.erfassen( 'm', [self._L(-70), self._L(-40)] )
|
||||||
|
|
||||||
|
self.assertEqual( len(E.Punkte), 3 )
|
||||||
|
# je Punkt: (index, aktion, best, schnitt, schlecht, N)
|
||||||
|
_i, aktion, best, schnitt, schlecht, n = E.Punkte[0]
|
||||||
|
self.assertEqual( aktion, 'e' )
|
||||||
|
self.assertEqual( best, -90 )
|
||||||
|
self.assertEqual( schlecht, -200 )
|
||||||
|
self.assertEqual( n, 3 )
|
||||||
|
|
||||||
|
Pfad = os.path.join( IMAGES_DIR, 'test_entwicklung.svg' )
|
||||||
|
E.alsSVG( Pfad )
|
||||||
|
with open(Pfad) as f:
|
||||||
|
svg = f.read()
|
||||||
|
self.assertIn( '<svg', svg )
|
||||||
|
# 3 Wertigkeitskurven (best/schnitt/schlecht) + 1 Pool-Groessenkurve
|
||||||
|
self.assertEqual( svg.count('<polyline'), 4 )
|
||||||
|
# das zweite Panel zeigt die Anzahl erzeugter Verteilungen im Pool
|
||||||
|
self.assertIn( 'Anzahl erzeugter Verteilungen im Pool', svg )
|
||||||
|
self.assertIn( 'stroke="#4060a0"', svg ) # Pool-Kurve
|
||||||
|
|
||||||
|
def test_leere_entwicklung_wirft_beim_svg(self):
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
Entwicklung().alsSVG( os.path.join(IMAGES_DIR, 'leer.svg') )
|
||||||
|
|
||||||
|
|
||||||
|
class TestAdaptiverZyklus(unittest.TestCase):
|
||||||
|
"""Der adaptive Zyklus startet mit vielen Loesungen, laesst die
|
||||||
|
Population schrumpfen und bricht bei Konvergenz ab."""
|
||||||
|
|
||||||
|
class _L:
|
||||||
|
"""minimale GA-Loesung: fester Wert, Mutation aendert nichts (so
|
||||||
|
konvergiert der beste Wert sofort -> Abbruch nach 'Geduld')."""
|
||||||
|
def __init__(self, *a, **k):
|
||||||
|
self.value = -100
|
||||||
|
def mutieren(self):
|
||||||
|
return self
|
||||||
|
def __eq__(self, other):
|
||||||
|
return self.value == other.value
|
||||||
|
def __lt__(self, other):
|
||||||
|
return self.value < other.value
|
||||||
|
|
||||||
|
def _zyklus(self, **params):
|
||||||
|
Z = Zyklus()
|
||||||
|
Z.Modus = 'adaptiv'
|
||||||
|
Z.Adaptiv = dict(Zyklus.AdaptivDefaults)
|
||||||
|
Z.Adaptiv.update(params)
|
||||||
|
return Z
|
||||||
|
|
||||||
|
def test_population_schrumpft_und_bricht_bei_konvergenz_ab(self):
|
||||||
|
Z = self._zyklus( Start=40, Schrumpfung=0.85, MinPopulation=5,
|
||||||
|
MaxGenerationen=50, Geduld=3, Schwelle=1.0 )
|
||||||
|
F = Farm( Z, self._L )
|
||||||
|
|
||||||
|
# Pool-Groessen je 's'-Aufzeichnung (Ende jeder Generation)
|
||||||
|
pop_pro_gen = [ p[5] for p in F.Entwicklung.Punkte if p[1] == 's' ]
|
||||||
|
# monoton fallend (Population schrumpft) ...
|
||||||
|
self.assertTrue( all( a >= b for a, b in zip(pop_pro_gen, pop_pro_gen[1:]) ),
|
||||||
|
"Population muss von Generation zu Generation schrumpfen: %s"
|
||||||
|
% pop_pro_gen )
|
||||||
|
self.assertLess( pop_pro_gen[-1], pop_pro_gen[0] )
|
||||||
|
# ... und da nichts besser wird, nach Geduld(=3) Generationen Abbruch,
|
||||||
|
# also klar vor MaxGenerationen(=50).
|
||||||
|
self.assertLessEqual( len(pop_pro_gen), 4 )
|
||||||
|
|
||||||
|
def test_population_faellt_nicht_unter_min(self):
|
||||||
|
Z = self._zyklus( Start=8, Schrumpfung=0.5, MinPopulation=5,
|
||||||
|
MaxGenerationen=10, Geduld=99, Schwelle=1.0 )
|
||||||
|
F = Farm( Z, self._L )
|
||||||
|
pop_pro_gen = [ p[5] for p in F.Entwicklung.Punkte if p[1] == 's' ]
|
||||||
|
self.assertTrue( all( n >= 5 for n in pop_pro_gen ),
|
||||||
|
"MinPopulation=5 darf nicht unterschritten werden: %s"
|
||||||
|
% pop_pro_gen )
|
||||||
|
|
||||||
|
|
||||||
|
class TestAbstammung(unittest.TestCase):
|
||||||
|
"""Der Stammbaum vergibt hierarchische Ids, aus denen sich die Abstammung
|
||||||
|
ablesen laesst, und zeichnet einen Baum."""
|
||||||
|
|
||||||
|
class _L:
|
||||||
|
"""GA-Loesung, deren Mutation den Wert leicht verbessert (damit ueber
|
||||||
|
Generationen ein mehrstufiger Ast entsteht)."""
|
||||||
|
def __init__(self, *a, **k):
|
||||||
|
self.value = -100
|
||||||
|
def mutieren(self):
|
||||||
|
self.value = self.value + 1
|
||||||
|
return self
|
||||||
|
def __eq__(self, other):
|
||||||
|
return self.value == other.value
|
||||||
|
def __lt__(self, other):
|
||||||
|
return self.value < other.value
|
||||||
|
|
||||||
|
def _zyklus(self, **params):
|
||||||
|
Z = Zyklus()
|
||||||
|
Z.Modus = 'adaptiv'
|
||||||
|
Z.Adaptiv = dict(Zyklus.AdaptivDefaults)
|
||||||
|
Z.Adaptiv.update(params)
|
||||||
|
return Z
|
||||||
|
|
||||||
|
def test_fortlaufende_nummern_ids(self):
|
||||||
|
Z = self._zyklus( Start=5, Schrumpfung=1.0, MinPopulation=5,
|
||||||
|
MaxGenerationen=3, Geduld=99, Schwelle=0.0 )
|
||||||
|
F = Farm( Z, self._L )
|
||||||
|
Knoten = F.Abstammung.Knoten
|
||||||
|
|
||||||
|
# alle Ids sind fortlaufende Nummern 1..N ueber alle Loesungen
|
||||||
|
Ids = sorted(Knoten)
|
||||||
|
self.assertTrue( all( isinstance(Id, int) for Id in Ids ) )
|
||||||
|
self.assertEqual( Ids, list(range(1, len(Ids) + 1)) )
|
||||||
|
|
||||||
|
# genau die 5 Startloesungen sind Wurzeln (kein Vorgaenger),
|
||||||
|
# alle uebrigen haben einen Vorgaenger, der als Knoten existiert
|
||||||
|
wurzeln = [ Id for Id, K in Knoten.items() if K['eltern'] is None ]
|
||||||
|
self.assertEqual( len(wurzeln), 5 )
|
||||||
|
for Id, K in Knoten.items():
|
||||||
|
if K['eltern'] is None:
|
||||||
|
continue
|
||||||
|
self.assertIn( K['eltern'], Knoten )
|
||||||
|
self.assertNotEqual( K['eltern'], Id )
|
||||||
|
|
||||||
|
def test_abstammung_ueber_vorgaenger(self):
|
||||||
|
# Abstammung wird ueber den gemerkten Vorgaenger verfolgt, nicht ueber
|
||||||
|
# die Id selbst (Ids sind schlichte Nummern)
|
||||||
|
A = Abstammung()
|
||||||
|
A.erfassen( 1, None, 0, -100, 'e' )
|
||||||
|
A.erfassen( 2, 1, 1, -99, 'm' )
|
||||||
|
A.erfassen( 3, 2, 2, -98, 'm' )
|
||||||
|
kette = []
|
||||||
|
Id = 3
|
||||||
|
while Id is not None:
|
||||||
|
kette.append(Id)
|
||||||
|
Id = A.Knoten[Id]['eltern']
|
||||||
|
self.assertEqual( kette, [3, 2, 1] )
|
||||||
|
|
||||||
|
def test_svg_hebt_beste_hervor(self):
|
||||||
|
Z = self._zyklus( Start=4, Schrumpfung=1.0, MinPopulation=4,
|
||||||
|
MaxGenerationen=2, Geduld=99, Schwelle=0.0 )
|
||||||
|
F = Farm( Z, self._L )
|
||||||
|
Bester = F.Bester()
|
||||||
|
Pfad = os.path.join( IMAGES_DIR, 'test_abstammung.svg' )
|
||||||
|
F.Abstammung.alsSVG( Pfad, HervorId=Bester._absid )
|
||||||
|
with open(Pfad) as f:
|
||||||
|
svg = f.read()
|
||||||
|
self.assertIn( '<svg', svg )
|
||||||
|
self.assertIn( 'Abstammung der Loesungen', svg )
|
||||||
|
# die Id der besten Loesung ist als Beschriftung enthalten
|
||||||
|
self.assertIn( '>%s</text>' % Bester._absid, svg )
|
||||||
|
|
||||||
|
def test_leere_abstammung_wirft_beim_svg(self):
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
Abstammung().alsSVG( os.path.join(IMAGES_DIR, 'leer_abst.svg') )
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
@@ -0,0 +1,584 @@
|
|||||||
|
"""
|
||||||
|
REST-API um den bestehenden Sitzplatz-Kern (Meilenstein 1 der Roadmap).
|
||||||
|
|
||||||
|
Session-basiert, nichts wird dauerhaft gespeichert: jede Sitzung lebt
|
||||||
|
im Speicher des Servers und verfaellt nach 24 Stunden (TTL) — bewusst
|
||||||
|
ohne Accounts/DB, siehe Roadmap M1 ("schont Datenschutz-Aufwand").
|
||||||
|
|
||||||
|
Endpunkte (siehe auch /docs — interaktive Swagger-UI von FastAPI):
|
||||||
|
POST /sitzung — legt eine Arbeits-Session an
|
||||||
|
GET /sitzung/{id} — Status der Session
|
||||||
|
POST /sitzung/{id}/tische — Tisch-Layout als JSON (Ersatz tische.ini)
|
||||||
|
POST /sitzung/{id}/personen — Gaesteliste als CSV-Upload (Ersatz bestellung.json)
|
||||||
|
POST /sitzung/{id}/berechnen — startet die GA-Optimierung; liefert bis zu
|
||||||
|
?varianten=N unterschiedliche Loesungen (M2)
|
||||||
|
GET /sitzung/{id}/ergebnis — alle Varianten des letzten Laufs als JSON
|
||||||
|
GET /sitzung/{id}/ergebnis.svg — eine Variante als SVG (?variante=k, 1 = beste)
|
||||||
|
|
||||||
|
Start (lokale Testinstanz, siehe bin/run_web.bat / bin/run_web.sh):
|
||||||
|
python -m uvicorn main:app --reload --app-dir web
|
||||||
|
"""
|
||||||
|
|
||||||
|
import ast
|
||||||
|
import configparser
|
||||||
|
import math
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import tempfile
|
||||||
|
import threading
|
||||||
|
import time
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
# Projektwurzel und Pfade robust aus der eigenen Lage ableiten, damit der
|
||||||
|
# Server auch ohne vorheriges setenv laeuft (PLATZ_* hat Vorrang, falls gesetzt)
|
||||||
|
BASISDIR = os.path.dirname( os.path.dirname( os.path.abspath( __file__ ) ) )
|
||||||
|
LIBSDIR = os.environ.get( 'PLATZ_LIBS', os.path.join( BASISDIR, 'libs' ) )
|
||||||
|
CFGDIR = os.environ.get( 'PLATZ_CFG', os.path.join( BASISDIR, 'cfg' ) )
|
||||||
|
if LIBSDIR not in sys.path:
|
||||||
|
sys.path.insert( 0, LIBSDIR )
|
||||||
|
|
||||||
|
from fastapi import FastAPI, File, HTTPException, Query, UploadFile
|
||||||
|
from fastapi.responses import Response
|
||||||
|
from fastapi.staticfiles import StaticFiles
|
||||||
|
from pydantic import BaseModel, Field
|
||||||
|
|
||||||
|
from ga import Farm, Zyklus
|
||||||
|
from CSVConfig import CSVConfig
|
||||||
|
from Farben import Farbschema
|
||||||
|
from Strukturdaten import Sitzplatzverteilung, Strafliste, Tisch, Tische
|
||||||
|
|
||||||
|
app = FastAPI(
|
||||||
|
title='Sitz & Platz — API',
|
||||||
|
description='Sitzplatz-Optimierung per genetischem Algorithmus '
|
||||||
|
'(Meilenstein 1: Session-basiert, ohne Accounts)',
|
||||||
|
version='0.1.0' )
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------- GA-Konfig
|
||||||
|
# Zyklus und Strafliste einmal beim Start laden (wie in libs/platz.py):
|
||||||
|
# zyklus.cfg und strafen.cfg direkt aus dem cfg-Verzeichnis (PLATZ_CFG bzw.
|
||||||
|
# Projekt-cfg). GA-Profil per Umgebungsvariable PLATZ_ZYKLUSART (Vorgabe:
|
||||||
|
# Adaptiv), Strafpunkte-Profil per PLATZ_STRAFENART (Vorgabe: default) —
|
||||||
|
# analog zum Schalter --strafen in libs/platz.py.
|
||||||
|
ZYKLUSDATEI = os.path.join( CFGDIR, 'zyklus.cfg' )
|
||||||
|
STRAFENDATEI = os.path.join( CFGDIR, 'strafen.cfg' )
|
||||||
|
ZYKLUSART = os.environ.get( 'PLATZ_ZYKLUSART', 'Adaptiv' )
|
||||||
|
STRAFENART = os.environ.get( 'PLATZ_STRAFENART', 'default' )
|
||||||
|
FARBENDATEI = os.path.join( CFGDIR, 'farben.cfg' )
|
||||||
|
FARBENART = os.environ.get( 'PLATZ_FARBENART', 'grosse_gruppen' )
|
||||||
|
|
||||||
|
GAZyklus = Zyklus()
|
||||||
|
GAZyklus.laden( ZYKLUSDATEI, ZYKLUSART )
|
||||||
|
|
||||||
|
# Strafprofile werden bei Bedarf geladen und gecacht, damit sich in der GUI
|
||||||
|
# verschiedene Profile (z.B. 'default' vs 'locker') auswaehlen und vergleichen
|
||||||
|
# lassen. Das Default-Profil wird schon beim Start geladen (faellt frueh auf,
|
||||||
|
# falls die Datei/Sektion kaputt ist).
|
||||||
|
StrafProfile = {}
|
||||||
|
|
||||||
|
|
||||||
|
def strafprofil(Name):
|
||||||
|
"""liefert (gecacht) die Strafliste einer Sektion aus strafen.cfg;
|
||||||
|
wirft ValueError bei unbekannter Sektion"""
|
||||||
|
if Name not in StrafProfile:
|
||||||
|
SL = Strafliste()
|
||||||
|
SL.laden( STRAFENDATEI, Name )
|
||||||
|
StrafProfile[Name] = SL
|
||||||
|
return StrafProfile[Name]
|
||||||
|
|
||||||
|
|
||||||
|
def strafprofil_namen():
|
||||||
|
"""alle in strafen.cfg vorhandenen Profilnamen (fuer die GUI-Auswahl)"""
|
||||||
|
cfg = configparser.ConfigParser()
|
||||||
|
cfg.read( STRAFENDATEI )
|
||||||
|
return cfg.sections()
|
||||||
|
|
||||||
|
|
||||||
|
strafprofil( STRAFENART ) # Default vorwaermen / frueh scheitern
|
||||||
|
# Farbprofil fuer die SVG-Ausgabe; faellt bei fehlender Datei/Sektion auf die
|
||||||
|
# eingebaute Palette zurueck (Farbschema=None), damit der Server trotzdem laeuft.
|
||||||
|
try:
|
||||||
|
Farben = Farbschema().laden( FARBENDATEI, FARBENART )
|
||||||
|
except (ValueError, OSError):
|
||||||
|
Farben = None
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------- Sessions
|
||||||
|
SESSION_TTL_SEKUNDEN = 24 * 3600
|
||||||
|
Sessions = {}
|
||||||
|
SessionsLock = threading.Lock()
|
||||||
|
|
||||||
|
|
||||||
|
def _SessionsAufraeumen():
|
||||||
|
"""Sessions loeschen, deren TTL abgelaufen ist (Datenschutz per Design)"""
|
||||||
|
Jetzt = time.time()
|
||||||
|
with SessionsLock:
|
||||||
|
Abgelaufen = [ Sid for Sid, S in Sessions.items()
|
||||||
|
if Jetzt - S['erzeugt'] > SESSION_TTL_SEKUNDEN ]
|
||||||
|
for Sid in Abgelaufen:
|
||||||
|
del Sessions[Sid]
|
||||||
|
|
||||||
|
|
||||||
|
def _GibSession(SitzungsId):
|
||||||
|
_SessionsAufraeumen()
|
||||||
|
with SessionsLock:
|
||||||
|
S = Sessions.get( SitzungsId )
|
||||||
|
if S is None:
|
||||||
|
raise HTTPException( status_code=404,
|
||||||
|
detail='Sitzung nicht gefunden oder abgelaufen (TTL 24h)' )
|
||||||
|
return S
|
||||||
|
|
||||||
|
|
||||||
|
# ------------------------------------------------------------ API-Modelle
|
||||||
|
class TischEingabe(BaseModel):
|
||||||
|
"""ein Tisch aus dem Frontend (Ersatz fuer eine tische.ini-Section)"""
|
||||||
|
id: int | None = Field( default=None, description='Tisch-Id; leer = fortlaufend' )
|
||||||
|
nummer: int | None = Field( default=None, description='Anzeigenummer; leer = wie Id' )
|
||||||
|
hof: int = Field( default=1, description='Hof/Raum-Nummer' )
|
||||||
|
plaetze: int = Field( gt=0, le=100, description='Anzahl Sitzplaetze' )
|
||||||
|
x: float = Field( description='X-Koordinate im Raster' )
|
||||||
|
y: float = Field( description='Y-Koordinate im Raster' )
|
||||||
|
nachbarn: list[int] | None = Field( default=None,
|
||||||
|
description='explizite Nachbar-Tisch-Ids; leer = aus Naehe ableiten' )
|
||||||
|
|
||||||
|
|
||||||
|
class TischLayout(BaseModel):
|
||||||
|
tische: list[TischEingabe] = Field( min_length=1 )
|
||||||
|
nachbarRadius: float = Field( default=1.5, gt=0,
|
||||||
|
description='max. Rasterabstand, bis zu dem zwei Tische als '
|
||||||
|
'Nachbarn gelten (nur fuer Tische ohne explizite Liste)' )
|
||||||
|
|
||||||
|
|
||||||
|
# --------------------------------------------------------------- Hilfen
|
||||||
|
def _NachbarnAbleiten(TischListe, Radius):
|
||||||
|
"""Nachbarliste aus raeumlicher Naehe der Koordinaten ableiten
|
||||||
|
(Roadmap M1: Ersatz fuer manuelle Nachbarliste-Pflege).
|
||||||
|
Explizit angegebene Nachbarn bleiben erhalten und werden
|
||||||
|
beidseitig ergaenzt."""
|
||||||
|
Nachbarn = { T.id: set( T.nachbarn or [] ) for T in TischListe }
|
||||||
|
for T1 in TischListe:
|
||||||
|
for T2 in TischListe:
|
||||||
|
if T1.id == T2.id:
|
||||||
|
continue
|
||||||
|
if T1.nachbarn is None or T2.nachbarn is None:
|
||||||
|
Abstand = math.dist( (T1.x, T1.y), (T2.x, T2.y) )
|
||||||
|
if Abstand <= Radius:
|
||||||
|
Nachbarn[T1.id].add( T2.id )
|
||||||
|
Nachbarn[T2.id].add( T1.id )
|
||||||
|
# expliziten Angaben beidseitig machen
|
||||||
|
for Tid, Menge in Nachbarn.items():
|
||||||
|
for NachbarId in Menge:
|
||||||
|
if NachbarId in Nachbarn:
|
||||||
|
Nachbarn[NachbarId].add( Tid )
|
||||||
|
return { Tid: sorted(Menge) for Tid, Menge in Nachbarn.items() }
|
||||||
|
|
||||||
|
|
||||||
|
def _TischeBauen(S):
|
||||||
|
"""baut aus dem gespeicherten Layout frische Tisch-Objekte
|
||||||
|
(pro Berechnung neu, damit keine Reste vorheriger Laeufe kleben)"""
|
||||||
|
TE = Tische( [] )
|
||||||
|
for T in S['tische']:
|
||||||
|
TE.Tisch_dazu( Tisch(
|
||||||
|
T['id'],
|
||||||
|
Plaetze=T['plaetze'],
|
||||||
|
Koordinaten=( T['x'], T['y'] ),
|
||||||
|
Nachbarliste=T['nachbarn'],
|
||||||
|
Hof=T['hof'],
|
||||||
|
Nummer=T['nummer'] ) )
|
||||||
|
return TE
|
||||||
|
|
||||||
|
|
||||||
|
def _VarianteJSON(SV, GruppenNamen, Nr):
|
||||||
|
"""baut die JSON-Darstellung EINER Loesung (eine Variante)"""
|
||||||
|
def GruppeVonPerson(P):
|
||||||
|
try:
|
||||||
|
G = SV.Gruppen.GruppeVonPid( P.Id )
|
||||||
|
return GruppenNamen.get( G.Id, 'Gruppe %s' % G.Id )
|
||||||
|
except KeyError:
|
||||||
|
return 'fixiert'
|
||||||
|
|
||||||
|
TischListe = []
|
||||||
|
for T in SV.Tische:
|
||||||
|
Personen = [ {
|
||||||
|
'titel': P._Titel,
|
||||||
|
'vorname': P._Vorname,
|
||||||
|
'nachname': P._Name,
|
||||||
|
'gruppe': GruppeVonPerson( P ),
|
||||||
|
} for P in T ]
|
||||||
|
Personen.sort( key=lambda p: (p['gruppe'], p['nachname'], p['vorname']) )
|
||||||
|
TischListe.append( {
|
||||||
|
'id': T.Id,
|
||||||
|
'nummer': T.Nummer,
|
||||||
|
'hof': T.Hof,
|
||||||
|
'plaetze': T.Plaetze,
|
||||||
|
'besetzt': T.besetztePlaetze(),
|
||||||
|
'frei': T.freiePlaetze(),
|
||||||
|
'wert': SV.TischWertGet( T ),
|
||||||
|
'personen': Personen,
|
||||||
|
} )
|
||||||
|
TischListe.sort( key=lambda t: t['id'] )
|
||||||
|
|
||||||
|
GruppenListe = []
|
||||||
|
for G in SV.Gruppen:
|
||||||
|
GruppenListe.append( {
|
||||||
|
'id': G.Id,
|
||||||
|
'name': GruppenNamen.get( G.Id, 'Gruppe %s' % G.Id ),
|
||||||
|
'anzahl': G.Anzahl(),
|
||||||
|
'teilungen': SV.GruppenTeilungGet( G ),
|
||||||
|
'wert': SV.GruppenWertGet( G ),
|
||||||
|
} )
|
||||||
|
GruppenListe.sort( key=lambda g: g['id'] )
|
||||||
|
|
||||||
|
# Vergleichs-Kennzahlen (Roadmap M2: Wertigkeit, Gruppentrennungen,
|
||||||
|
# allein sitzende Personen — LeuteAllein zaehlt nur Personen aus
|
||||||
|
# mehrkoepfigen Gruppen ohne Gruppenmitglied am Tisch)
|
||||||
|
Kennzahlen = {
|
||||||
|
'wertigkeit': SV.value,
|
||||||
|
'getrennteGruppen': sum( 1 for G in GruppenListe if G['teilungen'] > 0 ),
|
||||||
|
'teilungenGesamt': sum( G['teilungen'] for G in GruppenListe ),
|
||||||
|
'alleinePersonen': sum( len( SV.LeuteAllein(T) ) for T in SV.Tische ),
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
'nr': Nr,
|
||||||
|
'wertigkeit': SV.value,
|
||||||
|
'gruppenId': SV.getGruppenId(),
|
||||||
|
'personenId': SV.getPersonenId(),
|
||||||
|
'kennzahlen': Kennzahlen,
|
||||||
|
'tische': TischListe,
|
||||||
|
'gruppen': GruppenListe,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def _ErgebnisJSON(S):
|
||||||
|
"""baut die JSON-Darstellung aller Varianten des letzten Laufs"""
|
||||||
|
GruppenNamen = S.get( 'gruppenNamen', {} )
|
||||||
|
return {
|
||||||
|
'lauf': S['laeufe'],
|
||||||
|
'strafen': S.get( 'strafen', STRAFENART ), # verwendetes Strafprofil
|
||||||
|
'varianten': [ _VarianteJSON( SV, GruppenNamen, Nr + 1 )
|
||||||
|
for Nr, SV in enumerate( S['ergebnisse'] ) ],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# --------------------------------------------------------------- Endpunkte
|
||||||
|
@app.post( '/sitzung', status_code=201 )
|
||||||
|
def SitzungAnlegen():
|
||||||
|
"""legt eine neue Arbeits-Session an (TTL 24h, nur im Speicher)"""
|
||||||
|
_SessionsAufraeumen()
|
||||||
|
SitzungsId = uuid.uuid4().hex
|
||||||
|
with SessionsLock:
|
||||||
|
Sessions[SitzungsId] = {
|
||||||
|
'erzeugt': time.time(),
|
||||||
|
'tische': None,
|
||||||
|
'personen': None,
|
||||||
|
'ergebnisse': [], # Varianten des letzten Laufs (beste zuerst)
|
||||||
|
'laeufe': 0, # wie oft .../berechnen aufgerufen wurde
|
||||||
|
}
|
||||||
|
return { 'id': SitzungsId, 'ttlStunden': SESSION_TTL_SEKUNDEN // 3600 }
|
||||||
|
|
||||||
|
|
||||||
|
@app.get( '/sitzung/{SitzungsId}' )
|
||||||
|
def SitzungStatus(SitzungsId: str):
|
||||||
|
"""Status: was ist schon da, was fehlt noch"""
|
||||||
|
S = _GibSession( SitzungsId )
|
||||||
|
return {
|
||||||
|
'id': SitzungsId,
|
||||||
|
'tische': len( S['tische'] ) if S['tische'] else 0,
|
||||||
|
'personen': S['personen']['nLeute'] if S['personen'] else 0,
|
||||||
|
'vips': S['personen']['nVips'] if S['personen'] else 0,
|
||||||
|
'berechnet': len( S['ergebnisse'] ) > 0,
|
||||||
|
'laeufe': S['laeufe'],
|
||||||
|
'varianten': len( S['ergebnisse'] ),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@app.post( '/sitzung/{SitzungsId}/tische' )
|
||||||
|
def TischeSetzen(SitzungsId: str, Layout: TischLayout):
|
||||||
|
"""Tisch-Layout uebernehmen (JSON-Ersatz fuer tische.ini);
|
||||||
|
Nachbarschaft wird aus raeumlicher Naehe abgeleitet"""
|
||||||
|
S = _GibSession( SitzungsId )
|
||||||
|
|
||||||
|
# Ids vergeben/pruefen
|
||||||
|
NaechsteId = 1
|
||||||
|
Vergeben = set()
|
||||||
|
for T in Layout.tische:
|
||||||
|
if T.id is None:
|
||||||
|
while NaechsteId in Vergeben:
|
||||||
|
NaechsteId = NaechsteId + 1
|
||||||
|
T.id = NaechsteId
|
||||||
|
if T.id in Vergeben:
|
||||||
|
raise HTTPException( status_code=400,
|
||||||
|
detail='Tisch-Id %d ist doppelt' % T.id )
|
||||||
|
Vergeben.add( T.id )
|
||||||
|
|
||||||
|
Nachbarn = _NachbarnAbleiten( Layout.tische, Layout.nachbarRadius )
|
||||||
|
|
||||||
|
S['tische'] = [ {
|
||||||
|
'id': T.id,
|
||||||
|
'nummer': T.nummer if T.nummer is not None else T.id,
|
||||||
|
'hof': T.hof,
|
||||||
|
'plaetze': T.plaetze,
|
||||||
|
'x': T.x,
|
||||||
|
'y': T.y,
|
||||||
|
'nachbarn': Nachbarn[T.id],
|
||||||
|
} for T in Layout.tische ]
|
||||||
|
# Nachbar-Radius fuer den Rueckweg merken (GET .../tische), damit der
|
||||||
|
# grafische Editor dasselbe Layout inkl. Radius wieder laden kann.
|
||||||
|
S['nachbarRadius'] = Layout.nachbarRadius
|
||||||
|
S['ergebnisse'] = []
|
||||||
|
|
||||||
|
return {
|
||||||
|
'tische': S['tische'],
|
||||||
|
'plaetzeGesamt': sum( T['plaetze'] for T in S['tische'] ),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@app.get( '/sitzung/{SitzungsId}/tische' )
|
||||||
|
def TischeHolen(SitzungsId: str):
|
||||||
|
"""das gespeicherte Tisch-Layout zurueckgeben (fuer den grafischen
|
||||||
|
Editor: Layout aus einer geteilten Session wieder aufnehmen).
|
||||||
|
Die abgeleitete Nachbarliste ist pro Tisch enthalten; der zuletzt
|
||||||
|
verwendete nachbarRadius kommt separat mit (Vorgabe 1.5)."""
|
||||||
|
S = _GibSession( SitzungsId )
|
||||||
|
return {
|
||||||
|
'tische': S['tische'] or [],
|
||||||
|
'nachbarRadius': S.get( 'nachbarRadius', 1.5 ),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@app.post( '/sitzung/{SitzungsId}/tische-datei' )
|
||||||
|
def TischDateiHochladen(SitzungsId: str, datei: UploadFile = File(...)):
|
||||||
|
"""bestehende tische.ini hochladen (gleiches Format wie fuer die CLI,
|
||||||
|
z.B. work/hochzeit/tische.ini); die Nachbarliste aus der Datei
|
||||||
|
wird unveraendert uebernommen, nichts wird neu abgeleitet"""
|
||||||
|
S = _GibSession( SitzungsId )
|
||||||
|
Rohdaten = datei.file.read()
|
||||||
|
try:
|
||||||
|
Text = Rohdaten.decode( 'utf-8-sig' )
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
Text = Rohdaten.decode( 'cp1252' )
|
||||||
|
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
try:
|
||||||
|
config.read_string( Text )
|
||||||
|
except configparser.Error as Fehler:
|
||||||
|
raise HTTPException( status_code=400,
|
||||||
|
detail='tische.ini nicht lesbar: %s' % Fehler )
|
||||||
|
if not config.sections():
|
||||||
|
raise HTTPException( status_code=400,
|
||||||
|
detail='tische.ini enthaelt keine Tisch-Sektionen ([1], [2], ...)' )
|
||||||
|
|
||||||
|
# gleiche Feldsemantik wie Tische.laden() in Strukturdaten.py,
|
||||||
|
# aber mit ast.literal_eval statt eval (Upload = fremde Eingabe)
|
||||||
|
TischListe = []
|
||||||
|
for Sektion in config.sections():
|
||||||
|
try:
|
||||||
|
Tid = int( Sektion )
|
||||||
|
Plaetze = int( ast.literal_eval( config.get( Sektion, 'Plaetze' ) ) )
|
||||||
|
Koords = ast.literal_eval( config.get( Sektion, 'Koordinaten' ) )
|
||||||
|
Nachbarn = list( ast.literal_eval(
|
||||||
|
config.get( Sektion, 'Nachbarliste' ) ) )
|
||||||
|
Nummer = int( ast.literal_eval(
|
||||||
|
config.get( Sektion, 'Nummer', fallback=Sektion ) ) )
|
||||||
|
Hof = int( ast.literal_eval(
|
||||||
|
config.get( Sektion, 'Hof', fallback='1' ) ) )
|
||||||
|
except (ValueError, SyntaxError, configparser.Error) as Fehler:
|
||||||
|
raise HTTPException( status_code=400,
|
||||||
|
detail='tische.ini, Sektion [%s]: %s' % (Sektion, Fehler) )
|
||||||
|
if Plaetze < 1:
|
||||||
|
raise HTTPException( status_code=400,
|
||||||
|
detail='tische.ini, Sektion [%s]: Plaetze muss >= 1 sein'
|
||||||
|
% Sektion )
|
||||||
|
TischListe.append( {
|
||||||
|
'id': Tid,
|
||||||
|
'nummer': Nummer,
|
||||||
|
'hof': Hof,
|
||||||
|
'plaetze': Plaetze,
|
||||||
|
'x': float( Koords[0] ),
|
||||||
|
'y': float( Koords[1] ),
|
||||||
|
'nachbarn': sorted( int(N) for N in Nachbarn ),
|
||||||
|
} )
|
||||||
|
|
||||||
|
Ids = [ T['id'] for T in TischListe ]
|
||||||
|
if len( Ids ) != len( set( Ids ) ):
|
||||||
|
raise HTTPException( status_code=400,
|
||||||
|
detail='tische.ini enthaelt doppelte Tisch-Ids' )
|
||||||
|
|
||||||
|
S['tische'] = TischListe
|
||||||
|
S['ergebnisse'] = []
|
||||||
|
return {
|
||||||
|
'tische': S['tische'],
|
||||||
|
'plaetzeGesamt': sum( T['plaetze'] for T in S['tische'] ),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@app.post( '/sitzung/{SitzungsId}/personen' )
|
||||||
|
def PersonenHochladen(SitzungsId: str, datei: UploadFile = File(...)):
|
||||||
|
"""Gaesteliste als CSV hochladen (Ersatz fuer bestellung.json);
|
||||||
|
Format siehe libs/CSVConfig.py"""
|
||||||
|
S = _GibSession( SitzungsId )
|
||||||
|
Rohdaten = datei.file.read()
|
||||||
|
try:
|
||||||
|
Text = Rohdaten.decode( 'utf-8-sig' )
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
Text = Rohdaten.decode( 'cp1252' ) # Excel/Windows-Fallback
|
||||||
|
|
||||||
|
try:
|
||||||
|
[ PN, GN, VIPGruppe, VipHash, GruppenNamen, FixierteGruppen ] = \
|
||||||
|
CSVConfig().HandleGaesteliste( Text )
|
||||||
|
except ValueError as Fehler:
|
||||||
|
raise HTTPException( status_code=400, detail=str(Fehler) )
|
||||||
|
|
||||||
|
S['personen'] = {
|
||||||
|
'PN': PN,
|
||||||
|
'GN': GN,
|
||||||
|
'VIPGruppe': VIPGruppe,
|
||||||
|
'VipHash': VipHash,
|
||||||
|
'nLeute': GN.NLeute,
|
||||||
|
'nVips': VIPGruppe.Anzahl(),
|
||||||
|
}
|
||||||
|
S['gruppenNamen'] = GruppenNamen
|
||||||
|
S['ergebnisse'] = []
|
||||||
|
|
||||||
|
return {
|
||||||
|
'personen': GN.NLeute,
|
||||||
|
'fixiert': VIPGruppe.Anzahl(),
|
||||||
|
'gruppen': [ {
|
||||||
|
'id': G.Id,
|
||||||
|
'name': GruppenNamen.get( G.Id, 'Gruppe %s' % G.Id ),
|
||||||
|
'anzahl': G.Anzahl(),
|
||||||
|
} for G in GN ],
|
||||||
|
# fest platzierte Gruppen (fuer die grau hinterlegte Anzeige)
|
||||||
|
'fixierte': [ { 'name': Name, 'tisch': Info['tisch'], 'anzahl': Info['anzahl'] }
|
||||||
|
for Name, Info in FixierteGruppen.items() ],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@app.post( '/sitzung/{SitzungsId}/berechnen' )
|
||||||
|
def Berechnen(SitzungsId: str,
|
||||||
|
varianten: int = Query( default=3, ge=1, le=5,
|
||||||
|
description='wieviele unterschiedliche Varianten der Lauf '
|
||||||
|
'zurueckgeben soll (aus Farm.TopN, dedupliziert)' ),
|
||||||
|
strafen: str = Query( default=STRAFENART,
|
||||||
|
description='Name des Strafpunkte-Profils (Sektion in strafen.cfg), '
|
||||||
|
'z.B. default oder locker - zum Vergleich waehlbar' )):
|
||||||
|
"""startet die GA-Optimierung; jeder Aufruf ist ein neuer Lauf und
|
||||||
|
liefert bis zu 'varianten' unterschiedliche gute Sitzordnungen. Das
|
||||||
|
Strafpunkte-Profil ('strafen') steuert die Bewertung waehrend der
|
||||||
|
Optimierung - so lassen sich z.B. default und locker vergleichen."""
|
||||||
|
S = _GibSession( SitzungsId )
|
||||||
|
if S['tische'] is None:
|
||||||
|
raise HTTPException( status_code=400,
|
||||||
|
detail='Erst das Tisch-Layout setzen (POST .../tische)' )
|
||||||
|
if S['personen'] is None:
|
||||||
|
raise HTTPException( status_code=400,
|
||||||
|
detail='Erst die Gaesteliste hochladen (POST .../personen)' )
|
||||||
|
|
||||||
|
TE = _TischeBauen( S )
|
||||||
|
P = S['personen']
|
||||||
|
|
||||||
|
# Vorab-Pruefungen mit klaren Fehlermeldungen (der Kern wirft sonst
|
||||||
|
# nur IndexError/AttributeError tief aus der Platzierung heraus)
|
||||||
|
GesamtLeute = P['nLeute'] + P['nVips']
|
||||||
|
if GesamtLeute > TE.NStuehle:
|
||||||
|
raise HTTPException( status_code=400,
|
||||||
|
detail='Zu wenig Stuehle: %d Personen, aber nur %d Plaetze'
|
||||||
|
% (GesamtLeute, TE.NStuehle) )
|
||||||
|
VIPsProTisch = {}
|
||||||
|
for Pid, Tid in P['VipHash'].items():
|
||||||
|
VIPsProTisch[Tid] = VIPsProTisch.get( Tid, 0 ) + 1
|
||||||
|
for Tid, AnzahlVIPs in VIPsProTisch.items():
|
||||||
|
T = TE.vonId( Tid )
|
||||||
|
if T is None:
|
||||||
|
raise HTTPException( status_code=400,
|
||||||
|
detail='VIP-Tisch %d existiert nicht im Layout' % Tid )
|
||||||
|
if AnzahlVIPs > T.Plaetze:
|
||||||
|
raise HTTPException( status_code=400,
|
||||||
|
detail='Tisch %d hat %d Plaetze, aber %d VIPs sind '
|
||||||
|
'dort fest gesetzt' % (Tid, T.Plaetze, AnzahlVIPs) )
|
||||||
|
|
||||||
|
try:
|
||||||
|
SL = strafprofil( strafen )
|
||||||
|
except ValueError as Fehler:
|
||||||
|
raise HTTPException( status_code=400, detail=str(Fehler) )
|
||||||
|
|
||||||
|
try:
|
||||||
|
GAFarm = Farm( GAZyklus, Sitzplatzverteilung,
|
||||||
|
Tische=TE, Gruppen=P['GN'], Strafen=SL,
|
||||||
|
VIPListe=P['VipHash'], VIPs=P['VIPGruppe'] )
|
||||||
|
except IndexError as Fehler:
|
||||||
|
raise HTTPException( status_code=400, detail=str(Fehler) )
|
||||||
|
|
||||||
|
# Roadmap M2: nicht nur den Besten, sondern bis zu 'varianten'
|
||||||
|
# UNTERSCHIEDLICHE gute Loesungen aus dem Endpool — Farm.TopN liefert
|
||||||
|
# absteigend sortiert. Der Vergleich der Loesungen laeuft ueber die
|
||||||
|
# getGruppenId (Gruppen-Ebene): dieselbe Sitzordnung zaehlt nicht mehrfach
|
||||||
|
# als eigene Variante. Der GA-Pool ist ohnehin schon per getGruppenId
|
||||||
|
# dedupliziert; das hier ist die zusaetzliche Absicherung fuer die Ausgabe.
|
||||||
|
# Liefert der Pool weniger unterschiedliche Sitzordnungen, kommen eben
|
||||||
|
# weniger zurueck (ein weiterer Klick auf Berechnen erzeugt einen frischen Lauf).
|
||||||
|
Ergebnisse, Gesehen = [], set()
|
||||||
|
for SV in GAFarm.TopN( len( GAFarm.Pool ) ):
|
||||||
|
Sig = SV.getGruppenId()
|
||||||
|
if Sig in Gesehen:
|
||||||
|
continue
|
||||||
|
Gesehen.add( Sig )
|
||||||
|
Ergebnisse.append( SV )
|
||||||
|
if len( Ergebnisse ) == varianten:
|
||||||
|
break
|
||||||
|
|
||||||
|
S['ergebnisse'] = Ergebnisse
|
||||||
|
S['laeufe'] = S['laeufe'] + 1
|
||||||
|
S['strafen'] = strafen # fuer die Anzeige, welches Profil den Lauf ergab
|
||||||
|
return _ErgebnisJSON( S )
|
||||||
|
|
||||||
|
|
||||||
|
@app.get( '/strafprofile' )
|
||||||
|
def Strafprofile():
|
||||||
|
"""verfuegbare Strafpunkte-Profile (Sektionen in strafen.cfg) fuer die
|
||||||
|
Auswahl in der GUI; 'vorgabe' ist das voreingestellte Profil."""
|
||||||
|
return { 'profile': strafprofil_namen(), 'vorgabe': STRAFENART }
|
||||||
|
|
||||||
|
|
||||||
|
@app.get( '/sitzung/{SitzungsId}/ergebnis' )
|
||||||
|
def Ergebnis(SitzungsId: str):
|
||||||
|
"""alle Varianten des letzten Laufs als JSON (beste zuerst)"""
|
||||||
|
S = _GibSession( SitzungsId )
|
||||||
|
if not S['ergebnisse']:
|
||||||
|
raise HTTPException( status_code=404,
|
||||||
|
detail='Noch nichts berechnet (POST .../berechnen)' )
|
||||||
|
return _ErgebnisJSON( S )
|
||||||
|
|
||||||
|
|
||||||
|
@app.get( '/sitzung/{SitzungsId}/ergebnis.svg' )
|
||||||
|
def ErgebnisSVG(SitzungsId: str,
|
||||||
|
variante: int = Query( default=1, ge=1,
|
||||||
|
description='Nummer der Variante (1 = beste)' )):
|
||||||
|
"""eine berechnete Variante als SVG (alsSVG aus dem Kern)"""
|
||||||
|
S = _GibSession( SitzungsId )
|
||||||
|
if not S['ergebnisse']:
|
||||||
|
raise HTTPException( status_code=404,
|
||||||
|
detail='Noch nichts berechnet (POST .../berechnen)' )
|
||||||
|
if variante > len( S['ergebnisse'] ):
|
||||||
|
raise HTTPException( status_code=404,
|
||||||
|
detail='Variante %d gibt es nicht (letzter Lauf hat %d)'
|
||||||
|
% (variante, len( S['ergebnisse'] )) )
|
||||||
|
|
||||||
|
# alsSVG schreibt in eine Datei -> Tempdatei schreiben, lesen, loeschen
|
||||||
|
Handle, TempPfad = tempfile.mkstemp( suffix='.svg' )
|
||||||
|
os.close( Handle )
|
||||||
|
try:
|
||||||
|
S['ergebnisse'][variante - 1].alsSVG( TempPfad,
|
||||||
|
GruppenNamen=S.get( 'gruppenNamen', {} ), Farbschema=Farben )
|
||||||
|
fsock = open( TempPfad, 'r' )
|
||||||
|
SVG = fsock.read()
|
||||||
|
fsock.close()
|
||||||
|
finally:
|
||||||
|
os.remove( TempPfad )
|
||||||
|
return Response( content=SVG, media_type='image/svg+xml' )
|
||||||
|
|
||||||
|
|
||||||
|
# statisches Test-Frontend unter / (muss nach den API-Routen gemountet sein)
|
||||||
|
app.mount( '/', StaticFiles(
|
||||||
|
directory=os.path.join( os.path.dirname( os.path.abspath( __file__ ) ),
|
||||||
|
'static' ),
|
||||||
|
html=True ), name='static' )
|
||||||
@@ -0,0 +1,472 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="de">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>Sitz & Platz — Tisch-Editor (M1)</title>
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--akzent: #2f6f4f;
|
||||||
|
--akzent-hell: #e6f0ea;
|
||||||
|
--rand: #d9d4c8;
|
||||||
|
--hintergrund: #faf8f3;
|
||||||
|
}
|
||||||
|
* { box-sizing: border-box; }
|
||||||
|
body {
|
||||||
|
font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
|
||||||
|
margin: 0; background: var(--hintergrund); color: #2a2a24; line-height: 1.5;
|
||||||
|
}
|
||||||
|
header { background: var(--akzent); color: white; padding: 1rem 1.5rem; }
|
||||||
|
header h1 { margin: 0; font-size: 1.3rem; }
|
||||||
|
header p { margin: .2rem 0 0; opacity: .85; font-size: .85rem; }
|
||||||
|
header a { color: #d6eade; }
|
||||||
|
main { max-width: 68rem; margin: 0 auto; padding: 1rem 1.5rem 4rem; }
|
||||||
|
.werkzeug {
|
||||||
|
display: flex; flex-wrap: wrap; align-items: center; gap: .4rem;
|
||||||
|
background: white; border: 1px solid var(--rand); border-radius: 8px;
|
||||||
|
padding: .6rem .75rem; margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
.werkzeug .trenner { width: 1px; height: 1.6rem; background: var(--rand); margin: 0 .3rem; }
|
||||||
|
.werkzeug label { font-size: .82rem; color: #6b6557; display: inline-flex; align-items: center; gap: .3rem; }
|
||||||
|
button {
|
||||||
|
background: var(--akzent); color: white; border: 0; border-radius: 4px;
|
||||||
|
padding: .42rem .8rem; font-size: .88rem; cursor: pointer;
|
||||||
|
}
|
||||||
|
button.sekundaer { background: #8b8577; }
|
||||||
|
button.geist { background: white; color: var(--akzent); border: 1px solid var(--rand); }
|
||||||
|
button:disabled { background: #cfcabc; color: #f3f0e8; cursor: not-allowed; }
|
||||||
|
.buehne {
|
||||||
|
display: grid; grid-template-columns: 1fr 15rem; gap: 1rem; align-items: start;
|
||||||
|
}
|
||||||
|
@media (max-width: 48rem) { .buehne { grid-template-columns: 1fr; } }
|
||||||
|
#leinwand {
|
||||||
|
background: white; border: 1px solid var(--rand); border-radius: 8px;
|
||||||
|
overflow: auto; touch-action: none; min-height: 24rem;
|
||||||
|
}
|
||||||
|
#leinwand svg { display: block; }
|
||||||
|
.circle-tisch { cursor: grab; }
|
||||||
|
.circle-tisch:active { cursor: grabbing; }
|
||||||
|
aside {
|
||||||
|
background: white; border: 1px solid var(--rand); border-radius: 8px;
|
||||||
|
padding: 1rem; font-size: .9rem;
|
||||||
|
}
|
||||||
|
aside h2 { font-size: 1rem; margin: 0 0 .6rem; color: var(--akzent); }
|
||||||
|
aside .feld { margin: .5rem 0; }
|
||||||
|
aside input[type=number] { width: 4rem; }
|
||||||
|
.zahl { display: inline-block; background: #f1eee6; border-radius: 4px;
|
||||||
|
padding: .25rem .6rem; margin: .1rem .3rem .1rem 0; font-size: .85rem; }
|
||||||
|
.zahl b { color: var(--akzent); }
|
||||||
|
.status { font-size: .85rem; margin-top: .6rem; min-height: 1.2rem; }
|
||||||
|
.status.ok { color: var(--akzent); }
|
||||||
|
.status.fehler { color: #a03030; white-space: pre-wrap; }
|
||||||
|
.hinweis { font-size: .8rem; color: #6b6557; }
|
||||||
|
kbd { background: #f1eee6; border: 1px solid var(--rand); border-bottom-width: 2px;
|
||||||
|
border-radius: 3px; padding: 0 .3rem; font-size: .78rem; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>Sitz & Platz <small style="font-weight:normal">— Interaktiver Tisch-Editor (Meilenstein 1)</small></h1>
|
||||||
|
<p>Tische per Drag & Drop platzieren; Nachbarschaft wird aus der Nähe abgeleitet.
|
||||||
|
Sitzung: <code id="sitzungsId">…</code> · weiter zu <a href="/">Gäste & Berechnung</a></p>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
|
||||||
|
<div class="werkzeug">
|
||||||
|
<button id="btnUndo" title="Rückgängig (Strg+Z)" disabled>↶ Rückgängig</button>
|
||||||
|
<button id="btnRedo" title="Wiederholen (Strg+Y)" disabled>↷ Wiederholen</button>
|
||||||
|
<span class="trenner"></span>
|
||||||
|
<button id="btnAdd" class="geist">+ Tisch</button>
|
||||||
|
<button id="btnReihe" class="sekundaer">Preset: 4er-Reihe</button>
|
||||||
|
<button id="btnRaster" class="sekundaer">Preset: 3×3-Raster</button>
|
||||||
|
<span class="trenner"></span>
|
||||||
|
<label>Nachbar-Radius
|
||||||
|
<input type="range" id="radius" min="0.5" max="3" step="0.1" value="1.5">
|
||||||
|
<b id="radiusWert">1,5</b>
|
||||||
|
</label>
|
||||||
|
<label>Raster
|
||||||
|
<select id="raster">
|
||||||
|
<option value="0.5" selected>0,5</option>
|
||||||
|
<option value="1">1</option>
|
||||||
|
<option value="1.5">1,5</option>
|
||||||
|
<option value="2">2</option>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
<span class="trenner"></span>
|
||||||
|
<label>tische.ini <input type="file" id="iniDatei" accept=".ini,text/plain"></label>
|
||||||
|
<button id="btnIni" class="geist">laden</button>
|
||||||
|
<span class="trenner"></span>
|
||||||
|
<button id="btnSpeichern">Layout speichern</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="buehne">
|
||||||
|
<div id="leinwand"></div>
|
||||||
|
<aside>
|
||||||
|
<h2>Ausgewählter Tisch</h2>
|
||||||
|
<div id="inspektor"><p class="hinweis">Kein Tisch ausgewählt. Auf einen Tisch
|
||||||
|
klicken, um Plätze zu ändern oder ihn zu löschen. Ziehen zum Verschieben.</p></div>
|
||||||
|
<hr style="border:0;border-top:1px solid var(--rand);margin:.8rem 0">
|
||||||
|
<div id="zahlen"></div>
|
||||||
|
<p class="hinweis" style="margin-top:.6rem">Tastatur: <kbd>Strg</kbd>+<kbd>Z</kbd> /
|
||||||
|
<kbd>Strg</kbd>+<kbd>Y</kbd> Undo/Redo · <kbd>Entf</kbd> löscht den
|
||||||
|
ausgewählten Tisch.</p>
|
||||||
|
</aside>
|
||||||
|
</div>
|
||||||
|
<div class="status" id="status"></div>
|
||||||
|
|
||||||
|
</main>
|
||||||
|
<script>
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/* ============================================================ Zustand
|
||||||
|
state.tische ist die einzige Wahrheit; das SVG wird daraus gezeichnet
|
||||||
|
(state-getrieben, nie umgekehrt). Der Nachbar-Radius ist bewusst KEIN
|
||||||
|
Teil der Undo-History (Undo/Redo betrifft Tischgeometrie/-kapazität,
|
||||||
|
nicht diese Ableitungs-Einstellung), wird aber mitgespeichert. */
|
||||||
|
const state = { tische: [] };
|
||||||
|
let radius = 1.5;
|
||||||
|
let rasterSchritt = 0.5;
|
||||||
|
const ZIEH_TEMPO = 0.5; // Ziehgeschwindigkeit: Tisch folgt dem Zeiger halb so schnell
|
||||||
|
let selectedId = null;
|
||||||
|
let sitzung = null;
|
||||||
|
|
||||||
|
/* Undo/Redo: Schnappschuss-Stapel. Ein Schnappschuss ist ein tiefer Klon
|
||||||
|
von state.tische. Vor jeder verändernden Aktion wird der aktuelle
|
||||||
|
Zustand auf undoStack gelegt und redoStack geleert. */
|
||||||
|
const undoStack = [];
|
||||||
|
const redoStack = [];
|
||||||
|
const HIST_MAX = 200;
|
||||||
|
|
||||||
|
const klon = (t) => JSON.parse(JSON.stringify(t));
|
||||||
|
|
||||||
|
function pushHistory() {
|
||||||
|
undoStack.push(klon(state.tische));
|
||||||
|
if (undoStack.length > HIST_MAX) undoStack.shift();
|
||||||
|
redoStack.length = 0;
|
||||||
|
knoepfe();
|
||||||
|
}
|
||||||
|
function undo() {
|
||||||
|
if (!undoStack.length) return;
|
||||||
|
redoStack.push(klon(state.tische));
|
||||||
|
state.tische = undoStack.pop();
|
||||||
|
nachZustandswechsel();
|
||||||
|
}
|
||||||
|
function redo() {
|
||||||
|
if (!redoStack.length) return;
|
||||||
|
undoStack.push(klon(state.tische));
|
||||||
|
state.tische = redoStack.pop();
|
||||||
|
nachZustandswechsel();
|
||||||
|
}
|
||||||
|
function nachZustandswechsel() {
|
||||||
|
if (selectedId !== null && !tischVonId(selectedId)) selectedId = null;
|
||||||
|
knoepfe(); zeichne(); inspektor();
|
||||||
|
}
|
||||||
|
function knoepfe() {
|
||||||
|
document.getElementById('btnUndo').disabled = undoStack.length === 0;
|
||||||
|
document.getElementById('btnRedo').disabled = redoStack.length === 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ============================================================ Helfer */
|
||||||
|
const tischVonId = (id) => state.tische.find(t => t.id === id);
|
||||||
|
function neueId() {
|
||||||
|
return state.tische.reduce((m, t) => Math.max(m, t.id), 0) + 1;
|
||||||
|
}
|
||||||
|
function snap(v) { return Math.round( Math.round(v / rasterSchritt) * rasterSchritt * 100 ) / 100; }
|
||||||
|
function radiusPx(plaetze) {
|
||||||
|
// Kreisgroesse waechst mit der Platzzahl (analog alsSVG im Kern)
|
||||||
|
return Math.max(18, Math.min(48, 15 + plaetze * 1.5));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ============================================================ Geometrie
|
||||||
|
Grid-Koordinaten (wie tische.ini) <-> Pixel. Bei jeder Zeichnung neu
|
||||||
|
bestimmt und in Modulvariablen abgelegt, damit pointerGrid() umrechnen
|
||||||
|
kann. */
|
||||||
|
const SCALE = 72, MARGIN = 34, PAD = 1;
|
||||||
|
let viewMinX = 0, viewMinY = 0, curW = 600, curH = 400;
|
||||||
|
|
||||||
|
function grenzen() {
|
||||||
|
if (!state.tische.length) return { minX: 0, maxX: 3, minY: 0, maxY: 2 };
|
||||||
|
const xs = state.tische.map(t => t.x), ys = state.tische.map(t => t.y);
|
||||||
|
return { minX: Math.min(...xs), maxX: Math.max(...xs),
|
||||||
|
minY: Math.min(...ys), maxY: Math.max(...ys) };
|
||||||
|
}
|
||||||
|
const px = (gx, min) => MARGIN + (gx - min) * SCALE;
|
||||||
|
function pointerGrid(e) {
|
||||||
|
const svg = document.querySelector('#leinwand svg');
|
||||||
|
const r = svg.getBoundingClientRect();
|
||||||
|
const sx = curW / r.width, sy = curH / r.height;
|
||||||
|
const X = (e.clientX - r.left) * sx, Y = (e.clientY - r.top) * sy;
|
||||||
|
return { x: (X - MARGIN) / SCALE + viewMinX, y: (Y - MARGIN) / SCALE + viewMinY };
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ============================================================ Zeichnen */
|
||||||
|
function nachbarPaare() {
|
||||||
|
const paare = [];
|
||||||
|
for (let i = 0; i < state.tische.length; i++)
|
||||||
|
for (let j = i + 1; j < state.tische.length; j++) {
|
||||||
|
const a = state.tische[i], b = state.tische[j];
|
||||||
|
if (Math.hypot(a.x - b.x, a.y - b.y) <= radius) paare.push([a, b]);
|
||||||
|
}
|
||||||
|
return paare;
|
||||||
|
}
|
||||||
|
function zeichne() {
|
||||||
|
const g = grenzen();
|
||||||
|
viewMinX = g.minX - PAD; viewMinY = g.minY - PAD;
|
||||||
|
curW = Math.max(480, MARGIN * 2 + (g.maxX - g.minX + 2 * PAD) * SCALE);
|
||||||
|
curH = Math.max(320, MARGIN * 2 + (g.maxY - g.minY + 2 * PAD) * SCALE);
|
||||||
|
|
||||||
|
let s = `<svg xmlns="http://www.w3.org/2000/svg" width="${curW}" height="${curH}" `
|
||||||
|
+ `viewBox="0 0 ${curW} ${curH}" font-family="sans-serif">`;
|
||||||
|
s += `<rect width="100%" height="100%" fill="white"/>`;
|
||||||
|
|
||||||
|
// feines Grid an ganzzahligen Rasterlinien
|
||||||
|
for (let gx = Math.ceil(viewMinX); px(gx, viewMinX) <= curW; gx++)
|
||||||
|
s += `<line x1="${px(gx, viewMinX)}" y1="0" x2="${px(gx, viewMinX)}" y2="${curH}" stroke="#f0ede5"/>`;
|
||||||
|
for (let gy = Math.ceil(viewMinY); px(gy, viewMinY) <= curH; gy++)
|
||||||
|
s += `<line x1="0" y1="${px(gy, viewMinY)}" x2="${curW}" y2="${px(gy, viewMinY)}" stroke="#f0ede5"/>`;
|
||||||
|
|
||||||
|
// Nachbar-Linien (aus der Naehe abgeleitet, wie im Backend)
|
||||||
|
for (const [a, b] of nachbarPaare())
|
||||||
|
s += `<line x1="${px(a.x, viewMinX)}" y1="${px(a.y, viewMinY)}" `
|
||||||
|
+ `x2="${px(b.x, viewMinX)}" y2="${px(b.y, viewMinY)}" `
|
||||||
|
+ `stroke="#bcd3c6" stroke-width="2"/>`;
|
||||||
|
|
||||||
|
// Tische als Kreise
|
||||||
|
for (const t of state.tische) {
|
||||||
|
const cx = px(t.x, viewMinX), cy = px(t.y, viewMinY), r = radiusPx(t.plaetze);
|
||||||
|
const gewaehlt = t.id === selectedId;
|
||||||
|
s += `<g class="circle-tisch" data-id="${t.id}">`;
|
||||||
|
if (gewaehlt)
|
||||||
|
s += `<circle cx="${cx}" cy="${cy}" r="${r + 5}" fill="none" `
|
||||||
|
+ `stroke="#2f6f4f" stroke-width="2" stroke-dasharray="4 3"/>`;
|
||||||
|
s += `<circle cx="${cx}" cy="${cy}" r="${r}" `
|
||||||
|
+ `fill="${gewaehlt ? '#e6f0ea' : 'white'}" stroke="#2f6f4f" stroke-width="2"/>`;
|
||||||
|
s += `<text x="${cx}" y="${cy - 1}" text-anchor="middle" font-size="15" `
|
||||||
|
+ `font-weight="bold" fill="#2f6f4f">${t.id}</text>`;
|
||||||
|
s += `<text x="${cx}" y="${cy + 13}" text-anchor="middle" font-size="10" `
|
||||||
|
+ `fill="#6b6557">${t.plaetze} Pl.</text>`;
|
||||||
|
s += `</g>`;
|
||||||
|
}
|
||||||
|
s += `</svg>`;
|
||||||
|
document.getElementById('leinwand').innerHTML = s;
|
||||||
|
|
||||||
|
// Kennzahlen
|
||||||
|
const plaetze = state.tische.reduce((m, t) => m + t.plaetze, 0);
|
||||||
|
document.getElementById('zahlen').innerHTML =
|
||||||
|
`<span class="zahl">Tische: <b>${state.tische.length}</b></span>` +
|
||||||
|
`<span class="zahl">Plätze: <b>${plaetze}</b></span>` +
|
||||||
|
`<span class="zahl">Nachbar-Paare: <b>${nachbarPaare().length}</b></span>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ============================================================ Inspektor */
|
||||||
|
function inspektor() {
|
||||||
|
const el = document.getElementById('inspektor');
|
||||||
|
const t = selectedId !== null ? tischVonId(selectedId) : null;
|
||||||
|
if (!t) {
|
||||||
|
el.innerHTML = '<p class="hinweis">Kein Tisch ausgewählt. Auf einen Tisch ' +
|
||||||
|
'klicken, um Plätze zu ändern oder ihn zu löschen. Ziehen zum Verschieben.</p>';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
el.innerHTML =
|
||||||
|
`<div class="feld"><b>Tisch ${t.id}</b></div>` +
|
||||||
|
`<div class="feld">Plätze: ` +
|
||||||
|
`<button class="geist" id="plMinus">−</button> ` +
|
||||||
|
`<input type="number" id="plaetze" min="1" max="100" value="${t.plaetze}"> ` +
|
||||||
|
`<button class="geist" id="plPlus">+</button></div>` +
|
||||||
|
`<div class="feld hinweis">Position: x=${t.x}, y=${t.y}</div>` +
|
||||||
|
`<div class="feld"><button class="sekundaer" id="loeschen">Tisch löschen</button></div>`;
|
||||||
|
document.getElementById('plMinus').onclick = () => plaetzeSetzen(t.plaetze - 1);
|
||||||
|
document.getElementById('plPlus').onclick = () => plaetzeSetzen(t.plaetze + 1);
|
||||||
|
document.getElementById('plaetze').onchange = (e) => plaetzeSetzen(parseInt(e.target.value, 10));
|
||||||
|
document.getElementById('loeschen').onclick = tischLoeschen;
|
||||||
|
}
|
||||||
|
function plaetzeSetzen(wert) {
|
||||||
|
const t = tischVonId(selectedId);
|
||||||
|
if (!t || isNaN(wert)) return;
|
||||||
|
wert = Math.max(1, Math.min(100, wert));
|
||||||
|
if (wert === t.plaetze) return;
|
||||||
|
pushHistory(); t.plaetze = wert; zeichne(); inspektor();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ============================================================ Auswahl */
|
||||||
|
function auswaehlen(id) { selectedId = id; zeichne(); inspektor(); }
|
||||||
|
|
||||||
|
/* ============================================================ Aktionen */
|
||||||
|
function tischHinzufuegen() {
|
||||||
|
const g = grenzen();
|
||||||
|
const x = state.tische.length ? snap((g.minX + g.maxX) / 2) : 0;
|
||||||
|
const y = state.tische.length ? snap((g.minY + g.maxY) / 2) : 0;
|
||||||
|
pushHistory();
|
||||||
|
const id = neueId();
|
||||||
|
state.tische.push({ id, plaetze: 8, x, y });
|
||||||
|
auswaehlen(id);
|
||||||
|
melde('Tisch ' + id + ' hinzugefügt.', 'ok');
|
||||||
|
}
|
||||||
|
function tischLoeschen() {
|
||||||
|
if (selectedId === null) return;
|
||||||
|
pushHistory();
|
||||||
|
state.tische = state.tische.filter(t => t.id !== selectedId);
|
||||||
|
const weg = selectedId; selectedId = null;
|
||||||
|
zeichne(); inspektor();
|
||||||
|
melde('Tisch ' + weg + ' gelöscht.', 'ok');
|
||||||
|
}
|
||||||
|
function presetReihe() {
|
||||||
|
pushHistory();
|
||||||
|
state.tische = [1, 2, 3, 4].map(i => ({ id: i, plaetze: 5, x: i - 1, y: 0 }));
|
||||||
|
selectedId = null; zeichne(); inspektor();
|
||||||
|
}
|
||||||
|
function presetRaster() {
|
||||||
|
pushHistory();
|
||||||
|
state.tische = [];
|
||||||
|
let id = 1;
|
||||||
|
for (let y = 0; y < 3; y++)
|
||||||
|
for (let x = 0; x < 3; x++) state.tische.push({ id: id++, plaetze: 8, x, y });
|
||||||
|
selectedId = null; zeichne(); inspektor();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ============================================================ Drag & Drop */
|
||||||
|
let dragId = null, dragMoved = false, dragStart = null;
|
||||||
|
let ankerPtr = null, ankerPos = null; // Zeiger- und Tischposition bei Zugbeginn
|
||||||
|
|
||||||
|
document.getElementById('leinwand').addEventListener('pointerdown', (e) => {
|
||||||
|
const el = e.target.closest('[data-id]');
|
||||||
|
if (!el) { if (selectedId !== null) auswaehlen(null); return; }
|
||||||
|
const id = parseInt(el.dataset.id, 10);
|
||||||
|
auswaehlen(id);
|
||||||
|
const gpt = pointerGrid(e), t = tischVonId(id);
|
||||||
|
dragId = id; dragMoved = false; dragStart = klon(state.tische);
|
||||||
|
// Anker merken: der Tisch wandert ab hier um ZIEH_TEMPO * Zeigerweg
|
||||||
|
ankerPtr = { x: gpt.x, y: gpt.y };
|
||||||
|
ankerPos = { x: t.x, y: t.y };
|
||||||
|
e.preventDefault();
|
||||||
|
});
|
||||||
|
window.addEventListener('pointermove', (e) => {
|
||||||
|
if (dragId === null) return;
|
||||||
|
const gpt = pointerGrid(e);
|
||||||
|
// halbe Geschwindigkeit: Verschiebung des Tisches = halber Zeigerweg
|
||||||
|
const nx = snap(ankerPos.x + (gpt.x - ankerPtr.x) * ZIEH_TEMPO);
|
||||||
|
const ny = snap(ankerPos.y + (gpt.y - ankerPtr.y) * ZIEH_TEMPO);
|
||||||
|
const t = tischVonId(dragId);
|
||||||
|
if (t && (t.x !== nx || t.y !== ny)) { t.x = nx; t.y = ny; dragMoved = true; zeichne(); inspektor(); }
|
||||||
|
});
|
||||||
|
window.addEventListener('pointerup', () => {
|
||||||
|
if (dragId === null) return;
|
||||||
|
if (dragMoved) {
|
||||||
|
// den ganzen Zug als EINEN Undo-Schritt ablegen (Vor-Zustand)
|
||||||
|
undoStack.push(dragStart);
|
||||||
|
if (undoStack.length > HIST_MAX) undoStack.shift();
|
||||||
|
redoStack.length = 0; knoepfe();
|
||||||
|
}
|
||||||
|
dragId = null; dragStart = null;
|
||||||
|
});
|
||||||
|
|
||||||
|
/* ============================================================ Tastatur */
|
||||||
|
window.addEventListener('keydown', (e) => {
|
||||||
|
const tippt = /^(INPUT|TEXTAREA)$/.test(document.activeElement.tagName);
|
||||||
|
if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'z' && !e.shiftKey) {
|
||||||
|
e.preventDefault(); undo();
|
||||||
|
} else if ((e.ctrlKey || e.metaKey) && (e.key.toLowerCase() === 'y' ||
|
||||||
|
(e.key.toLowerCase() === 'z' && e.shiftKey))) {
|
||||||
|
e.preventDefault(); redo();
|
||||||
|
} else if ((e.key === 'Delete' || e.key === 'Backspace') && selectedId !== null && !tippt) {
|
||||||
|
e.preventDefault(); tischLoeschen();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/* ============================================================ Backend */
|
||||||
|
function melde(text, klasse) {
|
||||||
|
const el = document.getElementById('status');
|
||||||
|
el.textContent = text; el.className = 'status ' + (klasse || '');
|
||||||
|
}
|
||||||
|
async function api(pfad, optionen) {
|
||||||
|
const antwort = await fetch(pfad, optionen);
|
||||||
|
const daten = await antwort.json().catch(() => null);
|
||||||
|
if (!antwort.ok) {
|
||||||
|
const d = daten && daten.detail
|
||||||
|
? (typeof daten.detail === 'string' ? daten.detail : JSON.stringify(daten.detail))
|
||||||
|
: antwort.statusText;
|
||||||
|
throw new Error(d);
|
||||||
|
}
|
||||||
|
return daten;
|
||||||
|
}
|
||||||
|
async function sitzungHolen() {
|
||||||
|
// Session mit der Testoberflaeche (index.html) ueber localStorage teilen
|
||||||
|
let id = localStorage.getItem('platzSitzung');
|
||||||
|
if (id) {
|
||||||
|
const ok = await fetch('/sitzung/' + id).then(r => r.ok).catch(() => false);
|
||||||
|
if (ok) return id;
|
||||||
|
}
|
||||||
|
const r = await api('/sitzung', { method: 'POST' });
|
||||||
|
localStorage.setItem('platzSitzung', r.id);
|
||||||
|
return r.id;
|
||||||
|
}
|
||||||
|
async function layoutSpeichern() {
|
||||||
|
if (!state.tische.length) { melde('Mindestens ein Tisch nötig.', 'fehler'); return; }
|
||||||
|
const tische = state.tische.map(t => ({ id: t.id, plaetze: t.plaetze, x: t.x, y: t.y }));
|
||||||
|
try {
|
||||||
|
const r = await api('/sitzung/' + sitzung + '/tische', {
|
||||||
|
method: 'POST', headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({ tische, nachbarRadius: radius }),
|
||||||
|
});
|
||||||
|
melde('✓ ' + r.tische.length + ' Tische, ' + r.plaetzeGesamt +
|
||||||
|
' Plätze gespeichert. Weiter mit „Gäste & Berechnung“.', 'ok');
|
||||||
|
} catch (e) { melde('Fehler: ' + e.message, 'fehler'); }
|
||||||
|
}
|
||||||
|
async function iniLaden() {
|
||||||
|
const eingabe = document.getElementById('iniDatei');
|
||||||
|
if (!eingabe.files.length) { melde('Bitte zuerst eine tische.ini auswählen.', 'fehler'); return; }
|
||||||
|
const form = new FormData(); form.append('datei', eingabe.files[0]);
|
||||||
|
try {
|
||||||
|
const r = await api('/sitzung/' + sitzung + '/tische-datei', { method: 'POST', body: form });
|
||||||
|
pushHistory();
|
||||||
|
state.tische = r.tische.map(t => ({ id: t.id, plaetze: t.plaetze, x: t.x, y: t.y }));
|
||||||
|
selectedId = null; zeichne(); inspektor();
|
||||||
|
melde('✓ ' + r.tische.length + ' Tische aus Datei geladen.', 'ok');
|
||||||
|
} catch (e) { melde('Fehler: ' + e.message, 'fehler'); }
|
||||||
|
}
|
||||||
|
async function layoutLaden() {
|
||||||
|
// bereits in der (geteilten) Session gespeichertes Layout uebernehmen
|
||||||
|
try {
|
||||||
|
const r = await api('/sitzung/' + sitzung + '/tische');
|
||||||
|
if (r.tische && r.tische.length) {
|
||||||
|
state.tische = r.tische.map(t => ({ id: t.id, plaetze: t.plaetze, x: t.x, y: t.y }));
|
||||||
|
radius = r.nachbarRadius || 1.5;
|
||||||
|
document.getElementById('radius').value = radius;
|
||||||
|
document.getElementById('radiusWert').textContent = radius.toFixed(1).replace('.', ',');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch (e) { /* neue Session ohne Layout — Preset zeigen */ }
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ============================================================ Verdrahtung */
|
||||||
|
document.getElementById('btnUndo').onclick = undo;
|
||||||
|
document.getElementById('btnRedo').onclick = redo;
|
||||||
|
document.getElementById('btnAdd').onclick = tischHinzufuegen;
|
||||||
|
document.getElementById('btnReihe').onclick = presetReihe;
|
||||||
|
document.getElementById('btnRaster').onclick = presetRaster;
|
||||||
|
document.getElementById('btnSpeichern').onclick = layoutSpeichern;
|
||||||
|
document.getElementById('btnIni').onclick = iniLaden;
|
||||||
|
document.getElementById('raster').onchange = (e) => { rasterSchritt = parseFloat(e.target.value); };
|
||||||
|
const radiusInput = document.getElementById('radius');
|
||||||
|
radiusInput.oninput = (e) => {
|
||||||
|
radius = parseFloat(e.target.value);
|
||||||
|
document.getElementById('radiusWert').textContent = radius.toFixed(1).replace('.', ',');
|
||||||
|
zeichne();
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ============================================================ Start */
|
||||||
|
window.addEventListener('DOMContentLoaded', async () => {
|
||||||
|
try {
|
||||||
|
sitzung = await sitzungHolen();
|
||||||
|
document.getElementById('sitzungsId').textContent = sitzung;
|
||||||
|
} catch (e) {
|
||||||
|
document.getElementById('sitzungsId').textContent = 'Fehler: ' + e.message;
|
||||||
|
}
|
||||||
|
const geladen = sitzung ? await layoutLaden() : false;
|
||||||
|
if (!geladen) state.tische = [1, 2, 3, 4].map(i => ({ id: i, plaetze: 5, x: i - 1, y: 0 }));
|
||||||
|
knoepfe(); zeichne(); inspektor();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,499 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="de">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>Sitz & Platz — Testoberfläche (M1)</title>
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--akzent: #2f6f4f;
|
||||||
|
--rand: #d9d4c8;
|
||||||
|
--hintergrund: #faf8f3;
|
||||||
|
}
|
||||||
|
* { box-sizing: border-box; }
|
||||||
|
body {
|
||||||
|
font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
|
||||||
|
margin: 0; background: var(--hintergrund); color: #2a2a24;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
header {
|
||||||
|
background: var(--akzent); color: white;
|
||||||
|
padding: 1rem 1.5rem;
|
||||||
|
}
|
||||||
|
header h1 { margin: 0; font-size: 1.3rem; }
|
||||||
|
header p { margin: .2rem 0 0; opacity: .85; font-size: .85rem; }
|
||||||
|
main { max-width: 60rem; margin: 0 auto; padding: 1rem 1.5rem 4rem; }
|
||||||
|
section {
|
||||||
|
background: white; border: 1px solid var(--rand);
|
||||||
|
border-radius: 8px; padding: 1rem 1.25rem; margin-top: 1.25rem;
|
||||||
|
}
|
||||||
|
h2 { font-size: 1.05rem; margin: 0 0 .75rem; color: var(--akzent); }
|
||||||
|
table { border-collapse: collapse; width: 100%; font-size: .9rem; }
|
||||||
|
th, td { border: 1px solid var(--rand); padding: .3rem .5rem; text-align: left; }
|
||||||
|
th { background: #f1eee6; }
|
||||||
|
input[type=number] { width: 4.5rem; }
|
||||||
|
textarea {
|
||||||
|
width: 100%; min-height: 11rem; font-family: ui-monospace, monospace;
|
||||||
|
font-size: .85rem; border: 1px solid var(--rand); border-radius: 4px;
|
||||||
|
padding: .5rem;
|
||||||
|
}
|
||||||
|
button {
|
||||||
|
background: var(--akzent); color: white; border: 0;
|
||||||
|
border-radius: 4px; padding: .45rem .9rem; font-size: .9rem;
|
||||||
|
cursor: pointer; margin: .25rem .35rem .25rem 0;
|
||||||
|
}
|
||||||
|
button.sekundaer { background: #8b8577; }
|
||||||
|
button:disabled { background: #b9b4a6; cursor: not-allowed; }
|
||||||
|
.status { font-size: .85rem; margin-top: .5rem; min-height: 1.2rem; }
|
||||||
|
.status.ok { color: var(--akzent); }
|
||||||
|
.status.fehler { color: #a03030; white-space: pre-wrap; }
|
||||||
|
#svgPlan { margin-top: .75rem; border: 1px solid var(--rand); border-radius: 4px;
|
||||||
|
background: white; overflow: auto; }
|
||||||
|
#svgPlan svg { max-width: 100%; height: auto; display: block; }
|
||||||
|
#svgPlan .person { cursor: pointer; }
|
||||||
|
#svgPlan .person.aktiv { stroke: #111; stroke-width: 3; }
|
||||||
|
#gruppeBox { position: fixed; z-index: 1000; pointer-events: none; display: none;
|
||||||
|
background: #2a2a24; color: white; border-radius: 6px;
|
||||||
|
padding: .5rem .7rem; font-size: .8rem; max-width: 18rem;
|
||||||
|
line-height: 1.35; box-shadow: 0 2px 10px rgba(0,0,0,.35); }
|
||||||
|
#gruppeBox b { display: block; margin-bottom: .3rem; color: var(--akzent-hell, #d6eade); }
|
||||||
|
.kennzahl { display: inline-block; background: #f1eee6; border-radius: 4px;
|
||||||
|
padding: .3rem .7rem; margin: .15rem .3rem .15rem 0; font-size: .9rem; }
|
||||||
|
.kennzahl b { color: var(--akzent); }
|
||||||
|
.hinweis { font-size: .8rem; color: #6b6557; }
|
||||||
|
#gruppenUebersicht tr.fixiert td { background: #e6e3dc; color: #555; }
|
||||||
|
.varianten { display: flex; flex-wrap: wrap; gap: .5rem; margin-top: .6rem; }
|
||||||
|
.variante {
|
||||||
|
border: 1px solid var(--rand); border-radius: 6px; background: white;
|
||||||
|
padding: .5rem .8rem; cursor: pointer; font-size: .85rem; text-align: left;
|
||||||
|
color: #2a2a24; min-width: 11rem;
|
||||||
|
}
|
||||||
|
.variante.aktiv { border-color: var(--akzent); background: #e6f0ea;
|
||||||
|
box-shadow: 0 0 0 1px var(--akzent); }
|
||||||
|
.variante b { color: var(--akzent); font-size: 1rem; }
|
||||||
|
.variante .zeile { display: block; color: #6b6557; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>Sitz & Platz <small style="font-weight:normal">— Testoberfläche (Meilenstein 1)</small></h1>
|
||||||
|
<p>Session-basiert, nichts wird dauerhaft gespeichert (TTL 24 h). Sitzung: <code id="sitzungsId">wird angelegt…</code>
|
||||||
|
· <a href="/editor.html" style="color:#d6eade">grafischer Tisch-Editor</a></p>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>1. Tische definieren</h2>
|
||||||
|
<p class="hinweis">Koordinaten sind Rasterpositionen (wie in tische.ini). Tische, die
|
||||||
|
näher als der Nachbar-Radius (1,5 Rastereinheiten) beieinander liegen, gelten
|
||||||
|
automatisch als Nachbarn — Gruppen, die geteilt werden müssen, kommen bevorzugt
|
||||||
|
an Nachbartische.</p>
|
||||||
|
<table id="tischTabelle">
|
||||||
|
<thead>
|
||||||
|
<tr><th>Tisch-Nr.</th><th>Plätze</th><th>X</th><th>Y</th><th></th></tr>
|
||||||
|
</thead>
|
||||||
|
<tbody></tbody>
|
||||||
|
</table>
|
||||||
|
<button type="button" onclick="tischZeile()">+ Tisch hinzufügen</button>
|
||||||
|
<button type="button" class="sekundaer" onclick="presetReihe()">Preset: 4er-Reihe</button>
|
||||||
|
<button type="button" class="sekundaer" onclick="presetRaster()">Preset: 3×3-Raster</button>
|
||||||
|
<br>
|
||||||
|
<label class="hinweis">Oder eine bestehende <code>tische.ini</code> auswählen
|
||||||
|
(z. B. aus <code>work/hochzeit</code>) — wird sofort geladen:</label>
|
||||||
|
<input type="file" id="tischDatei" accept=".ini,text/plain" onchange="tischDateiLaden()">
|
||||||
|
<br>
|
||||||
|
<button type="button" onclick="tischeSpeichern()">Tische speichern</button>
|
||||||
|
<div class="status" id="tischStatus"></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>2. Gästeliste (CSV)</h2>
|
||||||
|
<p class="hinweis">Spalten: <code>Vorname;Nachname;Titel;Gruppe;Tisch;Anzahl</code> —
|
||||||
|
<code>Gruppe</code> hält Personen zusammen (leer = Einzelgast),
|
||||||
|
<code>Tisch</code> fixiert Gäste an einem Tisch (z. B. Brautpaar an Tisch 1),
|
||||||
|
<code>Anzahl</code> expandiert eine Zeile in mehrere Buchungen
|
||||||
|
(anonyme Sammelbuchung). Eine Datei auswählen (wird sofort übernommen)
|
||||||
|
<em>oder</em> hier direkt bearbeiten und übernehmen:</p>
|
||||||
|
<textarea id="csvText"></textarea>
|
||||||
|
<br>
|
||||||
|
<input type="file" id="csvDatei" accept=".csv,text/csv">
|
||||||
|
<br>
|
||||||
|
<button type="button" onclick="gaesteHochladen()">Gästeliste übernehmen</button>
|
||||||
|
<div class="status" id="gaesteStatus"></div>
|
||||||
|
<div id="gruppenUebersicht"></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>3. Sitzordnung berechnen & Varianten vergleichen</h2>
|
||||||
|
<p class="hinweis">Ein Lauf liefert bis zu drei <em>unterschiedliche</em> gute
|
||||||
|
Sitzordnungen zum Vergleich — die Wertigkeit (0 = perfekt, negativer = schlechter),
|
||||||
|
die Zahl getrennter Gruppen und allein sitzende Personen machen sie vergleichbar.
|
||||||
|
Variante anklicken, um Tische und Raumplan umzuschalten; jeder weitere Klick auf
|
||||||
|
„Berechnen“ startet einen frischen Lauf. Über das <em>Optimierungsprofil</em> lassen sich
|
||||||
|
Bewertungs-Vorgehen vergleichen (z. B. <code>default</code> vs.
|
||||||
|
<code>locker</code>): Profil wählen und neu berechnen.</p>
|
||||||
|
<label class="hinweis">Optimierungsprofil:
|
||||||
|
<select id="strafenWahl"></select></label>
|
||||||
|
<button type="button" id="berechnenKnopf" onclick="berechnen()" disabled>Sitzordnung berechnen</button>
|
||||||
|
<div class="status" id="rechnenStatus"></div>
|
||||||
|
<div class="varianten" id="variantenListe"></div>
|
||||||
|
<div id="kennzahlen"></div>
|
||||||
|
<p class="hinweis" style="margin-bottom:0">Im Raumplan mit der Maus über eine Person
|
||||||
|
fahren: Tooltip zeigt Name & Gruppe, ein Kasten listet alle Namen dieser Gruppe,
|
||||||
|
und die Gruppe wird im Plan hervorgehoben.</p>
|
||||||
|
<div id="svgPlan"></div>
|
||||||
|
<div id="ergebnisTabellen"></div>
|
||||||
|
</section>
|
||||||
|
<div id="gruppeBox"></div>
|
||||||
|
|
||||||
|
</main>
|
||||||
|
<script>
|
||||||
|
'use strict';
|
||||||
|
let sitzung = null;
|
||||||
|
|
||||||
|
async function api(pfad, optionen) {
|
||||||
|
const antwort = await fetch(pfad, optionen);
|
||||||
|
const daten = await antwort.json().catch(() => null);
|
||||||
|
if (!antwort.ok) {
|
||||||
|
const detail = daten && daten.detail
|
||||||
|
? (typeof daten.detail === 'string' ? daten.detail : JSON.stringify(daten.detail, null, 2))
|
||||||
|
: antwort.statusText;
|
||||||
|
throw new Error(detail);
|
||||||
|
}
|
||||||
|
return daten;
|
||||||
|
}
|
||||||
|
|
||||||
|
function status(id, text, klasse) {
|
||||||
|
const el = document.getElementById(id);
|
||||||
|
el.textContent = text;
|
||||||
|
el.className = 'status ' + (klasse || '');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------ 1. Tische */
|
||||||
|
let geladenerRadius = 1.5; // zuletzt aus der Session geladener Nachbar-Radius
|
||||||
|
|
||||||
|
async function tischeAusSessionLaden() {
|
||||||
|
// Sektion 1 aus dem serverseitigen Session-Layout fuellen (z.B. was der
|
||||||
|
// grafische Editor gespeichert hat) statt fest das Preset zu zeigen.
|
||||||
|
try {
|
||||||
|
const r = await api('/sitzung/' + sitzung + '/tische');
|
||||||
|
if (r.tische && r.tische.length) {
|
||||||
|
tischeLeeren();
|
||||||
|
for (const t of r.tische) tischZeile(t.plaetze, t.x, t.y, t.id);
|
||||||
|
geladenerRadius = r.nachbarRadius || 1.5;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch (e) { /* frische/abgelaufene Session — Preset als Fallback */ }
|
||||||
|
presetReihe();
|
||||||
|
}
|
||||||
|
|
||||||
|
function tischZeile(plaetze, x, y, tid) {
|
||||||
|
const tbody = document.querySelector('#tischTabelle tbody');
|
||||||
|
const nr = tid ?? tbody.children.length + 1;
|
||||||
|
const tr = document.createElement('tr');
|
||||||
|
if (tid !== undefined) tr.dataset.tid = tid; // echte Id aus tische.ini behalten
|
||||||
|
tr.innerHTML =
|
||||||
|
'<td class="tischNr">' + nr + '</td>' +
|
||||||
|
'<td><input type="number" min="1" max="100" value="' + (plaetze ?? 8) + '" class="plaetze"></td>' +
|
||||||
|
'<td><input type="number" step="1" value="' + (x ?? nr) + '" class="x"></td>' +
|
||||||
|
'<td><input type="number" step="1" value="' + (y ?? 1) + '" class="y"></td>' +
|
||||||
|
'<td><button type="button" class="sekundaer" onclick="this.closest(\'tr\').remove(); nummerieren()">✕</button></td>';
|
||||||
|
tbody.appendChild(tr);
|
||||||
|
}
|
||||||
|
function nummerieren() {
|
||||||
|
document.querySelectorAll('#tischTabelle tbody tr').forEach((tr, i) => {
|
||||||
|
if (tr.dataset.tid === undefined)
|
||||||
|
tr.querySelector('.tischNr').textContent = i + 1;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function tischeLeeren() {
|
||||||
|
document.querySelector('#tischTabelle tbody').innerHTML = '';
|
||||||
|
}
|
||||||
|
function presetReihe() {
|
||||||
|
tischeLeeren();
|
||||||
|
for (let i = 1; i <= 4; i++) tischZeile(5, i, 1);
|
||||||
|
}
|
||||||
|
function presetRaster() {
|
||||||
|
tischeLeeren();
|
||||||
|
for (let y = 1; y <= 3; y++)
|
||||||
|
for (let x = 1; x <= 3; x++)
|
||||||
|
tischZeile(8, x, y);
|
||||||
|
}
|
||||||
|
async function tischeSpeichern() {
|
||||||
|
const zeilen = [...document.querySelectorAll('#tischTabelle tbody tr')];
|
||||||
|
if (zeilen.length === 0) { status('tischStatus', 'Mindestens ein Tisch nötig.', 'fehler'); return; }
|
||||||
|
// Zeilen aus einer geladenen tische.ini behalten ihre echte Id
|
||||||
|
// (wichtig fuer VIP-Bindungen wie "Tisch 16"); neue Zeilen bekommen
|
||||||
|
// die naechste freie Id
|
||||||
|
const vergeben = new Set(zeilen.map(tr => parseInt(tr.dataset.tid, 10)).filter(n => !isNaN(n)));
|
||||||
|
let naechste = 1;
|
||||||
|
const freieId = () => { while (vergeben.has(naechste)) naechste++; vergeben.add(naechste); return naechste; };
|
||||||
|
const tische = zeilen.map(tr => ({
|
||||||
|
id: tr.dataset.tid !== undefined ? parseInt(tr.dataset.tid, 10) : freieId(),
|
||||||
|
plaetze: parseInt(tr.querySelector('.plaetze').value, 10),
|
||||||
|
x: parseFloat(tr.querySelector('.x').value),
|
||||||
|
y: parseFloat(tr.querySelector('.y').value),
|
||||||
|
}));
|
||||||
|
try {
|
||||||
|
const r = await api('/sitzung/' + sitzung + '/tische', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({ tische, nachbarRadius: geladenerRadius }),
|
||||||
|
});
|
||||||
|
const nachbarn = r.tische.map(t => 'Tisch ' + t.id + ' ↔ [' + t.nachbarn.join(', ') + ']').join(' ');
|
||||||
|
status('tischStatus', '✓ ' + r.tische.length + ' Tische, ' + r.plaetzeGesamt +
|
||||||
|
' Plätze gesamt. Abgeleitete Nachbarn: ' + nachbarn, 'ok');
|
||||||
|
berechnenFreigeben();
|
||||||
|
} catch (e) { status('tischStatus', 'Fehler: ' + e.message, 'fehler'); }
|
||||||
|
}
|
||||||
|
|
||||||
|
async function tischDateiLaden() {
|
||||||
|
const eingabe = document.getElementById('tischDatei');
|
||||||
|
if (eingabe.files.length === 0) {
|
||||||
|
status('tischStatus', 'Bitte zuerst eine tische.ini auswählen.', 'fehler');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const form = new FormData();
|
||||||
|
form.append('datei', eingabe.files[0]);
|
||||||
|
try {
|
||||||
|
const r = await api('/sitzung/' + sitzung + '/tische-datei', { method: 'POST', body: form });
|
||||||
|
tischeLeeren();
|
||||||
|
for (const t of r.tische) tischZeile(t.plaetze, t.x, t.y, t.id);
|
||||||
|
status('tischStatus', '✓ ' + r.tische.length + ' Tische aus Datei übernommen (' +
|
||||||
|
r.plaetzeGesamt + ' Plätze) — Layout ist bereits gespeichert, ' +
|
||||||
|
'„Tische speichern“ ist nur nach Änderungen nötig.', 'ok');
|
||||||
|
berechnenFreigeben();
|
||||||
|
} catch (e) { status('tischStatus', 'Fehler: ' + e.message, 'fehler'); }
|
||||||
|
finally { eingabe.value = ''; } // damit dieselbe Datei erneut auswählbar ist
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------ 2. Gäste */
|
||||||
|
const beispielCSV = `Vorname;Nachname;Titel;Gruppe;Tisch;Anzahl
|
||||||
|
Britta;Beispiel;;Brautpaar;1;
|
||||||
|
Bernd;Beispiel;Dr.;Brautpaar;1;
|
||||||
|
Anna;Huber;;Familie Huber;;
|
||||||
|
Berta;Huber;;Familie Huber;;
|
||||||
|
Carl;Huber;;Familie Huber;;
|
||||||
|
Doris;Huber;;Familie Huber;;
|
||||||
|
Emil;Meier;;Familie Meier;;
|
||||||
|
Frieda;Meier;;Familie Meier;;
|
||||||
|
Gustav;Meier;;Familie Meier;;
|
||||||
|
Hanna;Schmidt;;Studienfreunde;;
|
||||||
|
Igor;Petrov;;Studienfreunde;;
|
||||||
|
Julia;Weber;;Studienfreunde;;
|
||||||
|
Gast;Kollegium;;Kollegen;;4
|
||||||
|
Karl;Einzelgast;;;;
|
||||||
|
`;
|
||||||
|
|
||||||
|
async function csvDateiGewaehlt(ev) {
|
||||||
|
// Ausgewaehlte CSV sofort sichtbar in die Textarea laden (Single Source):
|
||||||
|
// dekodieren wie das Backend (utf-8-sig, sonst cp1252), BOM strippen.
|
||||||
|
const datei = ev.target.files[0];
|
||||||
|
if (!datei) return;
|
||||||
|
const puffer = await datei.arrayBuffer();
|
||||||
|
let text;
|
||||||
|
try {
|
||||||
|
text = new TextDecoder('utf-8', { fatal: true }).decode(puffer);
|
||||||
|
} catch (e) {
|
||||||
|
text = new TextDecoder('windows-1252').decode(puffer); // Excel/Windows
|
||||||
|
}
|
||||||
|
text = text.replace(/^/, '');
|
||||||
|
document.getElementById('csvText').value = text;
|
||||||
|
ev.target.value = ''; // damit dieselbe Datei erneut auswählbar ist
|
||||||
|
// direkt uebernehmen: die ausgewaehlte Datei wird sofort geladen (die
|
||||||
|
// Textarea ist bereits befuellt und dient gaesteHochladen als Quelle)
|
||||||
|
await gaesteHochladen();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function gaesteHochladen() {
|
||||||
|
// immer die (ggf. aus einer Datei befuellte) Textarea senden
|
||||||
|
const blob = new Blob([document.getElementById('csvText').value], { type: 'text/csv' });
|
||||||
|
const form = new FormData();
|
||||||
|
form.append('datei', blob, 'gaeste.csv');
|
||||||
|
try {
|
||||||
|
const r = await api('/sitzung/' + sitzung + '/personen', { method: 'POST', body: form });
|
||||||
|
status('gaesteStatus', '✓ ' + r.personen + ' Personen in ' + r.gruppen.length +
|
||||||
|
' Gruppen' + (r.fixiert ? ', dazu ' + r.fixiert +
|
||||||
|
' fixierte Personen an festen Tischen' : '') + '.', 'ok');
|
||||||
|
// regulaere Gruppen, danach die fest platzierten ("fixierten") Gruppen
|
||||||
|
// grau hinterlegt
|
||||||
|
const regulaer = r.gruppen.map(g =>
|
||||||
|
'<tr><td>' + g.name + '</td><td>' + g.anzahl + '</td></tr>').join('');
|
||||||
|
const fixiert = (r.fixierte || []).map(f =>
|
||||||
|
'<tr class="fixiert"><td>' + f.name +
|
||||||
|
' <span class="hinweis">(fixiert an Tisch ' + f.tisch + ')</span></td><td>' +
|
||||||
|
f.anzahl + '</td></tr>').join('');
|
||||||
|
const html = '<table><thead><tr><th>Gruppe</th><th>Personen</th></tr></thead><tbody>' +
|
||||||
|
regulaer + fixiert + '</tbody></table>';
|
||||||
|
document.getElementById('gruppenUebersicht').innerHTML = html;
|
||||||
|
berechnenFreigeben();
|
||||||
|
} catch (e) { status('gaesteStatus', 'Fehler: ' + e.message, 'fehler'); }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------ 3. Berechnen */
|
||||||
|
async function strafprofileLaden() {
|
||||||
|
// Auswahl der Strafprofile aus strafen.cfg fuellen (z.B. default, locker)
|
||||||
|
try {
|
||||||
|
const r = await api('/strafprofile');
|
||||||
|
const sel = document.getElementById('strafenWahl');
|
||||||
|
sel.innerHTML = r.profile.map(p =>
|
||||||
|
'<option value="' + p + '"' + (p === r.vorgabe ? ' selected' : '') +
|
||||||
|
'>' + p + '</option>').join('');
|
||||||
|
} catch (e) { /* Auswahl bleibt leer -> Backend nutzt sein Default */ }
|
||||||
|
}
|
||||||
|
|
||||||
|
async function berechnenFreigeben() {
|
||||||
|
try {
|
||||||
|
const s = await api('/sitzung/' + sitzung);
|
||||||
|
document.getElementById('berechnenKnopf').disabled = !(s.tische > 0 && s.personen > 0);
|
||||||
|
} catch (e) { /* Session ggf. abgelaufen — beim Berechnen gemeldet */ }
|
||||||
|
}
|
||||||
|
|
||||||
|
let letzterLauf = null; // Antwort des letzten Berechnen-Laufs (mit Varianten)
|
||||||
|
|
||||||
|
async function berechnen() {
|
||||||
|
const knopf = document.getElementById('berechnenKnopf');
|
||||||
|
knopf.disabled = true;
|
||||||
|
status('rechnenStatus', 'Der genetische Algorithmus läuft…');
|
||||||
|
try {
|
||||||
|
const profil = document.getElementById('strafenWahl').value || 'default';
|
||||||
|
const r = await api('/sitzung/' + sitzung + '/berechnen?varianten=3&strafen=' +
|
||||||
|
encodeURIComponent(profil), { method: 'POST' });
|
||||||
|
letzterLauf = r;
|
||||||
|
status('rechnenStatus', '✓ Lauf ' + r.lauf + ' (Optimierungsprofil „' + r.strafen + '“): ' +
|
||||||
|
r.varianten.length +
|
||||||
|
(r.varianten.length === 1
|
||||||
|
? ' Variante gefunden (der Lauf konvergierte auf eine Sitzordnung).'
|
||||||
|
: ' unterschiedliche Varianten zum Vergleich.'), 'ok');
|
||||||
|
knopf.textContent = 'Neuen Lauf berechnen';
|
||||||
|
zeigeVariantenListe(r);
|
||||||
|
await zeigeVariante(0);
|
||||||
|
} catch (e) {
|
||||||
|
status('rechnenStatus', 'Fehler: ' + e.message, 'fehler');
|
||||||
|
} finally {
|
||||||
|
knopf.disabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function zeigeVariantenListe(r) {
|
||||||
|
document.getElementById('variantenListe').innerHTML = r.varianten.map((v, i) =>
|
||||||
|
'<button type="button" class="variante" data-i="' + i + '" onclick="zeigeVariante(' + i + ')">' +
|
||||||
|
'<b>Variante ' + v.nr + '</b>' +
|
||||||
|
'<span class="zeile">Wertigkeit: ' + v.kennzahlen.wertigkeit + '</span>' +
|
||||||
|
'<span class="zeile">getrennte Gruppen: ' + v.kennzahlen.getrennteGruppen +
|
||||||
|
' (' + v.kennzahlen.teilungenGesamt + ' Teilungen)</span>' +
|
||||||
|
'<span class="zeile">allein sitzend: ' + v.kennzahlen.alleinePersonen + '</span>' +
|
||||||
|
'</button>').join('');
|
||||||
|
}
|
||||||
|
|
||||||
|
async function zeigeVariante(i) {
|
||||||
|
if (!letzterLauf || !letzterLauf.varianten[i]) return;
|
||||||
|
const v = letzterLauf.varianten[i];
|
||||||
|
document.querySelectorAll('#variantenListe .variante').forEach(el =>
|
||||||
|
el.classList.toggle('aktiv', parseInt(el.dataset.i, 10) === i));
|
||||||
|
|
||||||
|
document.getElementById('kennzahlen').innerHTML =
|
||||||
|
'<span class="kennzahl">Variante: <b>' + v.nr + '</b> (Lauf ' + letzterLauf.lauf + ')</span>' +
|
||||||
|
'<span class="kennzahl">Optimierungsprofil: <b>' + letzterLauf.strafen + '</b></span>' +
|
||||||
|
'<span class="kennzahl">Wertigkeit: <b>' + v.kennzahlen.wertigkeit + '</b></span>' +
|
||||||
|
'<span class="kennzahl">getrennte Gruppen: <b>' + v.kennzahlen.getrennteGruppen + '</b></span>' +
|
||||||
|
'<span class="kennzahl">allein sitzend: <b>' + v.kennzahlen.alleinePersonen + '</b></span>';
|
||||||
|
|
||||||
|
let html = '<table><thead><tr><th>Tisch</th><th>Belegung</th><th>Gäste (Gruppe)</th></tr></thead><tbody>';
|
||||||
|
for (const t of v.tische) {
|
||||||
|
const gaeste = t.personen.map(p =>
|
||||||
|
((p.titel ? p.titel + ' ' : '') + p.vorname + ' ' + p.nachname +
|
||||||
|
' <span class="hinweis">(' + p.gruppe + ')</span>')).join(', ');
|
||||||
|
html += '<tr><td>Tisch ' + t.nummer + '</td><td>' + t.besetzt + '/' + t.plaetze +
|
||||||
|
'</td><td>' + gaeste + '</td></tr>';
|
||||||
|
}
|
||||||
|
html += '</tbody></table>';
|
||||||
|
|
||||||
|
html += '<h2 style="margin-top:1rem">Gruppen</h2>' +
|
||||||
|
'<table><thead><tr><th>Gruppe</th><th>Personen</th><th>Teilungen</th><th>Strafpunkte</th></tr></thead><tbody>' +
|
||||||
|
v.gruppen.map(g => '<tr><td>' + g.name + '</td><td>' + g.anzahl + '</td><td>' +
|
||||||
|
g.teilungen + '</td><td>' + g.wert + '</td></tr>').join('') +
|
||||||
|
'</tbody></table>';
|
||||||
|
document.getElementById('ergebnisTabellen').innerHTML = html;
|
||||||
|
|
||||||
|
// Raumplan der gewaehlten Variante — inline einbetten (nicht als <img>),
|
||||||
|
// damit die <title>-Tooltips und das Gruppen-Hover funktionieren
|
||||||
|
try {
|
||||||
|
const antwort = await fetch('/sitzung/' + sitzung + '/ergebnis.svg?variante=' + v.nr);
|
||||||
|
const svgText = await antwort.text();
|
||||||
|
const plan = document.getElementById('svgPlan');
|
||||||
|
plan.innerHTML = svgText.replace(/<\?xml[^>]*\?>/, ''); // XML-Prolog raus
|
||||||
|
gruppeInteraktion(plan.querySelector('svg'));
|
||||||
|
} catch (e) { /* SVG optional — Tabellen stehen schon da */ }
|
||||||
|
}
|
||||||
|
|
||||||
|
function escHtml(s) {
|
||||||
|
return (s || '').replace(/[&<>"]/g, c =>
|
||||||
|
({ '&': '&', '<': '<', '>': '>', '"': '"' }[c]));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hover ueber einen Personenkreis: alle Kreise derselben Gruppe hervorheben
|
||||||
|
// und einen Kasten mit der Namensliste dieser Gruppe zeigen. Die Namen kommen
|
||||||
|
// direkt aus den data-name/data-gruppe-Attributen der SVG (vom Kern erzeugt).
|
||||||
|
function gruppeInteraktion(svg) {
|
||||||
|
if (!svg) return;
|
||||||
|
const box = document.getElementById('gruppeBox');
|
||||||
|
let markiert = null;
|
||||||
|
svg.querySelectorAll('.person').forEach(kreis => {
|
||||||
|
kreis.addEventListener('mouseenter', () => {
|
||||||
|
const gruppe = kreis.dataset.gruppe || '';
|
||||||
|
const gleiche = svg.querySelectorAll(
|
||||||
|
'.person[data-gruppe="' + (window.CSS ? CSS.escape(gruppe) : gruppe) + '"]');
|
||||||
|
gleiche.forEach(k => k.classList.add('aktiv'));
|
||||||
|
markiert = gleiche;
|
||||||
|
const namen = [...gleiche].map(k => k.dataset.name || '');
|
||||||
|
box.innerHTML = '<b>' + escHtml(gruppe) + ' (' + namen.length + ')</b>' +
|
||||||
|
namen.map(escHtml).join('<br>');
|
||||||
|
box.style.display = 'block';
|
||||||
|
});
|
||||||
|
kreis.addEventListener('mouseleave', () => {
|
||||||
|
if (markiert) markiert.forEach(k => k.classList.remove('aktiv'));
|
||||||
|
markiert = null;
|
||||||
|
box.style.display = 'none';
|
||||||
|
});
|
||||||
|
});
|
||||||
|
svg.addEventListener('mousemove', e => {
|
||||||
|
box.style.left = (e.clientX + 14) + 'px';
|
||||||
|
box.style.top = (e.clientY + 14) + 'px';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------ Start */
|
||||||
|
window.addEventListener('DOMContentLoaded', async () => {
|
||||||
|
document.getElementById('csvText').value = beispielCSV;
|
||||||
|
document.getElementById('csvDatei').addEventListener('change', csvDateiGewaehlt);
|
||||||
|
strafprofileLaden();
|
||||||
|
try {
|
||||||
|
sitzung = await sitzungHolen();
|
||||||
|
document.getElementById('sitzungsId').textContent = sitzung;
|
||||||
|
// Tische aus der (ggf. mit dem Editor geteilten) Session laden;
|
||||||
|
// Preset nur, wenn die Session noch keine Tische hat
|
||||||
|
await tischeAusSessionLaden();
|
||||||
|
berechnenFreigeben();
|
||||||
|
} catch (e) {
|
||||||
|
document.getElementById('sitzungsId').textContent = 'Fehler: ' + e.message;
|
||||||
|
presetReihe();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Session mit dem grafischen Editor (editor.html) ueber localStorage teilen:
|
||||||
|
// eine bestehende, noch gueltige Sitzung wiederverwenden statt jedes Mal
|
||||||
|
// eine neue anzulegen — so wirkt ein im Editor gebautes Layout hier weiter.
|
||||||
|
async function sitzungHolen() {
|
||||||
|
let id = localStorage.getItem('platzSitzung');
|
||||||
|
if (id) {
|
||||||
|
const ok = await fetch('/sitzung/' + id).then(r => r.ok).catch(() => false);
|
||||||
|
if (ok) return id;
|
||||||
|
}
|
||||||
|
const r = await api('/sitzung', { method: 'POST' });
|
||||||
|
localStorage.setItem('platzSitzung', r.id);
|
||||||
|
return r.id;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,458 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="2200" height="430" viewBox="0 0 2200 430" font-family="sans-serif">
|
||||||
|
<rect width="100%" height="100%" fill="white"/>
|
||||||
|
<text x="1100" y="30" text-anchor="middle" font-size="16" fill="#333">Abstammung der Loesungen (Mutationsbaum)</text>
|
||||||
|
<line x1="60.0" y1="60.0" x2="60.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="113.3" y1="60.0" x2="86.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="166.7" y1="60.0" x2="112.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="220.0" y1="60.0" x2="139.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="273.3" y1="60.0" x2="165.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="326.7" y1="60.0" x2="191.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="380.0" y1="60.0" x2="218.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="433.3" y1="60.0" x2="244.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="486.7" y1="60.0" x2="270.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="540.0" y1="60.0" x2="297.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="593.3" y1="60.0" x2="323.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="646.7" y1="60.0" x2="349.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="700.0" y1="60.0" x2="375.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="753.3" y1="60.0" x2="402.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="806.7" y1="60.0" x2="428.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="860.0" y1="60.0" x2="454.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="913.3" y1="60.0" x2="481.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="966.7" y1="60.0" x2="507.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1020.0" y1="60.0" x2="533.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1073.3" y1="60.0" x2="560.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1126.7" y1="60.0" x2="586.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1180.0" y1="60.0" x2="612.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1233.3" y1="60.0" x2="639.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1286.7" y1="60.0" x2="665.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1340.0" y1="60.0" x2="691.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1393.3" y1="60.0" x2="718.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1446.7" y1="60.0" x2="744.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1500.0" y1="60.0" x2="770.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1553.3" y1="60.0" x2="797.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1606.7" y1="60.0" x2="823.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1660.0" y1="60.0" x2="849.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1713.3" y1="60.0" x2="876.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1766.7" y1="60.0" x2="902.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1820.0" y1="60.0" x2="928.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1873.3" y1="60.0" x2="955.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1926.7" y1="60.0" x2="981.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1980.0" y1="60.0" x2="1007.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2033.3" y1="60.0" x2="1034.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2086.7" y1="60.0" x2="1060.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2140.0" y1="60.0" x2="1086.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="60.0" y1="60.0" x2="1113.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="113.3" y1="60.0" x2="1139.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="166.7" y1="60.0" x2="1165.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="220.0" y1="60.0" x2="1192.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="273.3" y1="60.0" x2="1218.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="326.7" y1="60.0" x2="1244.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="380.0" y1="60.0" x2="1271.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="433.3" y1="60.0" x2="1297.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="486.7" y1="60.0" x2="1323.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="540.0" y1="60.0" x2="1350.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="593.3" y1="60.0" x2="1376.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="646.7" y1="60.0" x2="1402.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="700.0" y1="60.0" x2="1429.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="753.3" y1="60.0" x2="1455.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="806.7" y1="60.0" x2="1481.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="860.0" y1="60.0" x2="1508.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="913.3" y1="60.0" x2="1534.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="966.7" y1="60.0" x2="1560.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1020.0" y1="60.0" x2="1587.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1073.3" y1="60.0" x2="1613.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1126.7" y1="60.0" x2="1639.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1180.0" y1="60.0" x2="1666.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1233.3" y1="60.0" x2="1692.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1286.7" y1="60.0" x2="1718.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1340.0" y1="60.0" x2="1745.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1393.3" y1="60.0" x2="1771.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1446.7" y1="60.0" x2="1797.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1500.0" y1="60.0" x2="1824.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1553.3" y1="60.0" x2="1850.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1606.7" y1="60.0" x2="1876.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1660.0" y1="60.0" x2="1903.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1713.3" y1="60.0" x2="1929.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1766.7" y1="60.0" x2="1955.7" y2="150.0" stroke="#c04040" stroke-width="2.5"/>
|
||||||
|
<line x1="1820.0" y1="60.0" x2="1982.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1873.3" y1="60.0" x2="2008.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1926.7" y1="60.0" x2="2034.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1980.0" y1="60.0" x2="2061.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2033.3" y1="60.0" x2="2087.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2086.7" y1="60.0" x2="2113.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2140.0" y1="60.0" x2="2140.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1955.7" y1="150.0" x2="60.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1766.7" y1="60.0" x2="91.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="966.7" y1="60.0" x2="122.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="507.6" y1="150.0" x2="153.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1560.8" y1="150.0" x2="184.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="112.7" y1="150.0" x2="215.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="139.0" y1="150.0" x2="246.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1323.8" y1="150.0" x2="277.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1508.1" y1="150.0" x2="308.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="486.7" y1="60.0" x2="339.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="860.0" y1="60.0" x2="370.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1126.7" y1="60.0" x2="401.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="86.3" y1="150.0" x2="432.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="349.6" y1="150.0" x2="463.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="612.9" y1="150.0" x2="494.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1192.2" y1="150.0" x2="525.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1244.8" y1="150.0" x2="556.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1402.8" y1="150.0" x2="587.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1771.4" y1="150.0" x2="618.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="113.3" y1="60.0" x2="649.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="913.3" y1="60.0" x2="680.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1553.3" y1="60.0" x2="711.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="533.9" y1="150.0" x2="743.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="902.5" y1="150.0" x2="774.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1666.1" y1="150.0" x2="805.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1745.1" y1="150.0" x2="836.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1876.7" y1="150.0" x2="867.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1086.8" y1="150.0" x2="898.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1534.4" y1="150.0" x2="929.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1606.7" y1="60.0" x2="960.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="428.6" y1="150.0" x2="991.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1020.0" y1="60.0" x2="1022.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="297.0" y1="150.0" x2="1053.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1350.1" y1="150.0" x2="1084.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1955.7" y1="150.0" x2="1115.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1766.7" y1="60.0" x2="1146.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="966.7" y1="60.0" x2="1177.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="507.6" y1="150.0" x2="1208.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1560.8" y1="150.0" x2="1239.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="112.7" y1="150.0" x2="1270.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="139.0" y1="150.0" x2="1301.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1323.8" y1="150.0" x2="1332.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1508.1" y1="150.0" x2="1363.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="486.7" y1="60.0" x2="1394.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="860.0" y1="60.0" x2="1426.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1126.7" y1="60.0" x2="1457.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="86.3" y1="150.0" x2="1488.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="349.6" y1="150.0" x2="1519.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="612.9" y1="150.0" x2="1550.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1192.2" y1="150.0" x2="1581.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1244.8" y1="150.0" x2="1612.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1402.8" y1="150.0" x2="1643.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1771.4" y1="150.0" x2="1674.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="113.3" y1="60.0" x2="1705.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="913.3" y1="60.0" x2="1736.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1553.3" y1="60.0" x2="1767.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="533.9" y1="150.0" x2="1798.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="902.5" y1="150.0" x2="1829.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1666.1" y1="150.0" x2="1860.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1745.1" y1="150.0" x2="1891.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1876.7" y1="150.0" x2="1922.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1086.8" y1="150.0" x2="1953.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1534.4" y1="150.0" x2="1984.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1606.7" y1="60.0" x2="2015.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="428.6" y1="150.0" x2="2046.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1020.0" y1="60.0" x2="2077.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="297.0" y1="150.0" x2="2109.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1350.1" y1="150.0" x2="2140.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="774.0" y1="240.0" x2="60.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1955.7" y1="150.0" x2="97.8" y2="330.0" stroke="#c04040" stroke-width="2.5"/>
|
||||||
|
<line x1="1766.7" y1="60.0" x2="135.6" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="60.0" y1="240.0" x2="173.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="91.0" y1="240.0" x2="211.3" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1146.6" y1="240.0" x2="249.1" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1239.7" y1="240.0" x2="286.9" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="966.7" y1="60.0" x2="324.7" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="960.3" y1="240.0" x2="362.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1177.6" y1="240.0" x2="400.4" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1674.3" y1="240.0" x2="438.2" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="507.6" y1="150.0" x2="476.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1560.8" y1="150.0" x2="513.8" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="618.8" y1="240.0" x2="551.6" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1270.7" y1="240.0" x2="589.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="112.7" y1="150.0" x2="627.3" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="246.3" y1="240.0" x2="665.1" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="867.2" y1="240.0" x2="702.9" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1922.7" y1="240.0" x2="740.7" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="139.0" y1="150.0" x2="778.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="277.3" y1="240.0" x2="816.4" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="370.4" y1="240.0" x2="854.2" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="401.5" y1="240.0" x2="892.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1426.0" y1="240.0" x2="929.8" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1457.0" y1="240.0" x2="967.6" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1323.8" y1="150.0" x2="1005.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1508.1" y1="150.0" x2="1043.3" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="486.7" y1="60.0" x2="1081.1" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="774.0" y1="240.0" x2="1118.9" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1955.7" y1="150.0" x2="1156.7" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1766.7" y1="60.0" x2="1194.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="60.0" y1="240.0" x2="1232.4" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="91.0" y1="240.0" x2="1270.2" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1146.6" y1="240.0" x2="1308.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1239.7" y1="240.0" x2="1345.8" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="966.7" y1="60.0" x2="1383.6" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="960.3" y1="240.0" x2="1421.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1177.6" y1="240.0" x2="1459.3" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1674.3" y1="240.0" x2="1497.1" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="507.6" y1="150.0" x2="1534.9" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1560.8" y1="150.0" x2="1572.7" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="618.8" y1="240.0" x2="1610.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1270.7" y1="240.0" x2="1648.4" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="112.7" y1="150.0" x2="1686.2" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="246.3" y1="240.0" x2="1724.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="867.2" y1="240.0" x2="1761.8" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1922.7" y1="240.0" x2="1799.6" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="139.0" y1="150.0" x2="1837.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="277.3" y1="240.0" x2="1875.3" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="370.4" y1="240.0" x2="1913.1" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="401.5" y1="240.0" x2="1950.9" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1426.0" y1="240.0" x2="1988.7" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1457.0" y1="240.0" x2="2026.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1323.8" y1="150.0" x2="2064.4" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1508.1" y1="150.0" x2="2102.2" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="486.7" y1="60.0" x2="2140.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<circle cx="60.0" cy="60.0" r="5" fill="#577147" stroke="#333" stroke-width="0.5"><title>Id 1, Wert -83.7</title></circle>
|
||||||
|
<circle cx="113.3" cy="60.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 2, Wert -54.7</title></circle>
|
||||||
|
<circle cx="166.7" cy="60.0" r="5" fill="#5b6f46" stroke="#333" stroke-width="0.5"><title>Id 3, Wert -86.3</title></circle>
|
||||||
|
<circle cx="220.0" cy="60.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 4, Wert -57.7</title></circle>
|
||||||
|
<circle cx="273.3" cy="60.0" r="5" fill="#36834d" stroke="#333" stroke-width="0.5"><title>Id 5, Wert -59.3</title></circle>
|
||||||
|
<circle cx="326.7" cy="60.0" r="5" fill="#37834d" stroke="#333" stroke-width="0.5"><title>Id 6, Wert -60.3</title></circle>
|
||||||
|
<circle cx="380.0" cy="60.0" r="5" fill="#597046" stroke="#333" stroke-width="0.5"><title>Id 7, Wert -84.7</title></circle>
|
||||||
|
<circle cx="433.3" cy="60.0" r="5" fill="#36834d" stroke="#333" stroke-width="0.5"><title>Id 8, Wert -59.3</title></circle>
|
||||||
|
<circle cx="486.7" cy="60.0" r="5" fill="#2e884e" stroke="#333" stroke-width="0.5"><title>Id 9, Wert -53.7</title></circle>
|
||||||
|
<circle cx="540.0" cy="60.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 10, Wert -57.7</title></circle>
|
||||||
|
<circle cx="593.3" cy="60.0" r="5" fill="#3b804c" stroke="#333" stroke-width="0.5"><title>Id 11, Wert -63.3</title></circle>
|
||||||
|
<circle cx="646.7" cy="60.0" r="5" fill="#597046" stroke="#333" stroke-width="0.5"><title>Id 12, Wert -84.7</title></circle>
|
||||||
|
<circle cx="700.0" cy="60.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 13, Wert -57.7</title></circle>
|
||||||
|
<circle cx="753.3" cy="60.0" r="5" fill="#597046" stroke="#333" stroke-width="0.5"><title>Id 14, Wert -84.7</title></circle>
|
||||||
|
<circle cx="806.7" cy="60.0" r="5" fill="#3c804c" stroke="#333" stroke-width="0.5"><title>Id 15, Wert -64.0</title></circle>
|
||||||
|
<circle cx="860.0" cy="60.0" r="5" fill="#2e884e" stroke="#333" stroke-width="0.5"><title>Id 16, Wert -53.7</title></circle>
|
||||||
|
<circle cx="913.3" cy="60.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 17, Wert -54.7</title></circle>
|
||||||
|
<circle cx="966.7" cy="60.0" r="5" fill="#2a8a4f" stroke="#333" stroke-width="0.5"><title>Id 18, Wert -50.7</title></circle>
|
||||||
|
<circle cx="1020.0" cy="60.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 19, Wert -57.0</title></circle>
|
||||||
|
<circle cx="1073.3" cy="60.0" r="5" fill="#5f6c45" stroke="#333" stroke-width="0.5"><title>Id 20, Wert -89.3</title></circle>
|
||||||
|
<circle cx="1126.7" cy="60.0" r="5" fill="#2e884e" stroke="#333" stroke-width="0.5"><title>Id 21, Wert -53.7</title></circle>
|
||||||
|
<circle cx="1180.0" cy="60.0" r="5" fill="#537347" stroke="#333" stroke-width="0.5"><title>Id 22, Wert -80.7</title></circle>
|
||||||
|
<circle cx="1233.3" cy="60.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 23, Wert -57.7</title></circle>
|
||||||
|
<circle cx="1286.7" cy="60.0" r="5" fill="#36834d" stroke="#333" stroke-width="0.5"><title>Id 24, Wert -59.3</title></circle>
|
||||||
|
<circle cx="1340.0" cy="60.0" r="5" fill="#3b804c" stroke="#333" stroke-width="0.5"><title>Id 25, Wert -63.3</title></circle>
|
||||||
|
<circle cx="1393.3" cy="60.0" r="5" fill="#636a44" stroke="#333" stroke-width="0.5"><title>Id 26, Wert -92.7</title></circle>
|
||||||
|
<circle cx="1446.7" cy="60.0" r="5" fill="#38824c" stroke="#333" stroke-width="0.5"><title>Id 27, Wert -60.9</title></circle>
|
||||||
|
<circle cx="1500.0" cy="60.0" r="5" fill="#5d6e46" stroke="#333" stroke-width="0.5"><title>Id 28, Wert -87.7</title></circle>
|
||||||
|
<circle cx="1553.3" cy="60.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 29, Wert -54.7</title></circle>
|
||||||
|
<circle cx="1606.7" cy="60.0" r="5" fill="#32864e" stroke="#333" stroke-width="0.5"><title>Id 30, Wert -56.3</title></circle>
|
||||||
|
<circle cx="1660.0" cy="60.0" r="5" fill="#37834d" stroke="#333" stroke-width="0.5"><title>Id 31, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1713.3" cy="60.0" r="5" fill="#686743" stroke="#333" stroke-width="0.5"><title>Id 32, Wert -95.7</title></circle>
|
||||||
|
<circle cx="1766.7" cy="60.0" r="7" fill="#288c50" stroke="#c04040" stroke-width="2"><title>Id 33, Wert -48.7</title></circle>
|
||||||
|
<circle cx="1820.0" cy="60.0" r="5" fill="#35844d" stroke="#333" stroke-width="0.5"><title>Id 34, Wert -58.7</title></circle>
|
||||||
|
<circle cx="1873.3" cy="60.0" r="5" fill="#5a6f46" stroke="#333" stroke-width="0.5"><title>Id 35, Wert -85.9</title></circle>
|
||||||
|
<circle cx="1926.7" cy="60.0" r="5" fill="#37834d" stroke="#333" stroke-width="0.5"><title>Id 36, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1980.0" cy="60.0" r="5" fill="#447b4a" stroke="#333" stroke-width="0.5"><title>Id 37, Wert -69.7</title></circle>
|
||||||
|
<circle cx="2033.3" cy="60.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 38, Wert -123.6</title></circle>
|
||||||
|
<circle cx="2086.7" cy="60.0" r="5" fill="#89553d" stroke="#333" stroke-width="0.5"><title>Id 39, Wert -120.3</title></circle>
|
||||||
|
<circle cx="2140.0" cy="60.0" r="5" fill="#36834d" stroke="#333" stroke-width="0.5"><title>Id 40, Wert -59.3</title></circle>
|
||||||
|
<circle cx="60.0" cy="150.0" r="5" fill="#577147" stroke="#333" stroke-width="0.5"><title>Id 41, Wert -83.7</title></circle>
|
||||||
|
<circle cx="86.3" cy="150.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 42, Wert -54.7</title></circle>
|
||||||
|
<circle cx="112.7" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 43, Wert -52.0</title></circle>
|
||||||
|
<circle cx="139.0" cy="150.0" r="5" fill="#2d884e" stroke="#333" stroke-width="0.5"><title>Id 44, Wert -53.0</title></circle>
|
||||||
|
<circle cx="165.3" cy="150.0" r="5" fill="#39824c" stroke="#333" stroke-width="0.5"><title>Id 45, Wert -61.7</title></circle>
|
||||||
|
<circle cx="191.6" cy="150.0" r="5" fill="#427c4a" stroke="#333" stroke-width="0.5"><title>Id 46, Wert -68.3</title></circle>
|
||||||
|
<circle cx="218.0" cy="150.0" r="5" fill="#37834d" stroke="#333" stroke-width="0.5"><title>Id 47, Wert -60.0</title></circle>
|
||||||
|
<circle cx="244.3" cy="150.0" r="5" fill="#547247" stroke="#333" stroke-width="0.5"><title>Id 48, Wert -81.7</title></circle>
|
||||||
|
<circle cx="270.6" cy="150.0" r="5" fill="#36834d" stroke="#333" stroke-width="0.5"><title>Id 49, Wert -59.7</title></circle>
|
||||||
|
<circle cx="297.0" cy="150.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 50, Wert -57.7</title></circle>
|
||||||
|
<circle cx="323.3" cy="150.0" r="5" fill="#6e6442" stroke="#333" stroke-width="0.5"><title>Id 51, Wert -100.6</title></circle>
|
||||||
|
<circle cx="349.6" cy="150.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 52, Wert -54.7</title></circle>
|
||||||
|
<circle cx="375.9" cy="150.0" r="5" fill="#37834d" stroke="#333" stroke-width="0.5"><title>Id 53, Wert -60.0</title></circle>
|
||||||
|
<circle cx="402.3" cy="150.0" r="5" fill="#597046" stroke="#333" stroke-width="0.5"><title>Id 54, Wert -84.7</title></circle>
|
||||||
|
<circle cx="428.6" cy="150.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 55, Wert -57.0</title></circle>
|
||||||
|
<circle cx="454.9" cy="150.0" r="5" fill="#36834d" stroke="#333" stroke-width="0.5"><title>Id 56, Wert -59.7</title></circle>
|
||||||
|
<circle cx="481.3" cy="150.0" r="5" fill="#3b814c" stroke="#333" stroke-width="0.5"><title>Id 57, Wert -62.7</title></circle>
|
||||||
|
<circle cx="507.6" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 58, Wert -51.7</title></circle>
|
||||||
|
<circle cx="533.9" cy="150.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 59, Wert -55.0</title></circle>
|
||||||
|
<circle cx="560.3" cy="150.0" r="5" fill="#805a3f" stroke="#333" stroke-width="0.5"><title>Id 60, Wert -113.4</title></circle>
|
||||||
|
<circle cx="586.6" cy="150.0" r="5" fill="#597046" stroke="#333" stroke-width="0.5"><title>Id 61, Wert -85.0</title></circle>
|
||||||
|
<circle cx="612.9" cy="150.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 62, Wert -54.7</title></circle>
|
||||||
|
<circle cx="639.2" cy="150.0" r="5" fill="#5d6d45" stroke="#333" stroke-width="0.5"><title>Id 63, Wert -88.0</title></circle>
|
||||||
|
<circle cx="665.6" cy="150.0" r="5" fill="#5f6c45" stroke="#333" stroke-width="0.5"><title>Id 64, Wert -89.3</title></circle>
|
||||||
|
<circle cx="691.9" cy="150.0" r="5" fill="#676844" stroke="#333" stroke-width="0.5"><title>Id 65, Wert -94.9</title></circle>
|
||||||
|
<circle cx="718.2" cy="150.0" r="5" fill="#636a44" stroke="#333" stroke-width="0.5"><title>Id 66, Wert -92.6</title></circle>
|
||||||
|
<circle cx="744.6" cy="150.0" r="5" fill="#597046" stroke="#333" stroke-width="0.5"><title>Id 67, Wert -84.7</title></circle>
|
||||||
|
<circle cx="770.9" cy="150.0" r="5" fill="#597046" stroke="#333" stroke-width="0.5"><title>Id 68, Wert -84.7</title></circle>
|
||||||
|
<circle cx="797.2" cy="150.0" r="5" fill="#37834d" stroke="#333" stroke-width="0.5"><title>Id 69, Wert -60.0</title></circle>
|
||||||
|
<circle cx="823.5" cy="150.0" r="5" fill="#597046" stroke="#333" stroke-width="0.5"><title>Id 70, Wert -84.7</title></circle>
|
||||||
|
<circle cx="849.9" cy="150.0" r="5" fill="#3b804c" stroke="#333" stroke-width="0.5"><title>Id 71, Wert -63.3</title></circle>
|
||||||
|
<circle cx="876.2" cy="150.0" r="5" fill="#686743" stroke="#333" stroke-width="0.5"><title>Id 72, Wert -95.7</title></circle>
|
||||||
|
<circle cx="902.5" cy="150.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 73, Wert -55.0</title></circle>
|
||||||
|
<circle cx="928.9" cy="150.0" r="5" fill="#3b814c" stroke="#333" stroke-width="0.5"><title>Id 74, Wert -62.7</title></circle>
|
||||||
|
<circle cx="955.2" cy="150.0" r="5" fill="#3f7f4b" stroke="#333" stroke-width="0.5"><title>Id 75, Wert -65.6</title></circle>
|
||||||
|
<circle cx="981.5" cy="150.0" r="5" fill="#5e6d45" stroke="#333" stroke-width="0.5"><title>Id 76, Wert -89.0</title></circle>
|
||||||
|
<circle cx="1007.8" cy="150.0" r="5" fill="#8d523c" stroke="#333" stroke-width="0.5"><title>Id 77, Wert -123.3</title></circle>
|
||||||
|
<circle cx="1034.2" cy="150.0" r="5" fill="#6d6442" stroke="#333" stroke-width="0.5"><title>Id 78, Wert -99.6</title></circle>
|
||||||
|
<circle cx="1060.5" cy="150.0" r="5" fill="#4a7849" stroke="#333" stroke-width="0.5"><title>Id 79, Wert -74.3</title></circle>
|
||||||
|
<circle cx="1086.8" cy="150.0" r="5" fill="#32864e" stroke="#333" stroke-width="0.5"><title>Id 80, Wert -56.3</title></circle>
|
||||||
|
<circle cx="1113.2" cy="150.0" r="5" fill="#36844d" stroke="#333" stroke-width="0.5"><title>Id 81, Wert -59.0</title></circle>
|
||||||
|
<circle cx="1139.5" cy="150.0" r="5" fill="#36834d" stroke="#333" stroke-width="0.5"><title>Id 82, Wert -59.7</title></circle>
|
||||||
|
<circle cx="1165.8" cy="150.0" r="5" fill="#36844d" stroke="#333" stroke-width="0.5"><title>Id 83, Wert -59.0</title></circle>
|
||||||
|
<circle cx="1192.2" cy="150.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 84, Wert -54.7</title></circle>
|
||||||
|
<circle cx="1218.5" cy="150.0" r="5" fill="#9c4a3a" stroke="#333" stroke-width="0.5"><title>Id 85, Wert -134.0</title></circle>
|
||||||
|
<circle cx="1244.8" cy="150.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 86, Wert -54.7</title></circle>
|
||||||
|
<circle cx="1271.1" cy="150.0" r="5" fill="#37834d" stroke="#333" stroke-width="0.5"><title>Id 87, Wert -60.0</title></circle>
|
||||||
|
<circle cx="1297.5" cy="150.0" r="5" fill="#547247" stroke="#333" stroke-width="0.5"><title>Id 88, Wert -81.7</title></circle>
|
||||||
|
<circle cx="1323.8" cy="150.0" r="5" fill="#2e884e" stroke="#333" stroke-width="0.5"><title>Id 89, Wert -53.7</title></circle>
|
||||||
|
<circle cx="1350.1" cy="150.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 90, Wert -57.7</title></circle>
|
||||||
|
<circle cx="1376.5" cy="150.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 91, Wert -75.5</title></circle>
|
||||||
|
<circle cx="1402.8" cy="150.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 92, Wert -54.7</title></circle>
|
||||||
|
<circle cx="1429.1" cy="150.0" r="5" fill="#37834d" stroke="#333" stroke-width="0.5"><title>Id 93, Wert -60.0</title></circle>
|
||||||
|
<circle cx="1455.4" cy="150.0" r="5" fill="#37834d" stroke="#333" stroke-width="0.5"><title>Id 94, Wert -60.0</title></circle>
|
||||||
|
<circle cx="1481.8" cy="150.0" r="5" fill="#6a6643" stroke="#333" stroke-width="0.5"><title>Id 95, Wert -97.6</title></circle>
|
||||||
|
<circle cx="1508.1" cy="150.0" r="5" fill="#2e884e" stroke="#333" stroke-width="0.5"><title>Id 96, Wert -53.7</title></circle>
|
||||||
|
<circle cx="1534.4" cy="150.0" r="5" fill="#32864e" stroke="#333" stroke-width="0.5"><title>Id 97, Wert -56.3</title></circle>
|
||||||
|
<circle cx="1560.8" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 98, Wert -51.7</title></circle>
|
||||||
|
<circle cx="1587.1" cy="150.0" r="5" fill="#417d4b" stroke="#333" stroke-width="0.5"><title>Id 99, Wert -67.3</title></circle>
|
||||||
|
<circle cx="1613.4" cy="150.0" r="5" fill="#3e7f4b" stroke="#333" stroke-width="0.5"><title>Id 100, Wert -65.0</title></circle>
|
||||||
|
<circle cx="1639.7" cy="150.0" r="5" fill="#36844d" stroke="#333" stroke-width="0.5"><title>Id 101, Wert -59.0</title></circle>
|
||||||
|
<circle cx="1666.1" cy="150.0" r="5" fill="#31864e" stroke="#333" stroke-width="0.5"><title>Id 102, Wert -55.3</title></circle>
|
||||||
|
<circle cx="1692.4" cy="150.0" r="5" fill="#3b814c" stroke="#333" stroke-width="0.5"><title>Id 103, Wert -62.7</title></circle>
|
||||||
|
<circle cx="1718.7" cy="150.0" r="5" fill="#36844d" stroke="#333" stroke-width="0.5"><title>Id 104, Wert -59.0</title></circle>
|
||||||
|
<circle cx="1745.1" cy="150.0" r="5" fill="#31864e" stroke="#333" stroke-width="0.5"><title>Id 105, Wert -56.0</title></circle>
|
||||||
|
<circle cx="1771.4" cy="150.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 106, Wert -54.7</title></circle>
|
||||||
|
<circle cx="1797.7" cy="150.0" r="5" fill="#9c4a3a" stroke="#333" stroke-width="0.5"><title>Id 107, Wert -134.1</title></circle>
|
||||||
|
<circle cx="1824.1" cy="150.0" r="5" fill="#37834d" stroke="#333" stroke-width="0.5"><title>Id 108, Wert -60.0</title></circle>
|
||||||
|
<circle cx="1850.4" cy="150.0" r="5" fill="#37834d" stroke="#333" stroke-width="0.5"><title>Id 109, Wert -60.0</title></circle>
|
||||||
|
<circle cx="1876.7" cy="150.0" r="5" fill="#31864e" stroke="#333" stroke-width="0.5"><title>Id 110, Wert -56.0</title></circle>
|
||||||
|
<circle cx="1903.0" cy="150.0" r="5" fill="#437c4a" stroke="#333" stroke-width="0.5"><title>Id 111, Wert -68.9</title></circle>
|
||||||
|
<circle cx="1929.4" cy="150.0" r="5" fill="#477a4a" stroke="#333" stroke-width="0.5"><title>Id 112, Wert -72.0</title></circle>
|
||||||
|
<circle cx="1955.7" cy="150.0" r="7" fill="#288c50" stroke="#c04040" stroke-width="2"><title>Id 113, Wert -48.7</title></circle>
|
||||||
|
<circle cx="1982.0" cy="150.0" r="5" fill="#5f6c45" stroke="#333" stroke-width="0.5"><title>Id 114, Wert -89.7</title></circle>
|
||||||
|
<circle cx="2008.4" cy="150.0" r="5" fill="#9d4939" stroke="#333" stroke-width="0.5"><title>Id 115, Wert -135.3</title></circle>
|
||||||
|
<circle cx="2034.7" cy="150.0" r="5" fill="#c83232" stroke="#333" stroke-width="0.5"><title>Id 116, Wert -166.1</title></circle>
|
||||||
|
<circle cx="2061.0" cy="150.0" r="5" fill="#8d523c" stroke="#333" stroke-width="0.5"><title>Id 117, Wert -123.3</title></circle>
|
||||||
|
<circle cx="2087.3" cy="150.0" r="5" fill="#6a6643" stroke="#333" stroke-width="0.5"><title>Id 118, Wert -97.6</title></circle>
|
||||||
|
<circle cx="2113.7" cy="150.0" r="5" fill="#666944" stroke="#333" stroke-width="0.5"><title>Id 119, Wert -94.3</title></circle>
|
||||||
|
<circle cx="2140.0" cy="150.0" r="5" fill="#5e6d45" stroke="#333" stroke-width="0.5"><title>Id 120, Wert -88.3</title></circle>
|
||||||
|
<circle cx="60.0" cy="240.0" r="5" fill="#298a4f" stroke="#333" stroke-width="0.5"><title>Id 121, Wert -50.0</title></circle>
|
||||||
|
<circle cx="91.0" cy="240.0" r="5" fill="#298a4f" stroke="#333" stroke-width="0.5"><title>Id 122, Wert -50.0</title></circle>
|
||||||
|
<circle cx="122.1" cy="240.0" r="5" fill="#35844d" stroke="#333" stroke-width="0.5"><title>Id 123, Wert -58.7</title></circle>
|
||||||
|
<circle cx="153.1" cy="240.0" r="5" fill="#587046" stroke="#333" stroke-width="0.5"><title>Id 124, Wert -84.3</title></circle>
|
||||||
|
<circle cx="184.2" cy="240.0" r="5" fill="#35844d" stroke="#333" stroke-width="0.5"><title>Id 125, Wert -58.7</title></circle>
|
||||||
|
<circle cx="215.2" cy="240.0" r="5" fill="#36844d" stroke="#333" stroke-width="0.5"><title>Id 126, Wert -59.0</title></circle>
|
||||||
|
<circle cx="246.3" cy="240.0" r="5" fill="#2d884e" stroke="#333" stroke-width="0.5"><title>Id 127, Wert -53.0</title></circle>
|
||||||
|
<circle cx="277.3" cy="240.0" r="5" fill="#2e884e" stroke="#333" stroke-width="0.5"><title>Id 128, Wert -53.7</title></circle>
|
||||||
|
<circle cx="308.4" cy="240.0" r="5" fill="#567147" stroke="#333" stroke-width="0.5"><title>Id 129, Wert -83.0</title></circle>
|
||||||
|
<circle cx="339.4" cy="240.0" r="5" fill="#567147" stroke="#333" stroke-width="0.5"><title>Id 130, Wert -83.0</title></circle>
|
||||||
|
<circle cx="370.4" cy="240.0" r="5" fill="#2e884e" stroke="#333" stroke-width="0.5"><title>Id 131, Wert -53.7</title></circle>
|
||||||
|
<circle cx="401.5" cy="240.0" r="5" fill="#2e884e" stroke="#333" stroke-width="0.5"><title>Id 132, Wert -53.7</title></circle>
|
||||||
|
<circle cx="432.5" cy="240.0" r="5" fill="#597046" stroke="#333" stroke-width="0.5"><title>Id 133, Wert -85.0</title></circle>
|
||||||
|
<circle cx="463.6" cy="240.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 134, Wert -57.0</title></circle>
|
||||||
|
<circle cx="494.6" cy="240.0" r="5" fill="#31864e" stroke="#333" stroke-width="0.5"><title>Id 135, Wert -55.3</title></circle>
|
||||||
|
<circle cx="525.7" cy="240.0" r="5" fill="#597046" stroke="#333" stroke-width="0.5"><title>Id 136, Wert -84.7</title></circle>
|
||||||
|
<circle cx="556.7" cy="240.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 137, Wert -54.7</title></circle>
|
||||||
|
<circle cx="587.8" cy="240.0" r="5" fill="#527347" stroke="#333" stroke-width="0.5"><title>Id 138, Wert -80.0</title></circle>
|
||||||
|
<circle cx="618.8" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 139, Wert -52.0</title></circle>
|
||||||
|
<circle cx="649.9" cy="240.0" r="5" fill="#37834d" stroke="#333" stroke-width="0.5"><title>Id 140, Wert -60.0</title></circle>
|
||||||
|
<circle cx="680.9" cy="240.0" r="5" fill="#32864e" stroke="#333" stroke-width="0.5"><title>Id 141, Wert -56.3</title></circle>
|
||||||
|
<circle cx="711.9" cy="240.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 142, Wert -54.7</title></circle>
|
||||||
|
<circle cx="743.0" cy="240.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 143, Wert -55.0</title></circle>
|
||||||
|
<circle cx="774.0" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 144, Wert -48.7</title></circle>
|
||||||
|
<circle cx="805.1" cy="240.0" r="5" fill="#537347" stroke="#333" stroke-width="0.5"><title>Id 145, Wert -80.7</title></circle>
|
||||||
|
<circle cx="836.1" cy="240.0" r="5" fill="#31864e" stroke="#333" stroke-width="0.5"><title>Id 146, Wert -56.0</title></circle>
|
||||||
|
<circle cx="867.2" cy="240.0" r="5" fill="#2d884e" stroke="#333" stroke-width="0.5"><title>Id 147, Wert -53.0</title></circle>
|
||||||
|
<circle cx="898.2" cy="240.0" r="5" fill="#35844d" stroke="#333" stroke-width="0.5"><title>Id 148, Wert -58.3</title></circle>
|
||||||
|
<circle cx="929.3" cy="240.0" r="5" fill="#5e6d45" stroke="#333" stroke-width="0.5"><title>Id 149, Wert -88.3</title></circle>
|
||||||
|
<circle cx="960.3" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 150, Wert -51.7</title></circle>
|
||||||
|
<circle cx="991.3" cy="240.0" r="5" fill="#527347" stroke="#333" stroke-width="0.5"><title>Id 151, Wert -80.0</title></circle>
|
||||||
|
<circle cx="1022.4" cy="240.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 152, Wert -55.0</title></circle>
|
||||||
|
<circle cx="1053.4" cy="240.0" r="5" fill="#3e7f4b" stroke="#333" stroke-width="0.5"><title>Id 153, Wert -65.0</title></circle>
|
||||||
|
<circle cx="1084.5" cy="240.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 154, Wert -57.7</title></circle>
|
||||||
|
<circle cx="1115.5" cy="240.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 155, Wert -55.0</title></circle>
|
||||||
|
<circle cx="1146.6" cy="240.0" r="5" fill="#298a4f" stroke="#333" stroke-width="0.5"><title>Id 156, Wert -50.0</title></circle>
|
||||||
|
<circle cx="1177.6" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 157, Wert -51.7</title></circle>
|
||||||
|
<circle cx="1208.7" cy="240.0" r="5" fill="#587046" stroke="#333" stroke-width="0.5"><title>Id 158, Wert -84.3</title></circle>
|
||||||
|
<circle cx="1239.7" cy="240.0" r="5" fill="#2a8a4f" stroke="#333" stroke-width="0.5"><title>Id 159, Wert -50.7</title></circle>
|
||||||
|
<circle cx="1270.7" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 160, Wert -52.0</title></circle>
|
||||||
|
<circle cx="1301.8" cy="240.0" r="5" fill="#527347" stroke="#333" stroke-width="0.5"><title>Id 161, Wert -80.0</title></circle>
|
||||||
|
<circle cx="1332.8" cy="240.0" r="5" fill="#597046" stroke="#333" stroke-width="0.5"><title>Id 162, Wert -84.7</title></circle>
|
||||||
|
<circle cx="1363.9" cy="240.0" r="5" fill="#597046" stroke="#333" stroke-width="0.5"><title>Id 163, Wert -84.7</title></circle>
|
||||||
|
<circle cx="1394.9" cy="240.0" r="5" fill="#597046" stroke="#333" stroke-width="0.5"><title>Id 164, Wert -84.7</title></circle>
|
||||||
|
<circle cx="1426.0" cy="240.0" r="5" fill="#2e884e" stroke="#333" stroke-width="0.5"><title>Id 165, Wert -53.7</title></circle>
|
||||||
|
<circle cx="1457.0" cy="240.0" r="5" fill="#2e884e" stroke="#333" stroke-width="0.5"><title>Id 166, Wert -53.7</title></circle>
|
||||||
|
<circle cx="1488.1" cy="240.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 167, Wert -54.7</title></circle>
|
||||||
|
<circle cx="1519.1" cy="240.0" r="5" fill="#527347" stroke="#333" stroke-width="0.5"><title>Id 168, Wert -80.0</title></circle>
|
||||||
|
<circle cx="1550.1" cy="240.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 169, Wert -54.7</title></circle>
|
||||||
|
<circle cx="1581.2" cy="240.0" r="5" fill="#597046" stroke="#333" stroke-width="0.5"><title>Id 170, Wert -84.7</title></circle>
|
||||||
|
<circle cx="1612.2" cy="240.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 171, Wert -54.7</title></circle>
|
||||||
|
<circle cx="1643.3" cy="240.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 172, Wert -54.7</title></circle>
|
||||||
|
<circle cx="1674.3" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 173, Wert -51.7</title></circle>
|
||||||
|
<circle cx="1705.4" cy="240.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 174, Wert -54.7</title></circle>
|
||||||
|
<circle cx="1736.4" cy="240.0" r="5" fill="#36834d" stroke="#333" stroke-width="0.5"><title>Id 175, Wert -59.7</title></circle>
|
||||||
|
<circle cx="1767.5" cy="240.0" r="5" fill="#37834d" stroke="#333" stroke-width="0.5"><title>Id 176, Wert -60.0</title></circle>
|
||||||
|
<circle cx="1798.5" cy="240.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 177, Wert -55.0</title></circle>
|
||||||
|
<circle cx="1829.6" cy="240.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 178, Wert -55.0</title></circle>
|
||||||
|
<circle cx="1860.6" cy="240.0" r="5" fill="#31864e" stroke="#333" stroke-width="0.5"><title>Id 179, Wert -55.3</title></circle>
|
||||||
|
<circle cx="1891.6" cy="240.0" r="5" fill="#31864e" stroke="#333" stroke-width="0.5"><title>Id 180, Wert -56.0</title></circle>
|
||||||
|
<circle cx="1922.7" cy="240.0" r="5" fill="#2d884e" stroke="#333" stroke-width="0.5"><title>Id 181, Wert -53.0</title></circle>
|
||||||
|
<circle cx="1953.7" cy="240.0" r="5" fill="#5c6e46" stroke="#333" stroke-width="0.5"><title>Id 182, Wert -87.3</title></circle>
|
||||||
|
<circle cx="1984.8" cy="240.0" r="5" fill="#3b814c" stroke="#333" stroke-width="0.5"><title>Id 183, Wert -62.7</title></circle>
|
||||||
|
<circle cx="2015.8" cy="240.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 184, Wert -54.7</title></circle>
|
||||||
|
<circle cx="2046.9" cy="240.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 185, Wert -57.0</title></circle>
|
||||||
|
<circle cx="2077.9" cy="240.0" r="5" fill="#88553d" stroke="#333" stroke-width="0.5"><title>Id 186, Wert -119.7</title></circle>
|
||||||
|
<circle cx="2109.0" cy="240.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 187, Wert -57.7</title></circle>
|
||||||
|
<circle cx="2140.0" cy="240.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 188, Wert -57.7</title></circle>
|
||||||
|
<circle cx="60.0" cy="330.0" r="5" fill="#517448" stroke="#333" stroke-width="0.5"><title>Id 189, Wert -79.0</title></circle>
|
||||||
|
<circle cx="97.8" cy="330.0" r="7" fill="#288c50" stroke="#c04040" stroke-width="2"><title>Id 190, Wert -48.7</title></circle>
|
||||||
|
<circle cx="135.6" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 191, Wert -48.7</title></circle>
|
||||||
|
<circle cx="173.5" cy="330.0" r="5" fill="#517448" stroke="#333" stroke-width="0.5"><title>Id 192, Wert -79.0</title></circle>
|
||||||
|
<circle cx="211.3" cy="330.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 193, Wert -55.0</title></circle>
|
||||||
|
<circle cx="249.1" cy="330.0" r="5" fill="#298a4f" stroke="#333" stroke-width="0.5"><title>Id 194, Wert -50.0</title></circle>
|
||||||
|
<circle cx="286.9" cy="330.0" r="5" fill="#2a8a4f" stroke="#333" stroke-width="0.5"><title>Id 195, Wert -50.7</title></circle>
|
||||||
|
<circle cx="324.7" cy="330.0" r="5" fill="#2a8a4f" stroke="#333" stroke-width="0.5"><title>Id 196, Wert -50.7</title></circle>
|
||||||
|
<circle cx="362.5" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 197, Wert -51.7</title></circle>
|
||||||
|
<circle cx="400.4" cy="330.0" r="5" fill="#35844d" stroke="#333" stroke-width="0.5"><title>Id 198, Wert -58.7</title></circle>
|
||||||
|
<circle cx="438.2" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 199, Wert -52.0</title></circle>
|
||||||
|
<circle cx="476.0" cy="330.0" r="5" fill="#2a8a4f" stroke="#333" stroke-width="0.5"><title>Id 200, Wert -50.7</title></circle>
|
||||||
|
<circle cx="513.8" cy="330.0" r="5" fill="#587046" stroke="#333" stroke-width="0.5"><title>Id 201, Wert -84.3</title></circle>
|
||||||
|
<circle cx="551.6" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 202, Wert -52.0</title></circle>
|
||||||
|
<circle cx="589.5" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 203, Wert -52.0</title></circle>
|
||||||
|
<circle cx="627.3" cy="330.0" r="5" fill="#38824c" stroke="#333" stroke-width="0.5"><title>Id 204, Wert -60.7</title></circle>
|
||||||
|
<circle cx="665.1" cy="330.0" r="5" fill="#2d884e" stroke="#333" stroke-width="0.5"><title>Id 205, Wert -53.0</title></circle>
|
||||||
|
<circle cx="702.9" cy="330.0" r="5" fill="#527347" stroke="#333" stroke-width="0.5"><title>Id 206, Wert -80.0</title></circle>
|
||||||
|
<circle cx="740.7" cy="330.0" r="5" fill="#2d884e" stroke="#333" stroke-width="0.5"><title>Id 207, Wert -53.0</title></circle>
|
||||||
|
<circle cx="778.5" cy="330.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 208, Wert -57.0</title></circle>
|
||||||
|
<circle cx="816.4" cy="330.0" r="5" fill="#2e884e" stroke="#333" stroke-width="0.5"><title>Id 209, Wert -53.7</title></circle>
|
||||||
|
<circle cx="854.2" cy="330.0" r="5" fill="#2e884e" stroke="#333" stroke-width="0.5"><title>Id 210, Wert -53.7</title></circle>
|
||||||
|
<circle cx="892.0" cy="330.0" r="5" fill="#38824c" stroke="#333" stroke-width="0.5"><title>Id 211, Wert -60.7</title></circle>
|
||||||
|
<circle cx="929.8" cy="330.0" r="5" fill="#567147" stroke="#333" stroke-width="0.5"><title>Id 212, Wert -83.0</title></circle>
|
||||||
|
<circle cx="967.6" cy="330.0" r="5" fill="#2e884e" stroke="#333" stroke-width="0.5"><title>Id 213, Wert -53.7</title></circle>
|
||||||
|
<circle cx="1005.5" cy="330.0" r="5" fill="#567147" stroke="#333" stroke-width="0.5"><title>Id 214, Wert -83.0</title></circle>
|
||||||
|
<circle cx="1043.3" cy="330.0" r="5" fill="#36834d" stroke="#333" stroke-width="0.5"><title>Id 215, Wert -59.7</title></circle>
|
||||||
|
<circle cx="1081.1" cy="330.0" r="5" fill="#2e884e" stroke="#333" stroke-width="0.5"><title>Id 216, Wert -53.7</title></circle>
|
||||||
|
<circle cx="1118.9" cy="330.0" r="5" fill="#517448" stroke="#333" stroke-width="0.5"><title>Id 217, Wert -79.0</title></circle>
|
||||||
|
<circle cx="1156.7" cy="330.0" r="5" fill="#517448" stroke="#333" stroke-width="0.5"><title>Id 218, Wert -79.0</title></circle>
|
||||||
|
<circle cx="1194.5" cy="330.0" r="5" fill="#298a4f" stroke="#333" stroke-width="0.5"><title>Id 219, Wert -50.0</title></circle>
|
||||||
|
<circle cx="1232.4" cy="330.0" r="5" fill="#298a4f" stroke="#333" stroke-width="0.5"><title>Id 220, Wert -50.0</title></circle>
|
||||||
|
<circle cx="1270.2" cy="330.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 221, Wert -55.0</title></circle>
|
||||||
|
<circle cx="1308.0" cy="330.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 222, Wert -55.0</title></circle>
|
||||||
|
<circle cx="1345.8" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 223, Wert -51.7</title></circle>
|
||||||
|
<circle cx="1383.6" cy="330.0" r="5" fill="#587046" stroke="#333" stroke-width="0.5"><title>Id 224, Wert -84.3</title></circle>
|
||||||
|
<circle cx="1421.5" cy="330.0" r="5" fill="#597046" stroke="#333" stroke-width="0.5"><title>Id 225, Wert -84.7</title></circle>
|
||||||
|
<circle cx="1459.3" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 226, Wert -51.7</title></circle>
|
||||||
|
<circle cx="1497.1" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 227, Wert -52.0</title></circle>
|
||||||
|
<circle cx="1534.9" cy="330.0" r="5" fill="#35844d" stroke="#333" stroke-width="0.5"><title>Id 228, Wert -58.7</title></circle>
|
||||||
|
<circle cx="1572.7" cy="330.0" r="5" fill="#2a8a4f" stroke="#333" stroke-width="0.5"><title>Id 229, Wert -50.7</title></circle>
|
||||||
|
<circle cx="1610.5" cy="330.0" r="5" fill="#577147" stroke="#333" stroke-width="0.5"><title>Id 230, Wert -83.7</title></circle>
|
||||||
|
<circle cx="1648.4" cy="330.0" r="5" fill="#38824c" stroke="#333" stroke-width="0.5"><title>Id 231, Wert -60.7</title></circle>
|
||||||
|
<circle cx="1686.2" cy="330.0" r="5" fill="#36844d" stroke="#333" stroke-width="0.5"><title>Id 232, Wert -59.0</title></circle>
|
||||||
|
<circle cx="1724.0" cy="330.0" r="5" fill="#2d884e" stroke="#333" stroke-width="0.5"><title>Id 233, Wert -53.0</title></circle>
|
||||||
|
<circle cx="1761.8" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 234, Wert -48.7</title></circle>
|
||||||
|
<circle cx="1799.6" cy="330.0" r="5" fill="#31864e" stroke="#333" stroke-width="0.5"><title>Id 235, Wert -56.0</title></circle>
|
||||||
|
<circle cx="1837.5" cy="330.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 236, Wert -57.0</title></circle>
|
||||||
|
<circle cx="1875.3" cy="330.0" r="5" fill="#567147" stroke="#333" stroke-width="0.5"><title>Id 237, Wert -83.0</title></circle>
|
||||||
|
<circle cx="1913.1" cy="330.0" r="5" fill="#36834d" stroke="#333" stroke-width="0.5"><title>Id 238, Wert -59.7</title></circle>
|
||||||
|
<circle cx="1950.9" cy="330.0" r="5" fill="#2e884e" stroke="#333" stroke-width="0.5"><title>Id 239, Wert -53.7</title></circle>
|
||||||
|
<circle cx="1988.7" cy="330.0" r="5" fill="#567147" stroke="#333" stroke-width="0.5"><title>Id 240, Wert -83.0</title></circle>
|
||||||
|
<circle cx="2026.5" cy="330.0" r="5" fill="#36844d" stroke="#333" stroke-width="0.5"><title>Id 241, Wert -59.0</title></circle>
|
||||||
|
<circle cx="2064.4" cy="330.0" r="5" fill="#36834d" stroke="#333" stroke-width="0.5"><title>Id 242, Wert -59.7</title></circle>
|
||||||
|
<circle cx="2102.2" cy="330.0" r="5" fill="#36834d" stroke="#333" stroke-width="0.5"><title>Id 243, Wert -59.7</title></circle>
|
||||||
|
<circle cx="2140.0" cy="330.0" r="5" fill="#36834d" stroke="#333" stroke-width="0.5"><title>Id 244, Wert -59.7</title></circle>
|
||||||
|
<text x="97.8" y="352.0" text-anchor="middle" font-size="12" font-weight="bold" fill="#c04040">190</text>
|
||||||
|
<text x="48" y="64.0" text-anchor="end" font-size="11" fill="#666">Gen 0</text>
|
||||||
|
<text x="48" y="154.0" text-anchor="end" font-size="11" fill="#666">Gen 1</text>
|
||||||
|
<text x="48" y="244.0" text-anchor="end" font-size="11" fill="#666">Gen 2</text>
|
||||||
|
<text x="48" y="334.0" text-anchor="end" font-size="11" fill="#666">Gen 3</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 48 KiB |
@@ -0,0 +1,50 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="650" viewBox="0 0 900 650" font-family="sans-serif">
|
||||||
|
<rect width="100%" height="100%" fill="white"/>
|
||||||
|
<text x="450" y="30" text-anchor="middle" font-size="16" fill="#333">Entwicklung der Loesungsfindung</text>
|
||||||
|
<line x1="60" y1="60" x2="60" y2="390.0" stroke="#333" stroke-width="1.5"/>
|
||||||
|
<line x1="60" y1="390.0" x2="840" y2="390.0" stroke="#333" stroke-width="1.5"/>
|
||||||
|
<line x1="60" y1="390.0" x2="840" y2="390.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="394.0" text-anchor="end" font-size="11" fill="#666">-166</text>
|
||||||
|
<line x1="60" y1="324.0" x2="840" y2="324.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="328.0" text-anchor="end" font-size="11" fill="#666">-143</text>
|
||||||
|
<line x1="60" y1="258.0" x2="840" y2="258.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="262.0" text-anchor="end" font-size="11" fill="#666">-119</text>
|
||||||
|
<line x1="60" y1="192.0" x2="840" y2="192.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="196.0" text-anchor="end" font-size="11" fill="#666">-96</text>
|
||||||
|
<line x1="60" y1="126.0" x2="840" y2="126.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="130.0" text-anchor="end" font-size="11" fill="#666">-72</text>
|
||||||
|
<line x1="60" y1="60.0" x2="840" y2="60.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="64.0" text-anchor="end" font-size="11" fill="#666">-49</text>
|
||||||
|
<text x="18" y="225.0" text-anchor="middle" font-size="12" fill="#333" transform="rotate(-90 18 225.0)">Wertigkeit (hoeher = besser)</text>
|
||||||
|
<polyline points="60.0,60.0 146.7,60.0 233.3,60.0 320.0,60.0 406.7,60.0 493.3,60.0 580.0,60.0 666.7,60.0 753.3,60.0 840.0,60.0" fill="none" stroke="#2f6f4f" stroke-width="2"/>
|
||||||
|
<polyline points="60.0,117.6 146.7,130.2 233.3,126.0 320.0,75.9 406.7,100.7 493.3,92.4 580.0,69.1 666.7,94.1 753.3,85.7 840.0,64.3" fill="none" stroke="#c08a2d" stroke-width="2"/>
|
||||||
|
<polyline points="60.0,270.5 146.7,390.0 233.3,390.0 320.0,85.3 406.7,259.4 493.3,259.4 580.0,74.0 666.7,161.1 753.3,161.1 840.0,68.4" fill="none" stroke="#a03030" stroke-width="2"/>
|
||||||
|
<line x1="680" y1="70" x2="704" y2="70" stroke="#2f6f4f" stroke-width="2"/>
|
||||||
|
<text x="710" y="74" font-size="11" fill="#333">beste Loesung</text>
|
||||||
|
<line x1="680" y1="88" x2="704" y2="88" stroke="#c08a2d" stroke-width="2"/>
|
||||||
|
<text x="710" y="92" font-size="11" fill="#333">Durchschnitt</text>
|
||||||
|
<line x1="680" y1="106" x2="704" y2="106" stroke="#a03030" stroke-width="2"/>
|
||||||
|
<text x="710" y="110" font-size="11" fill="#333">schlechteste Loesung</text>
|
||||||
|
<text x="450" y="428.0" text-anchor="middle" font-size="13" fill="#333">Anzahl erzeugter Verteilungen im Pool</text>
|
||||||
|
<line x1="60" y1="440.0" x2="60" y2="590.0" stroke="#333" stroke-width="1.5"/>
|
||||||
|
<line x1="60" y1="590.0" x2="840" y2="590.0" stroke="#333" stroke-width="1.5"/>
|
||||||
|
<line x1="60" y1="590.0" x2="840" y2="590.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="594.0" text-anchor="end" font-size="11" fill="#666">0</text>
|
||||||
|
<line x1="60" y1="515.0" x2="840" y2="515.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="519.0" text-anchor="end" font-size="11" fill="#666">60</text>
|
||||||
|
<line x1="60" y1="440.0" x2="840" y2="440.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="444.0" text-anchor="end" font-size="11" fill="#666">120</text>
|
||||||
|
<polyline points="60.0,540.0 146.7,490.0 233.3,440.0 320.0,547.5 406.7,505.0 493.3,462.5 580.0,555.0 666.7,520.0 753.3,485.0 840.0,561.2" fill="none" stroke="#4060a0" stroke-width="2"/>
|
||||||
|
<text x="60.0" y="606.0" text-anchor="middle" font-size="10" fill="#999">e</text>
|
||||||
|
<text x="146.7" y="606.0" text-anchor="middle" font-size="10" fill="#999">m</text>
|
||||||
|
<text x="233.3" y="606.0" text-anchor="middle" font-size="10" fill="#999">j</text>
|
||||||
|
<text x="320.0" y="606.0" text-anchor="middle" font-size="10" fill="#999">s</text>
|
||||||
|
<text x="406.7" y="606.0" text-anchor="middle" font-size="10" fill="#999">m</text>
|
||||||
|
<text x="493.3" y="606.0" text-anchor="middle" font-size="10" fill="#999">j</text>
|
||||||
|
<text x="580.0" y="606.0" text-anchor="middle" font-size="10" fill="#999">s</text>
|
||||||
|
<text x="666.7" y="606.0" text-anchor="middle" font-size="10" fill="#999">m</text>
|
||||||
|
<text x="753.3" y="606.0" text-anchor="middle" font-size="10" fill="#999">j</text>
|
||||||
|
<text x="840.0" y="606.0" text-anchor="middle" font-size="10" fill="#999">s</text>
|
||||||
|
<text x="450" y="638" text-anchor="middle" font-size="12" fill="#333">Zyklus-Aktion (Zeit)</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.3 KiB |
@@ -0,0 +1,120 @@
|
|||||||
|
Aksoy, Rainer, = Hof 1, Tisch 1, Nummer 13
|
||||||
|
Aksoy, Renate, = Hof 1, Tisch 1, Nummer 10
|
||||||
|
Aydin, Horst, = Hof 1, Tisch 15, Nummer 4
|
||||||
|
Aydin, Ursula, = Hof 1, Tisch 15, Nummer 5
|
||||||
|
Barth, Hannelore, = Hof 1, Tisch 9, Nummer 3
|
||||||
|
Berger, Sergej, = Hof 1, Tisch 8, Nummer 3
|
||||||
|
Brandt, Andreas, = Hof 1, Tisch 14, Nummer 2
|
||||||
|
Brandt, Anja, = Hof 1, Tisch 14, Nummer 6
|
||||||
|
Brandt, Anton, = Hof 1, Tisch 16, Nummer 9
|
||||||
|
Brandt, Ben, = Hof 1, Tisch 17, Nummer 2
|
||||||
|
Brandt, Daniel, = Hof 1, Tisch 11, Nummer 8
|
||||||
|
Brandt, Felix, = Hof 1, Tisch 16, Nummer 7
|
||||||
|
Brandt, Frieda, = Hof 1, Tisch 16, Nummer 10
|
||||||
|
Brandt, Greta, = Hof 1, Tisch 16, Nummer 12
|
||||||
|
Brandt, Helga, = Hof 1, Tisch 1, Nummer 5
|
||||||
|
Brandt, Julia, = Hof 1, Tisch 1, Nummer 2
|
||||||
|
Brandt, Kathrin, = Hof 1, Tisch 11, Nummer 9
|
||||||
|
Brandt, Lena, = Hof 1, Tisch 14, Nummer 3
|
||||||
|
Brandt, Milan, = Hof 1, Tisch 14, Nummer 5
|
||||||
|
Brandt, Paul, = Hof 1, Tisch 17, Nummer 3
|
||||||
|
Brandt, Sofia, = Hof 1, Tisch 14, Nummer 7
|
||||||
|
Brandt, Theo, = Hof 1, Tisch 14, Nummer 4
|
||||||
|
Brandt, Werner, = Hof 1, Tisch 1, Nummer 4
|
||||||
|
Busch, Stefanie, = Hof 1, Tisch 8, Nummer 7
|
||||||
|
Demir, Elif, = Hof 1, Tisch 10, Nummer 2
|
||||||
|
Demir, Hannelore, = Hof 1, Tisch 13, Nummer 4
|
||||||
|
Demir, Ingrid, = Hof 1, Tisch 13, Nummer 2
|
||||||
|
Demir, Monika, = Hof 1, Tisch 13, Nummer 3
|
||||||
|
Dietrich, Jennifer, = Hof 1, Tisch 2, Nummer 5
|
||||||
|
Dietrich, Nicole, = Hof 1, Tisch 12, Nummer 7
|
||||||
|
Erdem, Erika, = Hof 1, Tisch 15, Nummer 7
|
||||||
|
Erdem, Gerhard, = Hof 1, Tisch 9, Nummer 5
|
||||||
|
Erdem, Rainer, = Hof 1, Tisch 9, Nummer 6
|
||||||
|
Esposito, Christian, = Hof 1, Tisch 12, Nummer 4
|
||||||
|
Esposito, Gisela, = Hof 1, Tisch 9, Nummer 7
|
||||||
|
Esposito, Julia, = Hof 1, Tisch 2, Nummer 4
|
||||||
|
Fischer, Heinz, = Hof 1, Tisch 3, Nummer 3
|
||||||
|
Fischer, Helga, = Hof 1, Tisch 3, Nummer 2
|
||||||
|
Fischer, Nicole, = Hof 1, Tisch 12, Nummer 2
|
||||||
|
Fischer, Sven, = Hof 1, Tisch 4, Nummer 9
|
||||||
|
Frank, Erika, = Hof 1, Tisch 9, Nummer 4
|
||||||
|
Frank, Nadine, = Hof 1, Tisch 11, Nummer 2
|
||||||
|
Frank, Timo, = Hof 1, Tisch 10, Nummer 6
|
||||||
|
Frank, Tobias, = Hof 1, Tisch 1, Nummer 9
|
||||||
|
Franke, Brigitte, = Hof 1, Tisch 9, Nummer 8
|
||||||
|
Hansen, Olga, = Hof 1, Tisch 11, Nummer 5
|
||||||
|
Hansen, Wolfgang, = Hof 1, Tisch 9, Nummer 2
|
||||||
|
Hoffmann, Lena, = Hof 1, Tisch 12, Nummer 5
|
||||||
|
Horn, Daniel, = Hof 1, Tisch 11, Nummer 6
|
||||||
|
Horn, Svenja, = Hof 1, Tisch 2, Nummer 7
|
||||||
|
Klein, Stefan, = Hof 1, Tisch 10, Nummer 5
|
||||||
|
Koch, Andreas, = Hof 1, Tisch 8, Nummer 8
|
||||||
|
Koch, Giovanna, = Hof 1, Tisch 2, Nummer 3
|
||||||
|
Kovac, Giovanna, = Hof 1, Tisch 8, Nummer 4
|
||||||
|
Kraus, Dennis, = Hof 1, Tisch 12, Nummer 8
|
||||||
|
Kraus, Matteo, = Hof 1, Tisch 16, Nummer 8
|
||||||
|
Kraus, Melanie, = Hof 1, Tisch 12, Nummer 9
|
||||||
|
Kuhn, Leni, = Hof 1, Tisch 16, Nummer 2
|
||||||
|
Kuhn, Sarah, = Hof 1, Tisch 14, Nummer 9
|
||||||
|
Kuhn, Stefan, = Hof 1, Tisch 2, Nummer 9
|
||||||
|
Kuhn, Timo, = Hof 1, Tisch 14, Nummer 8
|
||||||
|
Lange, Milan, = Hof 1, Tisch 11, Nummer 7
|
||||||
|
Meyer, Anton, = Hof 1, Tisch 17, Nummer 4
|
||||||
|
Meyer, Christian, = Hof 1, Tisch 2, Nummer 6
|
||||||
|
Meyer, Ida, = Hof 1, Tisch 17, Nummer 5
|
||||||
|
Meyer, Marco, = Hof 1, Tisch 5, Nummer 8
|
||||||
|
Meyer, Mila, = Hof 1, Tisch 16, Nummer 11
|
||||||
|
Meyer, Sandra, = Hof 1, Tisch 5, Nummer 9
|
||||||
|
Meyer, Wolfgang, = Hof 1, Tisch 9, Nummer 9
|
||||||
|
Musikverein, Gast, = Hof 1, Tisch 4, Nummer 2
|
||||||
|
Musikverein, Gast, = Hof 1, Tisch 4, Nummer 3
|
||||||
|
Musikverein, Gast, = Hof 1, Tisch 4, Nummer 4
|
||||||
|
Musikverein, Gast, = Hof 1, Tisch 4, Nummer 5
|
||||||
|
Musikverein, Gast, = Hof 1, Tisch 4, Nummer 6
|
||||||
|
Musikverein, Gast, = Hof 1, Tisch 4, Nummer 7
|
||||||
|
Musikverein, Gast, = Hof 1, Tisch 4, Nummer 8
|
||||||
|
Musikverein, Gast, = Hof 1, Tisch 5, Nummer 2
|
||||||
|
Musikverein, Gast, = Hof 1, Tisch 5, Nummer 3
|
||||||
|
Musikverein, Gast, = Hof 1, Tisch 5, Nummer 4
|
||||||
|
Musikverein, Gast, = Hof 1, Tisch 5, Nummer 5
|
||||||
|
Musikverein, Gast, = Hof 1, Tisch 5, Nummer 6
|
||||||
|
Musikverein, Gast, = Hof 1, Tisch 5, Nummer 7
|
||||||
|
Peters, Melanie, = Hof 1, Tisch 8, Nummer 9
|
||||||
|
Peters, Yusuf, = Hof 1, Tisch 8, Nummer 2
|
||||||
|
Polat, Matthias, = Hof 1, Tisch 12, Nummer 3
|
||||||
|
Roth, Stefanie, = Hof 1, Tisch 2, Nummer 8
|
||||||
|
Schmidt, Dennis, = Hof 1, Tisch 8, Nummer 5
|
||||||
|
Schmitt, Markus, = Hof 1, Tisch 11, Nummer 3
|
||||||
|
Schwarz, Elias, = Hof 1, Tisch 16, Nummer 6
|
||||||
|
Schwarz, Guenter, = Hof 1, Tisch 1, Nummer 12
|
||||||
|
Schwarz, Liam, = Hof 1, Tisch 16, Nummer 5
|
||||||
|
Schwarz, Sarah, = Hof 1, Tisch 15, Nummer 3
|
||||||
|
Schwarz, Yusuf, = Hof 1, Tisch 15, Nummer 2
|
||||||
|
Simon, Jennifer, = Hof 1, Tisch 10, Nummer 3
|
||||||
|
Simon, Patrick, = Hof 1, Tisch 8, Nummer 6
|
||||||
|
Simon, Stefanie, = Hof 1, Tisch 10, Nummer 8
|
||||||
|
Sommer, Daniel, = Hof 1, Tisch 1, Nummer 3
|
||||||
|
Sommer, Dennis, = Hof 1, Tisch 13, Nummer 7
|
||||||
|
Sommer, Dennis, = Hof 1, Tisch 15, Nummer 8
|
||||||
|
Sommer, Dieter, = Hof 1, Tisch 1, Nummer 6
|
||||||
|
Sommer, Emil, = Hof 1, Tisch 16, Nummer 3
|
||||||
|
Sommer, Ida, = Hof 1, Tisch 16, Nummer 4
|
||||||
|
Sommer, Jennifer, = Hof 1, Tisch 15, Nummer 9
|
||||||
|
Sommer, Lina, = Hof 1, Tisch 13, Nummer 9
|
||||||
|
Sommer, Max, = Hof 1, Tisch 16, Nummer 14
|
||||||
|
Sommer, Nicole, = Hof 1, Tisch 13, Nummer 8
|
||||||
|
Sommer, Renate, = Hof 1, Tisch 1, Nummer 7
|
||||||
|
Sommer, Theo, = Hof 1, Tisch 16, Nummer 13
|
||||||
|
Stein, Andreas, = Hof 1, Tisch 10, Nummer 4
|
||||||
|
Stein, Werner, = Hof 1, Tisch 1, Nummer 11
|
||||||
|
Tran, Heinz, = Hof 1, Tisch 15, Nummer 6
|
||||||
|
Vogel, Anton, = Hof 1, Tisch 17, Nummer 6
|
||||||
|
Vogel, Max, = Hof 1, Tisch 17, Nummer 7
|
||||||
|
Vogel, Sandra, = Hof 1, Tisch 13, Nummer 6
|
||||||
|
Vogel, Svenja, = Hof 1, Tisch 2, Nummer 2
|
||||||
|
Vogel, Yusuf, = Hof 1, Tisch 13, Nummer 5
|
||||||
|
Wagner, Daniel, = Hof 1, Tisch 10, Nummer 7
|
||||||
|
Wagner, Timo, = Hof 1, Tisch 12, Nummer 6
|
||||||
|
Winkler, Sarah, = Hof 1, Tisch 1, Nummer 8
|
||||||
|
Yilmaz, Olga, = Hof 1, Tisch 11, Nummer 4
|
||||||
|
@@ -0,0 +1,194 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="995.887" height="667.258" viewBox="0 0 995.887 667.258">
|
||||||
|
<rect width="100%" height="100%" fill="white"/>
|
||||||
|
<polyline points="239.695,263.249 374.577,76.1153" fill="none" stroke="#bfef45" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="419.271,254.956 589.915,255.537" fill="none" stroke="#fabed4" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<circle cx="87.1573" cy="415.786" r="56.4933" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<ellipse cx="87.1573" cy="415.786" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="87.1573" y="410.986" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">7</text>
|
||||||
|
<text x="87.1573" y="424.186" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">8 Pl.</text>
|
||||||
|
<circle cx="415.786" cy="415.786" r="56.4933" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<ellipse cx="415.786" cy="415.786" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="415.786" y="410.986" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">9</text>
|
||||||
|
<text x="415.786" y="424.186" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">8 Pl.</text>
|
||||||
|
<circle cx="744.415" cy="251.472" r="56.4933" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="12" data-gruppe="Onkel und Tante (Braut-Seite)" data-name="Horst Aydin" cx="744.415" cy="216.979" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Horst Aydin — Onkel und Tante (Braut-Seite)</title></circle>
|
||||||
|
<circle class="person" data-gid="12" data-gruppe="Onkel und Tante (Braut-Seite)" data-name="Ursula Aydin" cx="744.415" cy="285.965" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Ursula Aydin — Onkel und Tante (Braut-Seite)</title></circle>
|
||||||
|
<ellipse cx="744.415" cy="251.472" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="744.415" y="246.672" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">6</text>
|
||||||
|
<text x="744.415" y="259.872" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">8 Pl.</text>
|
||||||
|
<circle cx="908.73" cy="415.786" r="48.4" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Ben Brandt" cx="908.73" cy="389.386" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Ben Brandt — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Paul Brandt" cx="931.593" cy="402.586" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Paul Brandt — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Anton Meyer" cx="931.593" cy="428.986" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Anton Meyer — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Ida Meyer" cx="908.73" cy="442.186" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Ida Meyer — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Anton Vogel" cx="885.867" cy="428.986" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Anton Vogel — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Max Vogel" cx="885.867" cy="402.586" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Max Vogel — VIP / feste Platzierung</title></circle>
|
||||||
|
<ellipse cx="908.73" cy="415.786" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="908.73" y="410.986" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">17</text>
|
||||||
|
<text x="908.73" y="424.186" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">6 Pl.</text>
|
||||||
|
<circle cx="580.101" cy="415.786" r="56.4933" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="18" data-gruppe="Arbeitskolleginnen der Braut" data-name="Elif Demir" cx="580.101" cy="381.293" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Elif Demir — Arbeitskolleginnen der Braut</title></circle>
|
||||||
|
<circle class="person" data-gid="18" data-gruppe="Arbeitskolleginnen der Braut" data-name="Jennifer Simon" cx="607.069" cy="394.28" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Jennifer Simon — Arbeitskolleginnen der Braut</title></circle>
|
||||||
|
<circle class="person" data-gid="18" data-gruppe="Arbeitskolleginnen der Braut" data-name="Andreas Stein" cx="613.729" cy="423.462" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Andreas Stein — Arbeitskolleginnen der Braut</title></circle>
|
||||||
|
<circle class="person" data-gid="18" data-gruppe="Arbeitskolleginnen der Braut" data-name="Stefan Klein" cx="595.067" cy="446.864" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Stefan Klein — Arbeitskolleginnen der Braut</title></circle>
|
||||||
|
<circle class="person" data-gid="18" data-gruppe="Arbeitskolleginnen der Braut" data-name="Timo Frank" cx="565.135" cy="446.864" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Timo Frank — Arbeitskolleginnen der Braut</title></circle>
|
||||||
|
<circle class="person" data-gid="18" data-gruppe="Arbeitskolleginnen der Braut" data-name="Daniel Wagner" cx="546.472" cy="423.462" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Daniel Wagner — Arbeitskolleginnen der Braut</title></circle>
|
||||||
|
<circle class="person" data-gid="18" data-gruppe="Arbeitskolleginnen der Braut" data-name="Stefanie Simon" cx="553.133" cy="394.28" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Stefanie Simon — Arbeitskolleginnen der Braut</title></circle>
|
||||||
|
<ellipse cx="580.101" cy="415.786" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="580.101" y="410.986" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">10</text>
|
||||||
|
<text x="580.101" y="424.186" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">8 Pl.</text>
|
||||||
|
<circle cx="87.1573" cy="251.472" r="56.4933" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="11" data-gruppe="Familie Schwarz (Braeutigam-Seite, Geschwister Sarah): Liam (8 J.) am Kindertisch; Elias (8 J.) am Kindertisch" data-name="Yusuf Schwarz" cx="87.1573" cy="216.979" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Yusuf Schwarz — Familie Schwarz (Braeutigam-Seite, Geschwister Sarah): Liam (8 J.) am Kindertisch; Elias (8 J.) am Kindertisch</title></circle>
|
||||||
|
<circle class="person" data-gid="11" data-gruppe="Familie Schwarz (Braeutigam-Seite, Geschwister Sarah): Liam (8 J.) am Kindertisch; Elias (8 J.) am Kindertisch" data-name="Sarah Schwarz" cx="111.548" cy="227.081" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Sarah Schwarz — Familie Schwarz (Braeutigam-Seite, Geschwister Sarah): Liam (8 J.) am Kindertisch; Elias (8 J.) am Kindertisch</title></circle>
|
||||||
|
<circle class="person" data-gid="14" data-gruppe="Onkel und Tante (Braeutigam-Seite)" data-name="Heinz Fischer" cx="121.651" cy="251.472" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Heinz Fischer — Onkel und Tante (Braeutigam-Seite)</title></circle>
|
||||||
|
<circle class="person" data-gid="14" data-gruppe="Onkel und Tante (Braeutigam-Seite)" data-name="Helga Fischer" cx="111.548" cy="275.862" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Helga Fischer — Onkel und Tante (Braeutigam-Seite)</title></circle>
|
||||||
|
<circle class="person" data-gid="15" data-gruppe="Grosstante mit Begleitung" data-name="Heinz Tran" cx="87.1573" cy="285.965" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Heinz Tran — Grosstante mit Begleitung</title></circle>
|
||||||
|
<circle class="person" data-gid="15" data-gruppe="Grosstante mit Begleitung" data-name="Erika Erdem" cx="62.7669" cy="275.862" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Erika Erdem — Grosstante mit Begleitung</title></circle>
|
||||||
|
<circle class="person" data-gid="10" data-gruppe="Familie Sommer (Braeutigam-Seite, Geschwister Dennis): Emil (8 J.) am Kindertisch; Ida (8 J.) am Kindertisch" data-name="Dennis Sommer" cx="52.664" cy="251.472" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Dennis Sommer — Familie Sommer (Braeutigam-Seite, Geschwister Dennis): Emil (8 J.) am Kindertisch; Ida (8 J.) am Kindertisch</title></circle>
|
||||||
|
<circle class="person" data-gid="10" data-gruppe="Familie Sommer (Braeutigam-Seite, Geschwister Dennis): Emil (8 J.) am Kindertisch; Ida (8 J.) am Kindertisch" data-name="Jennifer Sommer" cx="62.7669" cy="227.081" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Jennifer Sommer — Familie Sommer (Braeutigam-Seite, Geschwister Dennis): Emil (8 J.) am Kindertisch; Ida (8 J.) am Kindertisch</title></circle>
|
||||||
|
<ellipse cx="87.1573" cy="251.472" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="87.1573" y="246.672" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">2</text>
|
||||||
|
<text x="87.1573" y="259.872" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">8 Pl.</text>
|
||||||
|
<circle cx="251.472" cy="251.472" r="56.4933" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="13" data-gruppe="Onkel und Tante mit Cousine (Braut-Seite)" data-name="Ingrid Demir" cx="251.472" cy="216.979" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Ingrid Demir — Onkel und Tante mit Cousine (Braut-Seite)</title></circle>
|
||||||
|
<circle class="person" data-gid="13" data-gruppe="Onkel und Tante mit Cousine (Braut-Seite)" data-name="Monika Demir" cx="275.862" cy="227.081" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Monika Demir — Onkel und Tante mit Cousine (Braut-Seite)</title></circle>
|
||||||
|
<circle class="person" data-gid="13" data-gruppe="Onkel und Tante mit Cousine (Braut-Seite)" data-name="Hannelore Demir" cx="285.965" cy="251.472" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Hannelore Demir — Onkel und Tante mit Cousine (Braut-Seite)</title></circle>
|
||||||
|
<circle class="person" data-gid="21" data-gruppe="Fussballverein des Braeutigams" data-name="Svenja Vogel" cx="275.862" cy="275.862" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Svenja Vogel — Fussballverein des Braeutigams</title></circle>
|
||||||
|
<circle class="person" data-gid="21" data-gruppe="Fussballverein des Braeutigams" data-name="Andreas Koch" cx="251.472" cy="285.965" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Andreas Koch — Fussballverein des Braeutigams</title></circle>
|
||||||
|
<circle class="person" data-gid="21" data-gruppe="Fussballverein des Braeutigams" data-name="Stefanie Busch" cx="227.081" cy="275.862" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Stefanie Busch — Fussballverein des Braeutigams</title></circle>
|
||||||
|
<circle class="person" data-gid="21" data-gruppe="Fussballverein des Braeutigams" data-name="Giovanna Koch" cx="216.979" cy="251.472" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Giovanna Koch — Fussballverein des Braeutigams</title></circle>
|
||||||
|
<circle class="person" data-gid="21" data-gruppe="Fussballverein des Braeutigams" data-name="Julia Esposito" cx="227.081" cy="227.081" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Julia Esposito — Fussballverein des Braeutigams</title></circle>
|
||||||
|
<ellipse cx="251.472" cy="251.472" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="251.472" y="246.672" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">3</text>
|
||||||
|
<text x="251.472" y="259.872" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">8 Pl.</text>
|
||||||
|
<circle cx="415.786" cy="251.472" r="56.4933" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="23" data-gruppe="Musikverein (anonyme Sammelbuchung, 13 Karten)" data-name="Gast Musikverein" cx="415.786" cy="216.979" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Gast Musikverein — Musikverein (anonyme Sammelbuchung, 13 Karten)</title></circle>
|
||||||
|
<circle class="person" data-gid="23" data-gruppe="Musikverein (anonyme Sammelbuchung, 13 Karten)" data-name="Gast Musikverein" cx="440.177" cy="227.081" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Gast Musikverein — Musikverein (anonyme Sammelbuchung, 13 Karten)</title></circle>
|
||||||
|
<circle class="person" data-gid="23" data-gruppe="Musikverein (anonyme Sammelbuchung, 13 Karten)" data-name="Gast Musikverein" cx="450.28" cy="251.472" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Gast Musikverein — Musikverein (anonyme Sammelbuchung, 13 Karten)</title></circle>
|
||||||
|
<circle class="person" data-gid="23" data-gruppe="Musikverein (anonyme Sammelbuchung, 13 Karten)" data-name="Gast Musikverein" cx="440.177" cy="275.862" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Gast Musikverein — Musikverein (anonyme Sammelbuchung, 13 Karten)</title></circle>
|
||||||
|
<circle class="person" data-gid="23" data-gruppe="Musikverein (anonyme Sammelbuchung, 13 Karten)" data-name="Gast Musikverein" cx="415.786" cy="285.965" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Gast Musikverein — Musikverein (anonyme Sammelbuchung, 13 Karten)</title></circle>
|
||||||
|
<circle class="person" data-gid="23" data-gruppe="Musikverein (anonyme Sammelbuchung, 13 Karten)" data-name="Gast Musikverein" cx="391.396" cy="275.862" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Gast Musikverein — Musikverein (anonyme Sammelbuchung, 13 Karten)</title></circle>
|
||||||
|
<circle class="person" data-gid="23" data-gruppe="Musikverein (anonyme Sammelbuchung, 13 Karten)" data-name="Gast Musikverein" cx="381.293" cy="251.472" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Gast Musikverein — Musikverein (anonyme Sammelbuchung, 13 Karten)</title></circle>
|
||||||
|
<circle class="person" data-gid="24" data-gruppe="alleinreisender Gast" data-name="Sven Fischer" cx="391.396" cy="227.081" r="12" fill="#469990" stroke="black" stroke-width="1"><title>Sven Fischer — alleinreisender Gast</title></circle>
|
||||||
|
<ellipse cx="415.786" cy="251.472" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="415.786" y="246.672" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">4</text>
|
||||||
|
<text x="415.786" y="259.872" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">8 Pl.</text>
|
||||||
|
<circle cx="580.101" cy="251.472" r="56.4933" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="23" data-gruppe="Musikverein (anonyme Sammelbuchung, 13 Karten)" data-name="Gast Musikverein" cx="580.101" cy="216.979" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Gast Musikverein — Musikverein (anonyme Sammelbuchung, 13 Karten)</title></circle>
|
||||||
|
<circle class="person" data-gid="23" data-gruppe="Musikverein (anonyme Sammelbuchung, 13 Karten)" data-name="Gast Musikverein" cx="604.491" cy="227.081" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Gast Musikverein — Musikverein (anonyme Sammelbuchung, 13 Karten)</title></circle>
|
||||||
|
<circle class="person" data-gid="23" data-gruppe="Musikverein (anonyme Sammelbuchung, 13 Karten)" data-name="Gast Musikverein" cx="614.594" cy="251.472" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Gast Musikverein — Musikverein (anonyme Sammelbuchung, 13 Karten)</title></circle>
|
||||||
|
<circle class="person" data-gid="23" data-gruppe="Musikverein (anonyme Sammelbuchung, 13 Karten)" data-name="Gast Musikverein" cx="604.491" cy="275.862" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Gast Musikverein — Musikverein (anonyme Sammelbuchung, 13 Karten)</title></circle>
|
||||||
|
<circle class="person" data-gid="23" data-gruppe="Musikverein (anonyme Sammelbuchung, 13 Karten)" data-name="Gast Musikverein" cx="580.101" cy="285.965" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Gast Musikverein — Musikverein (anonyme Sammelbuchung, 13 Karten)</title></circle>
|
||||||
|
<circle class="person" data-gid="23" data-gruppe="Musikverein (anonyme Sammelbuchung, 13 Karten)" data-name="Gast Musikverein" cx="555.711" cy="275.862" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Gast Musikverein — Musikverein (anonyme Sammelbuchung, 13 Karten)</title></circle>
|
||||||
|
<circle class="person" data-gid="3" data-gruppe="Familie Kraus (Braut-Seite, Geschwister Melanie): Matteo (9 J.) am Kindertisch" data-name="Dennis Kraus" cx="545.608" cy="251.472" r="12" fill="#dcbeff" stroke="black" stroke-width="1"><title>Dennis Kraus — Familie Kraus (Braut-Seite, Geschwister Melanie): Matteo (9 J.) am Kindertisch</title></circle>
|
||||||
|
<circle class="person" data-gid="3" data-gruppe="Familie Kraus (Braut-Seite, Geschwister Melanie): Matteo (9 J.) am Kindertisch" data-name="Melanie Kraus" cx="555.711" cy="227.081" r="12" fill="#dcbeff" stroke="black" stroke-width="1"><title>Melanie Kraus — Familie Kraus (Braut-Seite, Geschwister Melanie): Matteo (9 J.) am Kindertisch</title></circle>
|
||||||
|
<ellipse cx="580.101" cy="251.472" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="580.101" y="246.672" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">5</text>
|
||||||
|
<text x="580.101" y="259.872" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">8 Pl.</text>
|
||||||
|
<circle cx="251.472" cy="415.786" r="56.4933" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="17" data-gruppe="Kegelclub des Brautvaters" data-name="Wolfgang Hansen" cx="251.472" cy="381.293" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Wolfgang Hansen — Kegelclub des Brautvaters</title></circle>
|
||||||
|
<circle class="person" data-gid="17" data-gruppe="Kegelclub des Brautvaters" data-name="Hannelore Barth" cx="275.862" cy="391.396" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Hannelore Barth — Kegelclub des Brautvaters</title></circle>
|
||||||
|
<circle class="person" data-gid="17" data-gruppe="Kegelclub des Brautvaters" data-name="Erika Frank" cx="285.965" cy="415.786" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Erika Frank — Kegelclub des Brautvaters</title></circle>
|
||||||
|
<circle class="person" data-gid="17" data-gruppe="Kegelclub des Brautvaters" data-name="Gerhard Erdem" cx="275.862" cy="440.177" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Gerhard Erdem — Kegelclub des Brautvaters</title></circle>
|
||||||
|
<circle class="person" data-gid="17" data-gruppe="Kegelclub des Brautvaters" data-name="Rainer Erdem" cx="251.472" cy="450.28" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Rainer Erdem — Kegelclub des Brautvaters</title></circle>
|
||||||
|
<circle class="person" data-gid="17" data-gruppe="Kegelclub des Brautvaters" data-name="Gisela Esposito" cx="227.081" cy="440.177" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Gisela Esposito — Kegelclub des Brautvaters</title></circle>
|
||||||
|
<circle class="person" data-gid="17" data-gruppe="Kegelclub des Brautvaters" data-name="Brigitte Franke" cx="216.979" cy="415.786" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Brigitte Franke — Kegelclub des Brautvaters</title></circle>
|
||||||
|
<circle class="person" data-gid="17" data-gruppe="Kegelclub des Brautvaters" data-name="Wolfgang Meyer" cx="227.081" cy="391.396" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Wolfgang Meyer — Kegelclub des Brautvaters</title></circle>
|
||||||
|
<ellipse cx="251.472" cy="415.786" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="251.472" y="410.986" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">8</text>
|
||||||
|
<text x="251.472" y="424.186" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">8 Pl.</text>
|
||||||
|
<circle cx="744.415" cy="415.786" r="56.4933" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="19" data-gruppe="Arbeitskollegen des Braeutigams" data-name="Nadine Frank" cx="744.415" cy="381.293" r="12" fill="#800000" stroke="black" stroke-width="1"><title>Nadine Frank — Arbeitskollegen des Braeutigams</title></circle>
|
||||||
|
<circle class="person" data-gid="19" data-gruppe="Arbeitskollegen des Braeutigams" data-name="Markus Schmitt" cx="768.806" cy="391.396" r="12" fill="#800000" stroke="black" stroke-width="1"><title>Markus Schmitt — Arbeitskollegen des Braeutigams</title></circle>
|
||||||
|
<circle class="person" data-gid="19" data-gruppe="Arbeitskollegen des Braeutigams" data-name="Olga Yilmaz" cx="778.909" cy="415.786" r="12" fill="#800000" stroke="black" stroke-width="1"><title>Olga Yilmaz — Arbeitskollegen des Braeutigams</title></circle>
|
||||||
|
<circle class="person" data-gid="19" data-gruppe="Arbeitskollegen des Braeutigams" data-name="Olga Hansen" cx="768.806" cy="440.177" r="12" fill="#800000" stroke="black" stroke-width="1"><title>Olga Hansen — Arbeitskollegen des Braeutigams</title></circle>
|
||||||
|
<circle class="person" data-gid="19" data-gruppe="Arbeitskollegen des Braeutigams" data-name="Daniel Horn" cx="744.415" cy="450.28" r="12" fill="#800000" stroke="black" stroke-width="1"><title>Daniel Horn — Arbeitskollegen des Braeutigams</title></circle>
|
||||||
|
<circle class="person" data-gid="19" data-gruppe="Arbeitskollegen des Braeutigams" data-name="Milan Lange" cx="720.025" cy="440.177" r="12" fill="#800000" stroke="black" stroke-width="1"><title>Milan Lange — Arbeitskollegen des Braeutigams</title></circle>
|
||||||
|
<circle class="person" data-gid="1" data-gruppe="Familie Peters (Braut-Seite, Geschwister Melanie)" data-name="Yusuf Peters" cx="709.922" cy="415.786" r="12" fill="#aaffc3" stroke="black" stroke-width="1"><title>Yusuf Peters — Familie Peters (Braut-Seite, Geschwister Melanie)</title></circle>
|
||||||
|
<circle class="person" data-gid="1" data-gruppe="Familie Peters (Braut-Seite, Geschwister Melanie)" data-name="Melanie Peters" cx="720.025" cy="391.396" r="12" fill="#aaffc3" stroke="black" stroke-width="1"><title>Melanie Peters — Familie Peters (Braut-Seite, Geschwister Melanie)</title></circle>
|
||||||
|
<ellipse cx="744.415" cy="415.786" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="744.415" y="410.986" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">11</text>
|
||||||
|
<text x="744.415" y="424.186" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">8 Pl.</text>
|
||||||
|
<circle cx="87.1573" cy="580.101" r="56.4933" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="16" data-gruppe="Studienfreunde der Braut" data-name="Nicole Fischer" cx="87.1573" cy="545.608" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Nicole Fischer — Studienfreunde der Braut</title></circle>
|
||||||
|
<circle class="person" data-gid="16" data-gruppe="Studienfreunde der Braut" data-name="Matthias Polat" cx="111.548" cy="555.711" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Matthias Polat — Studienfreunde der Braut</title></circle>
|
||||||
|
<circle class="person" data-gid="16" data-gruppe="Studienfreunde der Braut" data-name="Christian Esposito" cx="121.651" cy="580.101" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Christian Esposito — Studienfreunde der Braut</title></circle>
|
||||||
|
<circle class="person" data-gid="16" data-gruppe="Studienfreunde der Braut" data-name="Lena Hoffmann" cx="111.548" cy="604.491" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Lena Hoffmann — Studienfreunde der Braut</title></circle>
|
||||||
|
<circle class="person" data-gid="16" data-gruppe="Studienfreunde der Braut" data-name="Timo Wagner" cx="87.1573" cy="614.594" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Timo Wagner — Studienfreunde der Braut</title></circle>
|
||||||
|
<circle class="person" data-gid="16" data-gruppe="Studienfreunde der Braut" data-name="Nicole Dietrich" cx="62.7669" cy="604.491" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Nicole Dietrich — Studienfreunde der Braut</title></circle>
|
||||||
|
<circle class="person" data-gid="2" data-gruppe="Familie Brandt (Braut-Seite, Geschwister Daniel): Felix (12 J.) am Kindertisch; Ben (13 J.) am Teenager-Tisch" data-name="Daniel Brandt" cx="52.664" cy="580.101" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Daniel Brandt — Familie Brandt (Braut-Seite, Geschwister Daniel): Felix (12 J.) am Kindertisch; Ben (13 J.) am Teenager-Tisch</title></circle>
|
||||||
|
<circle class="person" data-gid="2" data-gruppe="Familie Brandt (Braut-Seite, Geschwister Daniel): Felix (12 J.) am Kindertisch; Ben (13 J.) am Teenager-Tisch" data-name="Kathrin Brandt" cx="62.7669" cy="555.711" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Kathrin Brandt — Familie Brandt (Braut-Seite, Geschwister Daniel): Felix (12 J.) am Kindertisch; Ben (13 J.) am Teenager-Tisch</title></circle>
|
||||||
|
<ellipse cx="87.1573" cy="580.101" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="87.1573" y="575.301" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">12</text>
|
||||||
|
<text x="87.1573" y="588.501" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">8 Pl.</text>
|
||||||
|
<circle cx="251.472" cy="580.101" r="56.4933" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="22" data-gruppe="Freundinnen aus der Schulzeit" data-name="Jennifer Dietrich" cx="251.472" cy="545.608" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Jennifer Dietrich — Freundinnen aus der Schulzeit</title></circle>
|
||||||
|
<circle class="person" data-gid="22" data-gruppe="Freundinnen aus der Schulzeit" data-name="Christian Meyer" cx="275.862" cy="555.711" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Christian Meyer — Freundinnen aus der Schulzeit</title></circle>
|
||||||
|
<circle class="person" data-gid="22" data-gruppe="Freundinnen aus der Schulzeit" data-name="Svenja Horn" cx="285.965" cy="580.101" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Svenja Horn — Freundinnen aus der Schulzeit</title></circle>
|
||||||
|
<circle class="person" data-gid="22" data-gruppe="Freundinnen aus der Schulzeit" data-name="Stefanie Roth" cx="275.862" cy="604.491" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Stefanie Roth — Freundinnen aus der Schulzeit</title></circle>
|
||||||
|
<circle class="person" data-gid="22" data-gruppe="Freundinnen aus der Schulzeit" data-name="Stefan Kuhn" cx="251.472" cy="614.594" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Stefan Kuhn — Freundinnen aus der Schulzeit</title></circle>
|
||||||
|
<circle class="person" data-gid="8" data-gruppe="Familie Sommer (Braeutigam-Seite, Geschwister Dennis): Lina (3 J.) sitzt bei den Eltern; Theo (8 J.) am Kindertisch; Max (12 J.) am Kindertisch" data-name="Dennis Sommer" cx="227.081" cy="604.491" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Dennis Sommer — Familie Sommer (Braeutigam-Seite, Geschwister Dennis): Lina (3 J.) sitzt bei den Eltern; Theo (8 J.) am Kindertisch; Max (12 J.) am Kindertisch</title></circle>
|
||||||
|
<circle class="person" data-gid="8" data-gruppe="Familie Sommer (Braeutigam-Seite, Geschwister Dennis): Lina (3 J.) sitzt bei den Eltern; Theo (8 J.) am Kindertisch; Max (12 J.) am Kindertisch" data-name="Nicole Sommer" cx="216.979" cy="580.101" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Nicole Sommer — Familie Sommer (Braeutigam-Seite, Geschwister Dennis): Lina (3 J.) sitzt bei den Eltern; Theo (8 J.) am Kindertisch; Max (12 J.) am Kindertisch</title></circle>
|
||||||
|
<circle class="person" data-gid="8" data-gruppe="Familie Sommer (Braeutigam-Seite, Geschwister Dennis): Lina (3 J.) sitzt bei den Eltern; Theo (8 J.) am Kindertisch; Max (12 J.) am Kindertisch" data-name="Lina Sommer" cx="227.081" cy="555.711" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Lina Sommer — Familie Sommer (Braeutigam-Seite, Geschwister Dennis): Lina (3 J.) sitzt bei den Eltern; Theo (8 J.) am Kindertisch; Max (12 J.) am Kindertisch</title></circle>
|
||||||
|
<ellipse cx="251.472" cy="580.101" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="251.472" y="575.301" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">13</text>
|
||||||
|
<text x="251.472" y="588.501" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">8 Pl.</text>
|
||||||
|
<circle cx="415.786" cy="580.101" r="56.4933" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="20" data-gruppe="Nachbarn der Brauteltern" data-name="Guenter Schwarz" cx="415.786" cy="545.608" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Guenter Schwarz — Nachbarn der Brauteltern</title></circle>
|
||||||
|
<circle class="person" data-gid="20" data-gruppe="Nachbarn der Brauteltern" data-name="Rainer Aksoy" cx="440.177" cy="555.711" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Rainer Aksoy — Nachbarn der Brauteltern</title></circle>
|
||||||
|
<circle class="person" data-gid="20" data-gruppe="Nachbarn der Brauteltern" data-name="Renate Aksoy" cx="450.28" cy="580.101" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Renate Aksoy — Nachbarn der Brauteltern</title></circle>
|
||||||
|
<circle class="person" data-gid="20" data-gruppe="Nachbarn der Brauteltern" data-name="Werner Stein" cx="440.177" cy="604.491" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Werner Stein — Nachbarn der Brauteltern</title></circle>
|
||||||
|
<circle class="person" data-gid="5" data-gruppe="Familie Meyer (Braut-Seite, Geschwister Sandra): Mila (10 J.) am Kindertisch; Anton (16 J.) am Teenager-Tisch; Ida (16 J.) am Teenager-Tisch" data-name="Marco Meyer" cx="415.786" cy="614.594" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Marco Meyer — Familie Meyer (Braut-Seite, Geschwister Sandra): Mila (10 J.) am Kindertisch; Anton (16 J.) am Teenager-Tisch; Ida (16 J.) am Teenager-Tisch</title></circle>
|
||||||
|
<circle class="person" data-gid="5" data-gruppe="Familie Meyer (Braut-Seite, Geschwister Sandra): Mila (10 J.) am Kindertisch; Anton (16 J.) am Teenager-Tisch; Ida (16 J.) am Teenager-Tisch" data-name="Sandra Meyer" cx="391.396" cy="604.491" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Sandra Meyer — Familie Meyer (Braut-Seite, Geschwister Sandra): Mila (10 J.) am Kindertisch; Anton (16 J.) am Teenager-Tisch; Ida (16 J.) am Teenager-Tisch</title></circle>
|
||||||
|
<circle class="person" data-gid="7" data-gruppe="Familie Vogel (Braut-Seite, Geschwister Sandra): Anton (14 J.) am Teenager-Tisch; Max (15 J.) am Teenager-Tisch" data-name="Yusuf Vogel" cx="381.293" cy="580.101" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Yusuf Vogel — Familie Vogel (Braut-Seite, Geschwister Sandra): Anton (14 J.) am Teenager-Tisch; Max (15 J.) am Teenager-Tisch</title></circle>
|
||||||
|
<circle class="person" data-gid="7" data-gruppe="Familie Vogel (Braut-Seite, Geschwister Sandra): Anton (14 J.) am Teenager-Tisch; Max (15 J.) am Teenager-Tisch" data-name="Sandra Vogel" cx="391.396" cy="555.711" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Sandra Vogel — Familie Vogel (Braut-Seite, Geschwister Sandra): Anton (14 J.) am Teenager-Tisch; Max (15 J.) am Teenager-Tisch</title></circle>
|
||||||
|
<ellipse cx="415.786" cy="580.101" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="415.786" y="575.301" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">14</text>
|
||||||
|
<text x="415.786" y="588.501" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">8 Pl.</text>
|
||||||
|
<circle cx="580.101" cy="580.101" r="56.4933" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="4" data-gruppe="Familie Brandt (Braut-Seite, Geschwister Andreas): Theo (3 J.) sitzt bei den Eltern; Anton (10 J.) am Kindertisch; Frieda (12 J.) am Kindertisch; Paul (19 J.) am Teenager-Tisch" data-name="Andreas Brandt" cx="580.101" cy="545.608" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Andreas Brandt — Familie Brandt (Braut-Seite, Geschwister Andreas): Theo (3 J.) sitzt bei den Eltern; Anton (10 J.) am Kindertisch; Frieda (12 J.) am Kindertisch; Paul (19 J.) am Teenager-Tisch</title></circle>
|
||||||
|
<circle class="person" data-gid="4" data-gruppe="Familie Brandt (Braut-Seite, Geschwister Andreas): Theo (3 J.) sitzt bei den Eltern; Anton (10 J.) am Kindertisch; Frieda (12 J.) am Kindertisch; Paul (19 J.) am Teenager-Tisch" data-name="Lena Brandt" cx="604.491" cy="555.711" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Lena Brandt — Familie Brandt (Braut-Seite, Geschwister Andreas): Theo (3 J.) sitzt bei den Eltern; Anton (10 J.) am Kindertisch; Frieda (12 J.) am Kindertisch; Paul (19 J.) am Teenager-Tisch</title></circle>
|
||||||
|
<circle class="person" data-gid="4" data-gruppe="Familie Brandt (Braut-Seite, Geschwister Andreas): Theo (3 J.) sitzt bei den Eltern; Anton (10 J.) am Kindertisch; Frieda (12 J.) am Kindertisch; Paul (19 J.) am Teenager-Tisch" data-name="Theo Brandt" cx="614.594" cy="580.101" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Theo Brandt — Familie Brandt (Braut-Seite, Geschwister Andreas): Theo (3 J.) sitzt bei den Eltern; Anton (10 J.) am Kindertisch; Frieda (12 J.) am Kindertisch; Paul (19 J.) am Teenager-Tisch</title></circle>
|
||||||
|
<circle class="person" data-gid="6" data-gruppe="Familie Brandt (Braut-Seite, Geschwister Milan): Sofia (2 J.) sitzt bei den Eltern; Greta (7 J.) am Kindertisch" data-name="Milan Brandt" cx="604.491" cy="604.491" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Milan Brandt — Familie Brandt (Braut-Seite, Geschwister Milan): Sofia (2 J.) sitzt bei den Eltern; Greta (7 J.) am Kindertisch</title></circle>
|
||||||
|
<circle class="person" data-gid="6" data-gruppe="Familie Brandt (Braut-Seite, Geschwister Milan): Sofia (2 J.) sitzt bei den Eltern; Greta (7 J.) am Kindertisch" data-name="Anja Brandt" cx="580.101" cy="614.594" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Anja Brandt — Familie Brandt (Braut-Seite, Geschwister Milan): Sofia (2 J.) sitzt bei den Eltern; Greta (7 J.) am Kindertisch</title></circle>
|
||||||
|
<circle class="person" data-gid="6" data-gruppe="Familie Brandt (Braut-Seite, Geschwister Milan): Sofia (2 J.) sitzt bei den Eltern; Greta (7 J.) am Kindertisch" data-name="Sofia Brandt" cx="555.711" cy="604.491" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Sofia Brandt — Familie Brandt (Braut-Seite, Geschwister Milan): Sofia (2 J.) sitzt bei den Eltern; Greta (7 J.) am Kindertisch</title></circle>
|
||||||
|
<circle class="person" data-gid="9" data-gruppe="Familie Kuhn (Braeutigam-Seite, Geschwister Sarah): Leni (10 J.) am Kindertisch" data-name="Timo Kuhn" cx="545.608" cy="580.101" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Timo Kuhn — Familie Kuhn (Braeutigam-Seite, Geschwister Sarah): Leni (10 J.) am Kindertisch</title></circle>
|
||||||
|
<circle class="person" data-gid="9" data-gruppe="Familie Kuhn (Braeutigam-Seite, Geschwister Sarah): Leni (10 J.) am Kindertisch" data-name="Sarah Kuhn" cx="555.711" cy="555.711" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Sarah Kuhn — Familie Kuhn (Braeutigam-Seite, Geschwister Sarah): Leni (10 J.) am Kindertisch</title></circle>
|
||||||
|
<ellipse cx="580.101" cy="580.101" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="580.101" y="575.301" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">15</text>
|
||||||
|
<text x="580.101" y="588.501" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">8 Pl.</text>
|
||||||
|
<circle cx="415.786" cy="87.1573" r="73.0009" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Julia Brandt" cx="415.786" cy="36.1564" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Julia Brandt — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Daniel Sommer" cx="441.287" cy="42.9892" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Daniel Sommer — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Werner Brandt" cx="459.954" cy="61.6568" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Werner Brandt — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Helga Brandt" cx="466.787" cy="87.1573" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Helga Brandt — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Dieter Sommer" cx="459.954" cy="112.658" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Dieter Sommer — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Renate Sommer" cx="441.287" cy="131.325" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Renate Sommer — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Sarah Winkler" cx="415.786" cy="138.158" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Sarah Winkler — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Tobias Frank" cx="390.286" cy="131.325" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Tobias Frank — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="21" data-gruppe="Fussballverein des Braeutigams" data-name="Giovanna Kovac" cx="371.618" cy="112.658" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Giovanna Kovac — Fussballverein des Braeutigams</title></circle>
|
||||||
|
<circle class="person" data-gid="21" data-gruppe="Fussballverein des Braeutigams" data-name="Sergej Berger" cx="364.785" cy="87.1573" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Sergej Berger — Fussballverein des Braeutigams</title></circle>
|
||||||
|
<circle class="person" data-gid="21" data-gruppe="Fussballverein des Braeutigams" data-name="Dennis Schmidt" cx="371.618" cy="61.6568" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Dennis Schmidt — Fussballverein des Braeutigams</title></circle>
|
||||||
|
<circle class="person" data-gid="21" data-gruppe="Fussballverein des Braeutigams" data-name="Patrick Simon" cx="390.286" cy="42.9892" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Patrick Simon — Fussballverein des Braeutigams</title></circle>
|
||||||
|
<ellipse cx="415.786" cy="87.1573" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="415.786" y="82.3573" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">1</text>
|
||||||
|
<text x="415.786" y="95.5573" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">12 Pl.</text>
|
||||||
|
<circle cx="908.73" cy="251.472" r="77.1573" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Leni Kuhn" cx="908.73" cy="196.315" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Leni Kuhn — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Emil Sommer" cx="934.363" cy="202.632" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Emil Sommer — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Ida Sommer" cx="954.124" cy="220.139" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Ida Sommer — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Liam Schwarz" cx="963.485" cy="244.823" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Liam Schwarz — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Elias Schwarz" cx="960.303" cy="271.031" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Elias Schwarz — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Felix Brandt" cx="945.306" cy="292.758" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Felix Brandt — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Matteo Kraus" cx="921.93" cy="305.026" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Matteo Kraus — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Anton Brandt" cx="895.53" cy="305.026" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Anton Brandt — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Frieda Brandt" cx="872.154" cy="292.758" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Frieda Brandt — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Mila Meyer" cx="857.157" cy="271.031" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Mila Meyer — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Greta Brandt" cx="853.975" cy="244.823" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Greta Brandt — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Theo Sommer" cx="863.336" cy="220.139" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Theo Sommer — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Max Sommer" cx="883.097" cy="202.632" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Max Sommer — VIP / feste Platzierung</title></circle>
|
||||||
|
<ellipse cx="908.73" cy="251.472" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="908.73" y="246.672" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">16</text>
|
||||||
|
<text x="908.73" y="259.872" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">13 Pl.</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 42 KiB |
@@ -0,0 +1,154 @@
|
|||||||
|
[1]
|
||||||
|
Julia Brandt = Hof 1, Tisch 1, Nummer 1
|
||||||
|
Daniel Sommer = Hof 1, Tisch 1, Nummer 2
|
||||||
|
Werner Brandt = Hof 1, Tisch 1, Nummer 3
|
||||||
|
Helga Brandt = Hof 1, Tisch 1, Nummer 4
|
||||||
|
Dieter Sommer = Hof 1, Tisch 1, Nummer 5
|
||||||
|
Renate Sommer = Hof 1, Tisch 1, Nummer 6
|
||||||
|
Sarah Winkler = Hof 1, Tisch 1, Nummer 7
|
||||||
|
Tobias Frank = Hof 1, Tisch 1, Nummer 8
|
||||||
|
Renate Aksoy = Hof 1, Tisch 1, Nummer 9
|
||||||
|
Werner Stein = Hof 1, Tisch 1, Nummer 10
|
||||||
|
Guenter Schwarz = Hof 1, Tisch 1, Nummer 11
|
||||||
|
Rainer Aksoy = Hof 1, Tisch 1, Nummer 12
|
||||||
|
|
||||||
|
[2]
|
||||||
|
Svenja Vogel = Hof 1, Tisch 2, Nummer 1
|
||||||
|
Giovanna Koch = Hof 1, Tisch 2, Nummer 2
|
||||||
|
Julia Esposito = Hof 1, Tisch 2, Nummer 3
|
||||||
|
Jennifer Dietrich = Hof 1, Tisch 2, Nummer 4
|
||||||
|
Christian Meyer = Hof 1, Tisch 2, Nummer 5
|
||||||
|
Svenja Horn = Hof 1, Tisch 2, Nummer 6
|
||||||
|
Stefanie Roth = Hof 1, Tisch 2, Nummer 7
|
||||||
|
Stefan Kuhn = Hof 1, Tisch 2, Nummer 8
|
||||||
|
|
||||||
|
[3]
|
||||||
|
Helga Fischer = Hof 1, Tisch 3, Nummer 1
|
||||||
|
Heinz Fischer = Hof 1, Tisch 3, Nummer 2
|
||||||
|
|
||||||
|
[4]
|
||||||
|
Gast Musikverein = Hof 1, Tisch 4, Nummer 1
|
||||||
|
Gast Musikverein = Hof 1, Tisch 4, Nummer 2
|
||||||
|
Gast Musikverein = Hof 1, Tisch 4, Nummer 3
|
||||||
|
Gast Musikverein = Hof 1, Tisch 4, Nummer 4
|
||||||
|
Gast Musikverein = Hof 1, Tisch 4, Nummer 5
|
||||||
|
Gast Musikverein = Hof 1, Tisch 4, Nummer 6
|
||||||
|
Gast Musikverein = Hof 1, Tisch 4, Nummer 7
|
||||||
|
Sven Fischer = Hof 1, Tisch 4, Nummer 8
|
||||||
|
|
||||||
|
[5]
|
||||||
|
Gast Musikverein = Hof 1, Tisch 5, Nummer 1
|
||||||
|
Gast Musikverein = Hof 1, Tisch 5, Nummer 2
|
||||||
|
Gast Musikverein = Hof 1, Tisch 5, Nummer 3
|
||||||
|
Gast Musikverein = Hof 1, Tisch 5, Nummer 4
|
||||||
|
Gast Musikverein = Hof 1, Tisch 5, Nummer 5
|
||||||
|
Gast Musikverein = Hof 1, Tisch 5, Nummer 6
|
||||||
|
Marco Meyer = Hof 1, Tisch 5, Nummer 7
|
||||||
|
Sandra Meyer = Hof 1, Tisch 5, Nummer 8
|
||||||
|
|
||||||
|
[6]
|
||||||
|
|
||||||
|
[7]
|
||||||
|
|
||||||
|
[8]
|
||||||
|
Yusuf Peters = Hof 1, Tisch 8, Nummer 1
|
||||||
|
Sergej Berger = Hof 1, Tisch 8, Nummer 2
|
||||||
|
Giovanna Kovac = Hof 1, Tisch 8, Nummer 3
|
||||||
|
Dennis Schmidt = Hof 1, Tisch 8, Nummer 4
|
||||||
|
Patrick Simon = Hof 1, Tisch 8, Nummer 5
|
||||||
|
Stefanie Busch = Hof 1, Tisch 8, Nummer 6
|
||||||
|
Andreas Koch = Hof 1, Tisch 8, Nummer 7
|
||||||
|
Melanie Peters = Hof 1, Tisch 8, Nummer 8
|
||||||
|
|
||||||
|
[9]
|
||||||
|
Wolfgang Hansen = Hof 1, Tisch 9, Nummer 1
|
||||||
|
Hannelore Barth = Hof 1, Tisch 9, Nummer 2
|
||||||
|
Erika Frank = Hof 1, Tisch 9, Nummer 3
|
||||||
|
Gerhard Erdem = Hof 1, Tisch 9, Nummer 4
|
||||||
|
Rainer Erdem = Hof 1, Tisch 9, Nummer 5
|
||||||
|
Gisela Esposito = Hof 1, Tisch 9, Nummer 6
|
||||||
|
Brigitte Franke = Hof 1, Tisch 9, Nummer 7
|
||||||
|
Wolfgang Meyer = Hof 1, Tisch 9, Nummer 8
|
||||||
|
|
||||||
|
[10]
|
||||||
|
Elif Demir = Hof 1, Tisch 10, Nummer 1
|
||||||
|
Jennifer Simon = Hof 1, Tisch 10, Nummer 2
|
||||||
|
Andreas Stein = Hof 1, Tisch 10, Nummer 3
|
||||||
|
Stefan Klein = Hof 1, Tisch 10, Nummer 4
|
||||||
|
Timo Frank = Hof 1, Tisch 10, Nummer 5
|
||||||
|
Daniel Wagner = Hof 1, Tisch 10, Nummer 6
|
||||||
|
Stefanie Simon = Hof 1, Tisch 10, Nummer 7
|
||||||
|
|
||||||
|
[11]
|
||||||
|
Nadine Frank = Hof 1, Tisch 11, Nummer 1
|
||||||
|
Markus Schmitt = Hof 1, Tisch 11, Nummer 2
|
||||||
|
Olga Yilmaz = Hof 1, Tisch 11, Nummer 3
|
||||||
|
Olga Hansen = Hof 1, Tisch 11, Nummer 4
|
||||||
|
Daniel Horn = Hof 1, Tisch 11, Nummer 5
|
||||||
|
Milan Lange = Hof 1, Tisch 11, Nummer 6
|
||||||
|
Daniel Brandt = Hof 1, Tisch 11, Nummer 7
|
||||||
|
Kathrin Brandt = Hof 1, Tisch 11, Nummer 8
|
||||||
|
|
||||||
|
[12]
|
||||||
|
Nicole Fischer = Hof 1, Tisch 12, Nummer 1
|
||||||
|
Matthias Polat = Hof 1, Tisch 12, Nummer 2
|
||||||
|
Christian Esposito = Hof 1, Tisch 12, Nummer 3
|
||||||
|
Lena Hoffmann = Hof 1, Tisch 12, Nummer 4
|
||||||
|
Timo Wagner = Hof 1, Tisch 12, Nummer 5
|
||||||
|
Nicole Dietrich = Hof 1, Tisch 12, Nummer 6
|
||||||
|
Dennis Kraus = Hof 1, Tisch 12, Nummer 7
|
||||||
|
Melanie Kraus = Hof 1, Tisch 12, Nummer 8
|
||||||
|
|
||||||
|
[13]
|
||||||
|
Ingrid Demir = Hof 1, Tisch 13, Nummer 1
|
||||||
|
Monika Demir = Hof 1, Tisch 13, Nummer 2
|
||||||
|
Hannelore Demir = Hof 1, Tisch 13, Nummer 3
|
||||||
|
Yusuf Vogel = Hof 1, Tisch 13, Nummer 4
|
||||||
|
Sandra Vogel = Hof 1, Tisch 13, Nummer 5
|
||||||
|
Dennis Sommer = Hof 1, Tisch 13, Nummer 6
|
||||||
|
Nicole Sommer = Hof 1, Tisch 13, Nummer 7
|
||||||
|
Lina Sommer = Hof 1, Tisch 13, Nummer 8
|
||||||
|
|
||||||
|
[14]
|
||||||
|
Andreas Brandt = Hof 1, Tisch 14, Nummer 1
|
||||||
|
Lena Brandt = Hof 1, Tisch 14, Nummer 2
|
||||||
|
Theo Brandt = Hof 1, Tisch 14, Nummer 3
|
||||||
|
Milan Brandt = Hof 1, Tisch 14, Nummer 4
|
||||||
|
Anja Brandt = Hof 1, Tisch 14, Nummer 5
|
||||||
|
Sofia Brandt = Hof 1, Tisch 14, Nummer 6
|
||||||
|
Timo Kuhn = Hof 1, Tisch 14, Nummer 7
|
||||||
|
Sarah Kuhn = Hof 1, Tisch 14, Nummer 8
|
||||||
|
|
||||||
|
[15]
|
||||||
|
Yusuf Schwarz = Hof 1, Tisch 15, Nummer 1
|
||||||
|
Sarah Schwarz = Hof 1, Tisch 15, Nummer 2
|
||||||
|
Horst Aydin = Hof 1, Tisch 15, Nummer 3
|
||||||
|
Ursula Aydin = Hof 1, Tisch 15, Nummer 4
|
||||||
|
Heinz Tran = Hof 1, Tisch 15, Nummer 5
|
||||||
|
Erika Erdem = Hof 1, Tisch 15, Nummer 6
|
||||||
|
Dennis Sommer = Hof 1, Tisch 15, Nummer 7
|
||||||
|
Jennifer Sommer = Hof 1, Tisch 15, Nummer 8
|
||||||
|
|
||||||
|
[16]
|
||||||
|
Leni Kuhn = Hof 1, Tisch 16, Nummer 1
|
||||||
|
Emil Sommer = Hof 1, Tisch 16, Nummer 2
|
||||||
|
Ida Sommer = Hof 1, Tisch 16, Nummer 3
|
||||||
|
Liam Schwarz = Hof 1, Tisch 16, Nummer 4
|
||||||
|
Elias Schwarz = Hof 1, Tisch 16, Nummer 5
|
||||||
|
Felix Brandt = Hof 1, Tisch 16, Nummer 6
|
||||||
|
Matteo Kraus = Hof 1, Tisch 16, Nummer 7
|
||||||
|
Anton Brandt = Hof 1, Tisch 16, Nummer 8
|
||||||
|
Frieda Brandt = Hof 1, Tisch 16, Nummer 9
|
||||||
|
Mila Meyer = Hof 1, Tisch 16, Nummer 10
|
||||||
|
Greta Brandt = Hof 1, Tisch 16, Nummer 11
|
||||||
|
Theo Sommer = Hof 1, Tisch 16, Nummer 12
|
||||||
|
Max Sommer = Hof 1, Tisch 16, Nummer 13
|
||||||
|
|
||||||
|
[17]
|
||||||
|
Ben Brandt = Hof 1, Tisch 17, Nummer 1
|
||||||
|
Paul Brandt = Hof 1, Tisch 17, Nummer 2
|
||||||
|
Anton Meyer = Hof 1, Tisch 17, Nummer 3
|
||||||
|
Ida Meyer = Hof 1, Tisch 17, Nummer 4
|
||||||
|
Anton Vogel = Hof 1, Tisch 17, Nummer 5
|
||||||
|
Max Vogel = Hof 1, Tisch 17, Nummer 6
|
||||||
|
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
Vorname;Nachname;Titel;Gruppe;Tisch;Anzahl
|
||||||
|
Julia;Brandt;;Ehrentafel: Brautpaar, Brauteltern, Braeutigameltern, Trauzeugen (fest an Tisch 1);1;
|
||||||
|
Daniel;Sommer;;Ehrentafel: Brautpaar, Brauteltern, Braeutigameltern, Trauzeugen (fest an Tisch 1);1;
|
||||||
|
Werner;Brandt;;Ehrentafel: Brautpaar, Brauteltern, Braeutigameltern, Trauzeugen (fest an Tisch 1);1;
|
||||||
|
Helga;Brandt;;Ehrentafel: Brautpaar, Brauteltern, Braeutigameltern, Trauzeugen (fest an Tisch 1);1;
|
||||||
|
Dieter;Sommer;;Ehrentafel: Brautpaar, Brauteltern, Braeutigameltern, Trauzeugen (fest an Tisch 1);1;
|
||||||
|
Renate;Sommer;;Ehrentafel: Brautpaar, Brauteltern, Braeutigameltern, Trauzeugen (fest an Tisch 1);1;
|
||||||
|
Sarah;Winkler;;Ehrentafel: Brautpaar, Brauteltern, Braeutigameltern, Trauzeugen (fest an Tisch 1);1;
|
||||||
|
Tobias;Frank;;Ehrentafel: Brautpaar, Brauteltern, Braeutigameltern, Trauzeugen (fest an Tisch 1);1;
|
||||||
|
Yusuf;Peters;;Familie Peters (Braut-Seite, Geschwister Melanie);;
|
||||||
|
Melanie;Peters;;Familie Peters (Braut-Seite, Geschwister Melanie);;
|
||||||
|
Daniel;Brandt;;"Familie Brandt (Braut-Seite, Geschwister Daniel): Felix (12 J.) am Kindertisch; Ben (13 J.) am Teenager-Tisch";;
|
||||||
|
Kathrin;Brandt;;"Familie Brandt (Braut-Seite, Geschwister Daniel): Felix (12 J.) am Kindertisch; Ben (13 J.) am Teenager-Tisch";;
|
||||||
|
Dennis;Kraus;;Familie Kraus (Braut-Seite, Geschwister Melanie): Matteo (9 J.) am Kindertisch;;
|
||||||
|
Melanie;Kraus;;Familie Kraus (Braut-Seite, Geschwister Melanie): Matteo (9 J.) am Kindertisch;;
|
||||||
|
Andreas;Brandt;;"Familie Brandt (Braut-Seite, Geschwister Andreas): Theo (3 J.) sitzt bei den Eltern; Anton (10 J.) am Kindertisch; Frieda (12 J.) am Kindertisch; Paul (19 J.) am Teenager-Tisch";;
|
||||||
|
Lena;Brandt;;"Familie Brandt (Braut-Seite, Geschwister Andreas): Theo (3 J.) sitzt bei den Eltern; Anton (10 J.) am Kindertisch; Frieda (12 J.) am Kindertisch; Paul (19 J.) am Teenager-Tisch";;
|
||||||
|
Theo;Brandt;;"Familie Brandt (Braut-Seite, Geschwister Andreas): Theo (3 J.) sitzt bei den Eltern; Anton (10 J.) am Kindertisch; Frieda (12 J.) am Kindertisch; Paul (19 J.) am Teenager-Tisch";;
|
||||||
|
Marco;Meyer;;"Familie Meyer (Braut-Seite, Geschwister Sandra): Mila (10 J.) am Kindertisch; Anton (16 J.) am Teenager-Tisch; Ida (16 J.) am Teenager-Tisch";;
|
||||||
|
Sandra;Meyer;;"Familie Meyer (Braut-Seite, Geschwister Sandra): Mila (10 J.) am Kindertisch; Anton (16 J.) am Teenager-Tisch; Ida (16 J.) am Teenager-Tisch";;
|
||||||
|
Milan;Brandt;;"Familie Brandt (Braut-Seite, Geschwister Milan): Sofia (2 J.) sitzt bei den Eltern; Greta (7 J.) am Kindertisch";;
|
||||||
|
Anja;Brandt;;"Familie Brandt (Braut-Seite, Geschwister Milan): Sofia (2 J.) sitzt bei den Eltern; Greta (7 J.) am Kindertisch";;
|
||||||
|
Sofia;Brandt;;"Familie Brandt (Braut-Seite, Geschwister Milan): Sofia (2 J.) sitzt bei den Eltern; Greta (7 J.) am Kindertisch";;
|
||||||
|
Yusuf;Vogel;;"Familie Vogel (Braut-Seite, Geschwister Sandra): Anton (14 J.) am Teenager-Tisch; Max (15 J.) am Teenager-Tisch";;
|
||||||
|
Sandra;Vogel;;"Familie Vogel (Braut-Seite, Geschwister Sandra): Anton (14 J.) am Teenager-Tisch; Max (15 J.) am Teenager-Tisch";;
|
||||||
|
Dennis;Sommer;;"Familie Sommer (Braeutigam-Seite, Geschwister Dennis): Lina (3 J.) sitzt bei den Eltern; Theo (8 J.) am Kindertisch; Max (12 J.) am Kindertisch";;
|
||||||
|
Nicole;Sommer;;"Familie Sommer (Braeutigam-Seite, Geschwister Dennis): Lina (3 J.) sitzt bei den Eltern; Theo (8 J.) am Kindertisch; Max (12 J.) am Kindertisch";;
|
||||||
|
Lina;Sommer;;"Familie Sommer (Braeutigam-Seite, Geschwister Dennis): Lina (3 J.) sitzt bei den Eltern; Theo (8 J.) am Kindertisch; Max (12 J.) am Kindertisch";;
|
||||||
|
Timo;Kuhn;;Familie Kuhn (Braeutigam-Seite, Geschwister Sarah): Leni (10 J.) am Kindertisch;;
|
||||||
|
Sarah;Kuhn;;Familie Kuhn (Braeutigam-Seite, Geschwister Sarah): Leni (10 J.) am Kindertisch;;
|
||||||
|
Dennis;Sommer;;"Familie Sommer (Braeutigam-Seite, Geschwister Dennis): Emil (8 J.) am Kindertisch; Ida (8 J.) am Kindertisch";;
|
||||||
|
Jennifer;Sommer;;"Familie Sommer (Braeutigam-Seite, Geschwister Dennis): Emil (8 J.) am Kindertisch; Ida (8 J.) am Kindertisch";;
|
||||||
|
Yusuf;Schwarz;;"Familie Schwarz (Braeutigam-Seite, Geschwister Sarah): Liam (8 J.) am Kindertisch; Elias (8 J.) am Kindertisch";;
|
||||||
|
Sarah;Schwarz;;"Familie Schwarz (Braeutigam-Seite, Geschwister Sarah): Liam (8 J.) am Kindertisch; Elias (8 J.) am Kindertisch";;
|
||||||
|
Horst;Aydin;;Onkel und Tante (Braut-Seite);;
|
||||||
|
Ursula;Aydin;;Onkel und Tante (Braut-Seite);;
|
||||||
|
Ingrid;Demir;;Onkel und Tante mit Cousine (Braut-Seite);;
|
||||||
|
Monika;Demir;;Onkel und Tante mit Cousine (Braut-Seite);;
|
||||||
|
Hannelore;Demir;;Onkel und Tante mit Cousine (Braut-Seite);;
|
||||||
|
Heinz;Fischer;;Onkel und Tante (Braeutigam-Seite);;
|
||||||
|
Helga;Fischer;;Onkel und Tante (Braeutigam-Seite);;
|
||||||
|
Heinz;Tran;;Grosstante mit Begleitung;;
|
||||||
|
Erika;Erdem;;Grosstante mit Begleitung;;
|
||||||
|
Nicole;Fischer;;Studienfreunde der Braut;;
|
||||||
|
Matthias;Polat;;Studienfreunde der Braut;;
|
||||||
|
Christian;Esposito;;Studienfreunde der Braut;;
|
||||||
|
Lena;Hoffmann;;Studienfreunde der Braut;;
|
||||||
|
Timo;Wagner;;Studienfreunde der Braut;;
|
||||||
|
Nicole;Dietrich;;Studienfreunde der Braut;;
|
||||||
|
Wolfgang;Hansen;;Kegelclub des Brautvaters;;
|
||||||
|
Hannelore;Barth;;Kegelclub des Brautvaters;;
|
||||||
|
Erika;Frank;;Kegelclub des Brautvaters;;
|
||||||
|
Gerhard;Erdem;;Kegelclub des Brautvaters;;
|
||||||
|
Rainer;Erdem;;Kegelclub des Brautvaters;;
|
||||||
|
Gisela;Esposito;;Kegelclub des Brautvaters;;
|
||||||
|
Brigitte;Franke;;Kegelclub des Brautvaters;;
|
||||||
|
Wolfgang;Meyer;;Kegelclub des Brautvaters;;
|
||||||
|
Elif;Demir;;Arbeitskolleginnen der Braut;;
|
||||||
|
Jennifer;Simon;;Arbeitskolleginnen der Braut;;
|
||||||
|
Andreas;Stein;;Arbeitskolleginnen der Braut;;
|
||||||
|
Stefan;Klein;;Arbeitskolleginnen der Braut;;
|
||||||
|
Timo;Frank;;Arbeitskolleginnen der Braut;;
|
||||||
|
Daniel;Wagner;;Arbeitskolleginnen der Braut;;
|
||||||
|
Stefanie;Simon;;Arbeitskolleginnen der Braut;;
|
||||||
|
Nadine;Frank;;Arbeitskollegen des Braeutigams;;
|
||||||
|
Markus;Schmitt;;Arbeitskollegen des Braeutigams;;
|
||||||
|
Olga;Yilmaz;;Arbeitskollegen des Braeutigams;;
|
||||||
|
Olga;Hansen;;Arbeitskollegen des Braeutigams;;
|
||||||
|
Daniel;Horn;;Arbeitskollegen des Braeutigams;;
|
||||||
|
Milan;Lange;;Arbeitskollegen des Braeutigams;;
|
||||||
|
Guenter;Schwarz;;Nachbarn der Brauteltern;;
|
||||||
|
Rainer;Aksoy;;Nachbarn der Brauteltern;;
|
||||||
|
Renate;Aksoy;;Nachbarn der Brauteltern;;
|
||||||
|
Werner;Stein;;Nachbarn der Brauteltern;;
|
||||||
|
Sergej;Berger;;Fussballverein des Braeutigams;;
|
||||||
|
Giovanna;Kovac;;Fussballverein des Braeutigams;;
|
||||||
|
Dennis;Schmidt;;Fussballverein des Braeutigams;;
|
||||||
|
Patrick;Simon;;Fussballverein des Braeutigams;;
|
||||||
|
Stefanie;Busch;;Fussballverein des Braeutigams;;
|
||||||
|
Andreas;Koch;;Fussballverein des Braeutigams;;
|
||||||
|
Svenja;Vogel;;Fussballverein des Braeutigams;;
|
||||||
|
Giovanna;Koch;;Fussballverein des Braeutigams;;
|
||||||
|
Julia;Esposito;;Fussballverein des Braeutigams;;
|
||||||
|
Jennifer;Dietrich;;Freundinnen aus der Schulzeit;;
|
||||||
|
Christian;Meyer;;Freundinnen aus der Schulzeit;;
|
||||||
|
Svenja;Horn;;Freundinnen aus der Schulzeit;;
|
||||||
|
Stefanie;Roth;;Freundinnen aus der Schulzeit;;
|
||||||
|
Stefan;Kuhn;;Freundinnen aus der Schulzeit;;
|
||||||
|
Felix;Brandt;;Kindertisch (5-12 Jahre, fest an Tisch 16);16;
|
||||||
|
Matteo;Kraus;;Kindertisch (5-12 Jahre, fest an Tisch 16);16;
|
||||||
|
Anton;Brandt;;Kindertisch (5-12 Jahre, fest an Tisch 16);16;
|
||||||
|
Frieda;Brandt;;Kindertisch (5-12 Jahre, fest an Tisch 16);16;
|
||||||
|
Mila;Meyer;;Kindertisch (5-12 Jahre, fest an Tisch 16);16;
|
||||||
|
Greta;Brandt;;Kindertisch (5-12 Jahre, fest an Tisch 16);16;
|
||||||
|
Theo;Sommer;;Kindertisch (5-12 Jahre, fest an Tisch 16);16;
|
||||||
|
Max;Sommer;;Kindertisch (5-12 Jahre, fest an Tisch 16);16;
|
||||||
|
Leni;Kuhn;;Kindertisch (5-12 Jahre, fest an Tisch 16);16;
|
||||||
|
Emil;Sommer;;Kindertisch (5-12 Jahre, fest an Tisch 16);16;
|
||||||
|
Ida;Sommer;;Kindertisch (5-12 Jahre, fest an Tisch 16);16;
|
||||||
|
Liam;Schwarz;;Kindertisch (5-12 Jahre, fest an Tisch 16);16;
|
||||||
|
Elias;Schwarz;;Kindertisch (5-12 Jahre, fest an Tisch 16);16;
|
||||||
|
Ben;Brandt;;Teenager-Tisch (13-19 Jahre, fest an Tisch 17);17;
|
||||||
|
Paul;Brandt;;Teenager-Tisch (13-19 Jahre, fest an Tisch 17);17;
|
||||||
|
Anton;Meyer;;Teenager-Tisch (13-19 Jahre, fest an Tisch 17);17;
|
||||||
|
Ida;Meyer;;Teenager-Tisch (13-19 Jahre, fest an Tisch 17);17;
|
||||||
|
Anton;Vogel;;Teenager-Tisch (13-19 Jahre, fest an Tisch 17);17;
|
||||||
|
Max;Vogel;;Teenager-Tisch (13-19 Jahre, fest an Tisch 17);17;
|
||||||
|
Gast;Musikverein;;Musikverein (anonyme Sammelbuchung, 13 Karten);;13
|
||||||
|
Sven;Fischer;;alleinreisender Gast;;
|
||||||
|
@@ -0,0 +1,575 @@
|
|||||||
|
{
|
||||||
|
"gruppen": [
|
||||||
|
{
|
||||||
|
"name": "Ehrentafel: Brautpaar, Brauteltern, Braeutigameltern, Trauzeugen (fest an Tisch 1)",
|
||||||
|
"tisch": 1,
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Julia",
|
||||||
|
"nachname": "Brandt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Daniel",
|
||||||
|
"nachname": "Sommer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Werner",
|
||||||
|
"nachname": "Brandt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Helga",
|
||||||
|
"nachname": "Brandt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Dieter",
|
||||||
|
"nachname": "Sommer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Renate",
|
||||||
|
"nachname": "Sommer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Sarah",
|
||||||
|
"nachname": "Winkler"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Tobias",
|
||||||
|
"nachname": "Frank"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Familie Peters (Braut-Seite, Geschwister Melanie)",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Yusuf",
|
||||||
|
"nachname": "Peters"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Melanie",
|
||||||
|
"nachname": "Peters"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Familie Brandt (Braut-Seite, Geschwister Daniel): Felix (12 J.) am Kindertisch; Ben (13 J.) am Teenager-Tisch",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Daniel",
|
||||||
|
"nachname": "Brandt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Kathrin",
|
||||||
|
"nachname": "Brandt"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Familie Kraus (Braut-Seite, Geschwister Melanie): Matteo (9 J.) am Kindertisch",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Dennis",
|
||||||
|
"nachname": "Kraus"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Melanie",
|
||||||
|
"nachname": "Kraus"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Familie Brandt (Braut-Seite, Geschwister Andreas): Theo (3 J.) sitzt bei den Eltern; Anton (10 J.) am Kindertisch; Frieda (12 J.) am Kindertisch; Paul (19 J.) am Teenager-Tisch",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Andreas",
|
||||||
|
"nachname": "Brandt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Lena",
|
||||||
|
"nachname": "Brandt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Theo",
|
||||||
|
"nachname": "Brandt"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Familie Meyer (Braut-Seite, Geschwister Sandra): Mila (10 J.) am Kindertisch; Anton (16 J.) am Teenager-Tisch; Ida (16 J.) am Teenager-Tisch",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Marco",
|
||||||
|
"nachname": "Meyer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Sandra",
|
||||||
|
"nachname": "Meyer"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Familie Brandt (Braut-Seite, Geschwister Milan): Sofia (2 J.) sitzt bei den Eltern; Greta (7 J.) am Kindertisch",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Milan",
|
||||||
|
"nachname": "Brandt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Anja",
|
||||||
|
"nachname": "Brandt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Sofia",
|
||||||
|
"nachname": "Brandt"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Familie Vogel (Braut-Seite, Geschwister Sandra): Anton (14 J.) am Teenager-Tisch; Max (15 J.) am Teenager-Tisch",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Yusuf",
|
||||||
|
"nachname": "Vogel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Sandra",
|
||||||
|
"nachname": "Vogel"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Familie Sommer (Braeutigam-Seite, Geschwister Dennis): Lina (3 J.) sitzt bei den Eltern; Theo (8 J.) am Kindertisch; Max (12 J.) am Kindertisch",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Dennis",
|
||||||
|
"nachname": "Sommer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Nicole",
|
||||||
|
"nachname": "Sommer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Lina",
|
||||||
|
"nachname": "Sommer"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Familie Kuhn (Braeutigam-Seite, Geschwister Sarah): Leni (10 J.) am Kindertisch",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Timo",
|
||||||
|
"nachname": "Kuhn"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Sarah",
|
||||||
|
"nachname": "Kuhn"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Familie Sommer (Braeutigam-Seite, Geschwister Dennis): Emil (8 J.) am Kindertisch; Ida (8 J.) am Kindertisch",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Dennis",
|
||||||
|
"nachname": "Sommer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Jennifer",
|
||||||
|
"nachname": "Sommer"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Familie Schwarz (Braeutigam-Seite, Geschwister Sarah): Liam (8 J.) am Kindertisch; Elias (8 J.) am Kindertisch",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Yusuf",
|
||||||
|
"nachname": "Schwarz"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Sarah",
|
||||||
|
"nachname": "Schwarz"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Onkel und Tante (Braut-Seite)",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Horst",
|
||||||
|
"nachname": "Aydin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Ursula",
|
||||||
|
"nachname": "Aydin"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Onkel und Tante mit Cousine (Braut-Seite)",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Ingrid",
|
||||||
|
"nachname": "Demir"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Monika",
|
||||||
|
"nachname": "Demir"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Hannelore",
|
||||||
|
"nachname": "Demir"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Onkel und Tante (Braeutigam-Seite)",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Heinz",
|
||||||
|
"nachname": "Fischer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Helga",
|
||||||
|
"nachname": "Fischer"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Grosstante mit Begleitung",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Heinz",
|
||||||
|
"nachname": "Tran"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Erika",
|
||||||
|
"nachname": "Erdem"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Studienfreunde der Braut",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Nicole",
|
||||||
|
"nachname": "Fischer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Matthias",
|
||||||
|
"nachname": "Polat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Christian",
|
||||||
|
"nachname": "Esposito"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Lena",
|
||||||
|
"nachname": "Hoffmann"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Timo",
|
||||||
|
"nachname": "Wagner"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Nicole",
|
||||||
|
"nachname": "Dietrich"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Kegelclub des Brautvaters",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Wolfgang",
|
||||||
|
"nachname": "Hansen"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Hannelore",
|
||||||
|
"nachname": "Barth"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Erika",
|
||||||
|
"nachname": "Frank"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Gerhard",
|
||||||
|
"nachname": "Erdem"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Rainer",
|
||||||
|
"nachname": "Erdem"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Gisela",
|
||||||
|
"nachname": "Esposito"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Brigitte",
|
||||||
|
"nachname": "Franke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Wolfgang",
|
||||||
|
"nachname": "Meyer"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Arbeitskolleginnen der Braut",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Elif",
|
||||||
|
"nachname": "Demir"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Jennifer",
|
||||||
|
"nachname": "Simon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Andreas",
|
||||||
|
"nachname": "Stein"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Stefan",
|
||||||
|
"nachname": "Klein"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Timo",
|
||||||
|
"nachname": "Frank"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Daniel",
|
||||||
|
"nachname": "Wagner"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Stefanie",
|
||||||
|
"nachname": "Simon"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Arbeitskollegen des Braeutigams",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Nadine",
|
||||||
|
"nachname": "Frank"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Markus",
|
||||||
|
"nachname": "Schmitt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Olga",
|
||||||
|
"nachname": "Yilmaz"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Olga",
|
||||||
|
"nachname": "Hansen"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Daniel",
|
||||||
|
"nachname": "Horn"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Milan",
|
||||||
|
"nachname": "Lange"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Nachbarn der Brauteltern",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Guenter",
|
||||||
|
"nachname": "Schwarz"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Rainer",
|
||||||
|
"nachname": "Aksoy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Renate",
|
||||||
|
"nachname": "Aksoy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Werner",
|
||||||
|
"nachname": "Stein"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fussballverein des Braeutigams",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Sergej",
|
||||||
|
"nachname": "Berger"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Giovanna",
|
||||||
|
"nachname": "Kovac"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Dennis",
|
||||||
|
"nachname": "Schmidt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Patrick",
|
||||||
|
"nachname": "Simon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Stefanie",
|
||||||
|
"nachname": "Busch"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Andreas",
|
||||||
|
"nachname": "Koch"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Svenja",
|
||||||
|
"nachname": "Vogel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Giovanna",
|
||||||
|
"nachname": "Koch"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Julia",
|
||||||
|
"nachname": "Esposito"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Freundinnen aus der Schulzeit",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Jennifer",
|
||||||
|
"nachname": "Dietrich"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Christian",
|
||||||
|
"nachname": "Meyer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Svenja",
|
||||||
|
"nachname": "Horn"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Stefanie",
|
||||||
|
"nachname": "Roth"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Stefan",
|
||||||
|
"nachname": "Kuhn"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Kindertisch (5-12 Jahre, fest an Tisch 16)",
|
||||||
|
"tisch": 16,
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Felix",
|
||||||
|
"nachname": "Brandt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Matteo",
|
||||||
|
"nachname": "Kraus"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Anton",
|
||||||
|
"nachname": "Brandt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Frieda",
|
||||||
|
"nachname": "Brandt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Mila",
|
||||||
|
"nachname": "Meyer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Greta",
|
||||||
|
"nachname": "Brandt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Theo",
|
||||||
|
"nachname": "Sommer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Max",
|
||||||
|
"nachname": "Sommer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Leni",
|
||||||
|
"nachname": "Kuhn"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Emil",
|
||||||
|
"nachname": "Sommer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Ida",
|
||||||
|
"nachname": "Sommer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Liam",
|
||||||
|
"nachname": "Schwarz"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Elias",
|
||||||
|
"nachname": "Schwarz"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Teenager-Tisch (13-19 Jahre, fest an Tisch 17)",
|
||||||
|
"tisch": 17,
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Ben",
|
||||||
|
"nachname": "Brandt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Paul",
|
||||||
|
"nachname": "Brandt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Anton",
|
||||||
|
"nachname": "Meyer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Ida",
|
||||||
|
"nachname": "Meyer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Anton",
|
||||||
|
"nachname": "Vogel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Max",
|
||||||
|
"nachname": "Vogel"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Musikverein (anonyme Sammelbuchung, 13 Karten)",
|
||||||
|
"anzahl": 13,
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Gast",
|
||||||
|
"nachname": "Musikverein"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "alleinreisender Gast",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Sven",
|
||||||
|
"nachname": "Fischer"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
[1]
|
||||||
|
Nummer=1
|
||||||
|
Hof=1
|
||||||
|
Plaetze=12
|
||||||
|
Nachbarliste=[3, 4, 5]
|
||||||
|
Koordinaten=(2,0)
|
||||||
|
|
||||||
|
[2]
|
||||||
|
Nummer=2
|
||||||
|
Hof=1
|
||||||
|
Plaetze=8
|
||||||
|
Nachbarliste=[3, 7, 8]
|
||||||
|
Koordinaten=(0,1)
|
||||||
|
|
||||||
|
[3]
|
||||||
|
Nummer=3
|
||||||
|
Hof=1
|
||||||
|
Plaetze=8
|
||||||
|
Nachbarliste=[1, 2, 4, 7, 8, 9]
|
||||||
|
Koordinaten=(1,1)
|
||||||
|
|
||||||
|
[4]
|
||||||
|
Nummer=4
|
||||||
|
Hof=1
|
||||||
|
Plaetze=8
|
||||||
|
Nachbarliste=[1, 3, 5, 8, 9, 10]
|
||||||
|
Koordinaten=(2,1)
|
||||||
|
|
||||||
|
[5]
|
||||||
|
Nummer=5
|
||||||
|
Hof=1
|
||||||
|
Plaetze=8
|
||||||
|
Nachbarliste=[1, 4, 6, 9, 10, 11]
|
||||||
|
Koordinaten=(3,1)
|
||||||
|
|
||||||
|
[6]
|
||||||
|
Nummer=6
|
||||||
|
Hof=1
|
||||||
|
Plaetze=8
|
||||||
|
Nachbarliste=[5, 10, 11, 16, 17]
|
||||||
|
Koordinaten=(4,1)
|
||||||
|
|
||||||
|
[7]
|
||||||
|
Nummer=7
|
||||||
|
Hof=1
|
||||||
|
Plaetze=8
|
||||||
|
Nachbarliste=[2, 3, 8, 12, 13]
|
||||||
|
Koordinaten=(0,2)
|
||||||
|
|
||||||
|
[8]
|
||||||
|
Nummer=8
|
||||||
|
Hof=1
|
||||||
|
Plaetze=8
|
||||||
|
Nachbarliste=[2, 3, 4, 7, 9, 12, 13, 14]
|
||||||
|
Koordinaten=(1,2)
|
||||||
|
|
||||||
|
[9]
|
||||||
|
Nummer=9
|
||||||
|
Hof=1
|
||||||
|
Plaetze=8
|
||||||
|
Nachbarliste=[3, 4, 5, 8, 10, 13, 14, 15]
|
||||||
|
Koordinaten=(2,2)
|
||||||
|
|
||||||
|
[10]
|
||||||
|
Nummer=10
|
||||||
|
Hof=1
|
||||||
|
Plaetze=8
|
||||||
|
Nachbarliste=[4, 5, 6, 9, 11, 14, 15]
|
||||||
|
Koordinaten=(3,2)
|
||||||
|
|
||||||
|
[11]
|
||||||
|
Nummer=11
|
||||||
|
Hof=1
|
||||||
|
Plaetze=8
|
||||||
|
Nachbarliste=[5, 6, 10, 15, 16, 17]
|
||||||
|
Koordinaten=(4,2)
|
||||||
|
|
||||||
|
[12]
|
||||||
|
Nummer=12
|
||||||
|
Hof=1
|
||||||
|
Plaetze=8
|
||||||
|
Nachbarliste=[7, 8, 13]
|
||||||
|
Koordinaten=(0,3)
|
||||||
|
|
||||||
|
[13]
|
||||||
|
Nummer=13
|
||||||
|
Hof=1
|
||||||
|
Plaetze=8
|
||||||
|
Nachbarliste=[7, 8, 9, 12, 14]
|
||||||
|
Koordinaten=(1,3)
|
||||||
|
|
||||||
|
[14]
|
||||||
|
Nummer=14
|
||||||
|
Hof=1
|
||||||
|
Plaetze=8
|
||||||
|
Nachbarliste=[8, 9, 10, 13, 15]
|
||||||
|
Koordinaten=(2,3)
|
||||||
|
|
||||||
|
[15]
|
||||||
|
Nummer=15
|
||||||
|
Hof=1
|
||||||
|
Plaetze=8
|
||||||
|
Nachbarliste=[9, 10, 11, 14]
|
||||||
|
Koordinaten=(3,3)
|
||||||
|
|
||||||
|
[16]
|
||||||
|
Nummer=16
|
||||||
|
Hof=1
|
||||||
|
Plaetze=13
|
||||||
|
Nachbarliste=[6, 11, 17]
|
||||||
|
Koordinaten=(5,1)
|
||||||
|
|
||||||
|
[17]
|
||||||
|
Nummer=17
|
||||||
|
Hof=1
|
||||||
|
Plaetze=6
|
||||||
|
Nachbarliste=[6, 11, 16]
|
||||||
|
Koordinaten=(5,2)
|
||||||
@@ -0,0 +1,746 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="2200" height="790" viewBox="0 0 2200 790" font-family="sans-serif">
|
||||||
|
<rect width="100%" height="100%" fill="white"/>
|
||||||
|
<text x="1100" y="30" text-anchor="middle" font-size="16" fill="#333">Abstammung der Loesungen (Mutationsbaum)</text>
|
||||||
|
<line x1="60.0" y1="60.0" x2="60.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="113.3" y1="60.0" x2="86.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="166.7" y1="60.0" x2="112.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="220.0" y1="60.0" x2="139.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="273.3" y1="60.0" x2="165.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="326.7" y1="60.0" x2="191.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="380.0" y1="60.0" x2="218.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="433.3" y1="60.0" x2="244.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="486.7" y1="60.0" x2="270.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="540.0" y1="60.0" x2="297.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="593.3" y1="60.0" x2="323.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="646.7" y1="60.0" x2="349.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="700.0" y1="60.0" x2="375.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="753.3" y1="60.0" x2="402.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="806.7" y1="60.0" x2="428.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="860.0" y1="60.0" x2="454.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="913.3" y1="60.0" x2="481.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="966.7" y1="60.0" x2="507.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1020.0" y1="60.0" x2="533.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1073.3" y1="60.0" x2="560.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1126.7" y1="60.0" x2="586.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1180.0" y1="60.0" x2="612.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1233.3" y1="60.0" x2="639.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1286.7" y1="60.0" x2="665.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1340.0" y1="60.0" x2="691.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1393.3" y1="60.0" x2="718.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1446.7" y1="60.0" x2="744.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1500.0" y1="60.0" x2="770.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1553.3" y1="60.0" x2="797.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1606.7" y1="60.0" x2="823.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1660.0" y1="60.0" x2="849.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1713.3" y1="60.0" x2="876.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1766.7" y1="60.0" x2="902.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1820.0" y1="60.0" x2="928.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1873.3" y1="60.0" x2="955.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1926.7" y1="60.0" x2="981.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1980.0" y1="60.0" x2="1007.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2033.3" y1="60.0" x2="1034.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2086.7" y1="60.0" x2="1060.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2140.0" y1="60.0" x2="1086.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="60.0" y1="60.0" x2="1113.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="113.3" y1="60.0" x2="1139.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="166.7" y1="60.0" x2="1165.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="220.0" y1="60.0" x2="1192.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="273.3" y1="60.0" x2="1218.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="326.7" y1="60.0" x2="1244.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="380.0" y1="60.0" x2="1271.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="433.3" y1="60.0" x2="1297.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="486.7" y1="60.0" x2="1323.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="540.0" y1="60.0" x2="1350.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="593.3" y1="60.0" x2="1376.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="646.7" y1="60.0" x2="1402.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="700.0" y1="60.0" x2="1429.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="753.3" y1="60.0" x2="1455.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="806.7" y1="60.0" x2="1481.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="860.0" y1="60.0" x2="1508.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="913.3" y1="60.0" x2="1534.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="966.7" y1="60.0" x2="1560.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1020.0" y1="60.0" x2="1587.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1073.3" y1="60.0" x2="1613.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1126.7" y1="60.0" x2="1639.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1180.0" y1="60.0" x2="1666.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1233.3" y1="60.0" x2="1692.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1286.7" y1="60.0" x2="1718.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1340.0" y1="60.0" x2="1745.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1393.3" y1="60.0" x2="1771.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1446.7" y1="60.0" x2="1797.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1500.0" y1="60.0" x2="1824.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1553.3" y1="60.0" x2="1850.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1606.7" y1="60.0" x2="1876.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1660.0" y1="60.0" x2="1903.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1713.3" y1="60.0" x2="1929.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1766.7" y1="60.0" x2="1955.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1820.0" y1="60.0" x2="1982.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1873.3" y1="60.0" x2="2008.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1926.7" y1="60.0" x2="2034.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1980.0" y1="60.0" x2="2061.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2033.3" y1="60.0" x2="2087.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2086.7" y1="60.0" x2="2113.7" y2="150.0" stroke="#c04040" stroke-width="2.5"/>
|
||||||
|
<line x1="2140.0" y1="60.0" x2="2140.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="718.2" y1="150.0" x2="60.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1929.4" y1="150.0" x2="91.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="560.3" y1="150.0" x2="122.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1613.4" y1="150.0" x2="153.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1587.1" y1="150.0" x2="184.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2113.7" y1="150.0" x2="215.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1666.1" y1="150.0" x2="246.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2140.0" y1="150.0" x2="277.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="454.9" y1="150.0" x2="308.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1086.8" y1="150.0" x2="339.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="876.2" y1="150.0" x2="370.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="612.9" y1="150.0" x2="401.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1060.5" y1="150.0" x2="432.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1508.1" y1="150.0" x2="463.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1771.4" y1="150.0" x2="494.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1560.8" y1="150.0" x2="525.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1402.8" y1="150.0" x2="556.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1639.7" y1="150.0" x2="587.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1393.3" y1="60.0" x2="618.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="533.9" y1="150.0" x2="649.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="402.3" y1="150.0" x2="680.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1007.8" y1="150.0" x2="711.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="349.6" y1="150.0" x2="743.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1126.7" y1="60.0" x2="774.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1713.3" y1="60.0" x2="805.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1376.5" y1="150.0" x2="836.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1455.4" y1="150.0" x2="867.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="770.9" y1="150.0" x2="898.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2086.7" y1="60.0" x2="929.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1429.1" y1="150.0" x2="960.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="507.6" y1="150.0" x2="991.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2061.0" y1="150.0" x2="1022.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1218.5" y1="150.0" x2="1053.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="375.9" y1="150.0" x2="1084.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="718.2" y1="150.0" x2="1115.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1929.4" y1="150.0" x2="1146.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="560.3" y1="150.0" x2="1177.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1613.4" y1="150.0" x2="1208.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1587.1" y1="150.0" x2="1239.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2113.7" y1="150.0" x2="1270.7" y2="240.0" stroke="#c04040" stroke-width="2.5"/>
|
||||||
|
<line x1="1666.1" y1="150.0" x2="1301.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2140.0" y1="150.0" x2="1332.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="454.9" y1="150.0" x2="1363.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1086.8" y1="150.0" x2="1394.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="876.2" y1="150.0" x2="1426.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="612.9" y1="150.0" x2="1457.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1060.5" y1="150.0" x2="1488.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1508.1" y1="150.0" x2="1519.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1771.4" y1="150.0" x2="1550.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1560.8" y1="150.0" x2="1581.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1402.8" y1="150.0" x2="1612.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1639.7" y1="150.0" x2="1643.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1393.3" y1="60.0" x2="1674.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="533.9" y1="150.0" x2="1705.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="402.3" y1="150.0" x2="1736.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1007.8" y1="150.0" x2="1767.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="349.6" y1="150.0" x2="1798.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1126.7" y1="60.0" x2="1829.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1713.3" y1="60.0" x2="1860.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1376.5" y1="150.0" x2="1891.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1455.4" y1="150.0" x2="1922.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="770.9" y1="150.0" x2="1953.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2086.7" y1="60.0" x2="1984.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1429.1" y1="150.0" x2="2015.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="507.6" y1="150.0" x2="2046.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2061.0" y1="150.0" x2="2077.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1218.5" y1="150.0" x2="2109.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="375.9" y1="150.0" x2="2140.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="60.0" y1="240.0" x2="60.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="215.2" y1="240.0" x2="97.8" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="122.1" y1="240.0" x2="135.6" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1115.5" y1="240.0" x2="173.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1394.9" y1="240.0" x2="211.3" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="184.2" y1="240.0" x2="249.1" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1426.0" y1="240.0" x2="286.9" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="308.4" y1="240.0" x2="324.7" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1332.8" y1="240.0" x2="362.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1457.0" y1="240.0" x2="400.4" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="153.1" y1="240.0" x2="438.2" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1177.6" y1="240.0" x2="476.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1270.7" y1="240.0" x2="513.8" y2="330.0" stroke="#c04040" stroke-width="2.5"/>
|
||||||
|
<line x1="836.1" y1="240.0" x2="551.6" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="525.7" y1="240.0" x2="589.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1581.2" y1="240.0" x2="627.3" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="718.2" y1="150.0" x2="665.1" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1519.1" y1="240.0" x2="702.9" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="960.3" y1="240.0" x2="740.7" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1146.6" y1="240.0" x2="778.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="370.4" y1="240.0" x2="816.4" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1929.4" y1="150.0" x2="854.2" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="91.0" y1="240.0" x2="892.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1643.3" y1="240.0" x2="929.8" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1860.6" y1="240.0" x2="967.6" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1674.3" y1="240.0" x2="1005.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="560.3" y1="150.0" x2="1043.3" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1613.4" y1="150.0" x2="1081.1" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="60.0" y1="240.0" x2="1118.9" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="215.2" y1="240.0" x2="1156.7" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="122.1" y1="240.0" x2="1194.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1115.5" y1="240.0" x2="1232.4" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1394.9" y1="240.0" x2="1270.2" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="184.2" y1="240.0" x2="1308.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1426.0" y1="240.0" x2="1345.8" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="308.4" y1="240.0" x2="1383.6" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1332.8" y1="240.0" x2="1421.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1457.0" y1="240.0" x2="1459.3" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="153.1" y1="240.0" x2="1497.1" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1177.6" y1="240.0" x2="1534.9" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1270.7" y1="240.0" x2="1572.7" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="836.1" y1="240.0" x2="1610.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="525.7" y1="240.0" x2="1648.4" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1581.2" y1="240.0" x2="1686.2" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="718.2" y1="150.0" x2="1724.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1519.1" y1="240.0" x2="1761.8" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="960.3" y1="240.0" x2="1799.6" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1146.6" y1="240.0" x2="1837.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="370.4" y1="240.0" x2="1875.3" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1929.4" y1="150.0" x2="1913.1" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="91.0" y1="240.0" x2="1950.9" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1643.3" y1="240.0" x2="1988.7" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1860.6" y1="240.0" x2="2026.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1674.3" y1="240.0" x2="2064.4" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="560.3" y1="150.0" x2="2102.2" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1613.4" y1="150.0" x2="2140.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1837.5" y1="330.0" x2="60.0" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1950.9" y1="330.0" x2="106.2" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="286.9" y1="330.0" x2="152.4" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="60.0" y1="330.0" x2="198.7" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1118.9" y1="330.0" x2="244.9" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1308.0" y1="330.0" x2="291.1" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="816.4" y1="330.0" x2="337.3" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1610.5" y1="330.0" x2="383.6" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1799.6" y1="330.0" x2="429.8" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1043.3" y1="330.0" x2="476.0" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="173.5" y1="330.0" x2="522.2" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1232.4" y1="330.0" x2="568.4" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="60.0" y1="240.0" x2="614.7" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2140.0" y1="330.0" x2="660.9" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1459.3" y1="330.0" x2="707.1" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="513.8" y1="330.0" x2="753.3" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="215.2" y1="240.0" x2="799.6" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2026.5" y1="330.0" x2="845.8" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1534.9" y1="330.0" x2="892.0" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1988.7" y1="330.0" x2="938.2" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1345.8" y1="330.0" x2="984.4" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="362.5" y1="330.0" x2="1030.7" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1005.5" y1="330.0" x2="1076.9" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1837.5" y1="330.0" x2="1123.1" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1950.9" y1="330.0" x2="1169.3" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="286.9" y1="330.0" x2="1215.6" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="60.0" y1="330.0" x2="1261.8" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1118.9" y1="330.0" x2="1308.0" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1308.0" y1="330.0" x2="1354.2" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="816.4" y1="330.0" x2="1400.4" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1610.5" y1="330.0" x2="1446.7" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1799.6" y1="330.0" x2="1492.9" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1043.3" y1="330.0" x2="1539.1" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="173.5" y1="330.0" x2="1585.3" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1232.4" y1="330.0" x2="1631.6" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="60.0" y1="240.0" x2="1677.8" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2140.0" y1="330.0" x2="1724.0" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1459.3" y1="330.0" x2="1770.2" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="513.8" y1="330.0" x2="1816.4" y2="420.0" stroke="#c04040" stroke-width="2.5"/>
|
||||||
|
<line x1="215.2" y1="240.0" x2="1862.7" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2026.5" y1="330.0" x2="1908.9" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1534.9" y1="330.0" x2="1955.1" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1988.7" y1="330.0" x2="2001.3" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1345.8" y1="330.0" x2="2047.6" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="362.5" y1="330.0" x2="2093.8" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1005.5" y1="330.0" x2="2140.0" y2="420.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1816.4" y1="420.0" x2="60.0" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="244.9" y1="420.0" x2="116.2" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2140.0" y1="420.0" x2="172.4" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1261.8" y1="420.0" x2="228.6" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1308.0" y1="420.0" x2="284.9" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1837.5" y1="330.0" x2="341.1" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1950.9" y1="330.0" x2="397.3" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1215.6" y1="420.0" x2="453.5" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1400.4" y1="420.0" x2="509.7" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="291.1" y1="420.0" x2="565.9" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2047.6" y1="420.0" x2="622.2" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="286.9" y1="330.0" x2="678.4" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="614.7" y1="420.0" x2="734.6" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1677.8" y1="420.0" x2="790.8" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="60.0" y1="330.0" x2="847.0" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1118.9" y1="330.0" x2="903.2" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="60.0" y1="420.0" x2="959.5" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1123.1" y1="420.0" x2="1015.7" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="383.6" y1="420.0" x2="1071.9" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1816.4" y1="420.0" x2="1128.1" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="244.9" y1="420.0" x2="1184.3" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2140.0" y1="420.0" x2="1240.5" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1261.8" y1="420.0" x2="1296.8" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1308.0" y1="420.0" x2="1353.0" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1837.5" y1="330.0" x2="1409.2" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1950.9" y1="330.0" x2="1465.4" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1215.6" y1="420.0" x2="1521.6" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1400.4" y1="420.0" x2="1577.8" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="291.1" y1="420.0" x2="1634.1" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2047.6" y1="420.0" x2="1690.3" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="286.9" y1="330.0" x2="1746.5" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="614.7" y1="420.0" x2="1802.7" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1677.8" y1="420.0" x2="1858.9" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="60.0" y1="330.0" x2="1915.1" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1118.9" y1="330.0" x2="1971.4" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="60.0" y1="420.0" x2="2027.6" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1123.1" y1="420.0" x2="2083.8" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="383.6" y1="420.0" x2="2140.0" y2="510.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1816.4" y1="420.0" x2="60.0" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="172.4" y1="510.0" x2="127.1" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="734.6" y1="510.0" x2="194.2" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1184.3" y1="510.0" x2="261.3" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1971.4" y1="510.0" x2="328.4" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="244.9" y1="420.0" x2="395.5" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2140.0" y1="420.0" x2="462.6" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="228.6" y1="510.0" x2="529.7" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1261.8" y1="420.0" x2="596.8" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="903.2" y1="510.0" x2="663.9" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1308.0" y1="420.0" x2="731.0" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2027.6" y1="510.0" x2="798.1" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1577.8" y1="510.0" x2="865.2" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="565.9" y1="510.0" x2="932.3" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1837.5" y1="330.0" x2="999.4" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1950.9" y1="330.0" x2="1066.5" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1816.4" y1="420.0" x2="1133.5" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="172.4" y1="510.0" x2="1200.6" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="734.6" y1="510.0" x2="1267.7" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1184.3" y1="510.0" x2="1334.8" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1971.4" y1="510.0" x2="1401.9" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="244.9" y1="420.0" x2="1469.0" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2140.0" y1="420.0" x2="1536.1" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="228.6" y1="510.0" x2="1603.2" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1261.8" y1="420.0" x2="1670.3" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="903.2" y1="510.0" x2="1737.4" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1308.0" y1="420.0" x2="1804.5" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2027.6" y1="510.0" x2="1871.6" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1577.8" y1="510.0" x2="1938.7" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="565.9" y1="510.0" x2="2005.8" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1837.5" y1="330.0" x2="2072.9" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1950.9" y1="330.0" x2="2140.0" y2="600.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1816.4" y1="420.0" x2="60.0" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1200.6" y1="600.0" x2="143.2" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="172.4" y1="510.0" x2="226.4" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="734.6" y1="510.0" x2="309.6" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="261.3" y1="600.0" x2="392.8" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1184.3" y1="510.0" x2="476.0" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1971.4" y1="510.0" x2="559.2" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="244.9" y1="420.0" x2="642.4" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2140.0" y1="420.0" x2="725.6" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="596.8" y1="600.0" x2="808.8" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1603.2" y1="600.0" x2="892.0" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="228.6" y1="510.0" x2="975.2" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1261.8" y1="420.0" x2="1058.4" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1816.4" y1="420.0" x2="1141.6" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1200.6" y1="600.0" x2="1224.8" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="172.4" y1="510.0" x2="1308.0" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="734.6" y1="510.0" x2="1391.2" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="261.3" y1="600.0" x2="1474.4" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1184.3" y1="510.0" x2="1557.6" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1971.4" y1="510.0" x2="1640.8" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="244.9" y1="420.0" x2="1724.0" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2140.0" y1="420.0" x2="1807.2" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="596.8" y1="600.0" x2="1890.4" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1603.2" y1="600.0" x2="1973.6" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="228.6" y1="510.0" x2="2056.8" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1261.8" y1="420.0" x2="2140.0" y2="690.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<circle cx="60.0" cy="60.0" r="5" fill="#a04839" stroke="#333" stroke-width="0.5"><title>Id 1, Wert -959.0</title></circle>
|
||||||
|
<circle cx="113.3" cy="60.0" r="5" fill="#a84337" stroke="#333" stroke-width="0.5"><title>Id 2, Wert -985.9</title></circle>
|
||||||
|
<circle cx="166.7" cy="60.0" r="5" fill="#944e3b" stroke="#333" stroke-width="0.5"><title>Id 3, Wert -920.5</title></circle>
|
||||||
|
<circle cx="220.0" cy="60.0" r="5" fill="#a94237" stroke="#333" stroke-width="0.5"><title>Id 4, Wert -991.9</title></circle>
|
||||||
|
<circle cx="273.3" cy="60.0" r="5" fill="#7b5d40" stroke="#333" stroke-width="0.5"><title>Id 5, Wert -835.1</title></circle>
|
||||||
|
<circle cx="326.7" cy="60.0" r="5" fill="#9b4a3a" stroke="#333" stroke-width="0.5"><title>Id 6, Wert -945.0</title></circle>
|
||||||
|
<circle cx="380.0" cy="60.0" r="5" fill="#9f4839" stroke="#333" stroke-width="0.5"><title>Id 7, Wert -956.7</title></circle>
|
||||||
|
<circle cx="433.3" cy="60.0" r="5" fill="#a44638" stroke="#333" stroke-width="0.5"><title>Id 8, Wert -972.3</title></circle>
|
||||||
|
<circle cx="486.7" cy="60.0" r="5" fill="#c03633" stroke="#333" stroke-width="0.5"><title>Id 9, Wert -1067.6</title></circle>
|
||||||
|
<circle cx="540.0" cy="60.0" r="5" fill="#8f513c" stroke="#333" stroke-width="0.5"><title>Id 10, Wert -903.2</title></circle>
|
||||||
|
<circle cx="593.3" cy="60.0" r="5" fill="#7d5b3f" stroke="#333" stroke-width="0.5"><title>Id 11, Wert -842.3</title></circle>
|
||||||
|
<circle cx="646.7" cy="60.0" r="5" fill="#746141" stroke="#333" stroke-width="0.5"><title>Id 12, Wert -810.7</title></circle>
|
||||||
|
<circle cx="700.0" cy="60.0" r="5" fill="#765f41" stroke="#333" stroke-width="0.5"><title>Id 13, Wert -818.5</title></circle>
|
||||||
|
<circle cx="753.3" cy="60.0" r="5" fill="#6d6442" stroke="#333" stroke-width="0.5"><title>Id 14, Wert -789.3</title></circle>
|
||||||
|
<circle cx="806.7" cy="60.0" r="5" fill="#c83232" stroke="#333" stroke-width="0.5"><title>Id 15, Wert -1093.3</title></circle>
|
||||||
|
<circle cx="860.0" cy="60.0" r="5" fill="#686743" stroke="#333" stroke-width="0.5"><title>Id 16, Wert -772.5</title></circle>
|
||||||
|
<circle cx="913.3" cy="60.0" r="5" fill="#7f5a3f" stroke="#333" stroke-width="0.5"><title>Id 17, Wert -849.7</title></circle>
|
||||||
|
<circle cx="966.7" cy="60.0" r="5" fill="#785e40" stroke="#333" stroke-width="0.5"><title>Id 18, Wert -824.8</title></circle>
|
||||||
|
<circle cx="1020.0" cy="60.0" r="5" fill="#7f5a3f" stroke="#333" stroke-width="0.5"><title>Id 19, Wert -849.4</title></circle>
|
||||||
|
<circle cx="1073.3" cy="60.0" r="5" fill="#696643" stroke="#333" stroke-width="0.5"><title>Id 20, Wert -776.8</title></circle>
|
||||||
|
<circle cx="1126.7" cy="60.0" r="5" fill="#606b45" stroke="#333" stroke-width="0.5"><title>Id 21, Wert -746.5</title></circle>
|
||||||
|
<circle cx="1180.0" cy="60.0" r="5" fill="#706342" stroke="#333" stroke-width="0.5"><title>Id 22, Wert -798.5</title></circle>
|
||||||
|
<circle cx="1233.3" cy="60.0" r="5" fill="#7b5d40" stroke="#333" stroke-width="0.5"><title>Id 23, Wert -835.3</title></circle>
|
||||||
|
<circle cx="1286.7" cy="60.0" r="5" fill="#90503c" stroke="#333" stroke-width="0.5"><title>Id 24, Wert -908.0</title></circle>
|
||||||
|
<circle cx="1340.0" cy="60.0" r="5" fill="#9c4a3a" stroke="#333" stroke-width="0.5"><title>Id 25, Wert -946.0</title></circle>
|
||||||
|
<circle cx="1393.3" cy="60.0" r="5" fill="#5c6e46" stroke="#333" stroke-width="0.5"><title>Id 26, Wert -730.3</title></circle>
|
||||||
|
<circle cx="1446.7" cy="60.0" r="5" fill="#954e3b" stroke="#333" stroke-width="0.5"><title>Id 27, Wert -922.8</title></circle>
|
||||||
|
<circle cx="1500.0" cy="60.0" r="5" fill="#80593f" stroke="#333" stroke-width="0.5"><title>Id 28, Wert -854.2</title></circle>
|
||||||
|
<circle cx="1553.3" cy="60.0" r="5" fill="#8f513c" stroke="#333" stroke-width="0.5"><title>Id 29, Wert -904.8</title></circle>
|
||||||
|
<circle cx="1606.7" cy="60.0" r="5" fill="#954e3b" stroke="#333" stroke-width="0.5"><title>Id 30, Wert -922.3</title></circle>
|
||||||
|
<circle cx="1660.0" cy="60.0" r="5" fill="#a94337" stroke="#333" stroke-width="0.5"><title>Id 31, Wert -989.2</title></circle>
|
||||||
|
<circle cx="1713.3" cy="60.0" r="5" fill="#616b45" stroke="#333" stroke-width="0.5"><title>Id 32, Wert -747.7</title></circle>
|
||||||
|
<circle cx="1766.7" cy="60.0" r="5" fill="#a64538" stroke="#333" stroke-width="0.5"><title>Id 33, Wert -979.6</title></circle>
|
||||||
|
<circle cx="1820.0" cy="60.0" r="5" fill="#a84337" stroke="#333" stroke-width="0.5"><title>Id 34, Wert -987.6</title></circle>
|
||||||
|
<circle cx="1873.3" cy="60.0" r="5" fill="#b53c35" stroke="#333" stroke-width="0.5"><title>Id 35, Wert -1030.5</title></circle>
|
||||||
|
<circle cx="1926.7" cy="60.0" r="5" fill="#9d4a3a" stroke="#333" stroke-width="0.5"><title>Id 36, Wert -949.0</title></circle>
|
||||||
|
<circle cx="1980.0" cy="60.0" r="5" fill="#795e40" stroke="#333" stroke-width="0.5"><title>Id 37, Wert -828.0</title></circle>
|
||||||
|
<circle cx="2033.3" cy="60.0" r="5" fill="#7e5b3f" stroke="#333" stroke-width="0.5"><title>Id 38, Wert -846.7</title></circle>
|
||||||
|
<circle cx="2086.7" cy="60.0" r="7" fill="#626b45" stroke="#c04040" stroke-width="2"><title>Id 39, Wert -751.9</title></circle>
|
||||||
|
<circle cx="2140.0" cy="60.0" r="5" fill="#775f41" stroke="#333" stroke-width="0.5"><title>Id 40, Wert -821.5</title></circle>
|
||||||
|
<circle cx="60.0" cy="150.0" r="5" fill="#8c533d" stroke="#333" stroke-width="0.5"><title>Id 41, Wert -892.9</title></circle>
|
||||||
|
<circle cx="86.3" cy="150.0" r="5" fill="#805a3f" stroke="#333" stroke-width="0.5"><title>Id 42, Wert -852.3</title></circle>
|
||||||
|
<circle cx="112.7" cy="150.0" r="5" fill="#7d5c40" stroke="#333" stroke-width="0.5"><title>Id 43, Wert -842.0</title></circle>
|
||||||
|
<circle cx="139.0" cy="150.0" r="5" fill="#944e3b" stroke="#333" stroke-width="0.5"><title>Id 44, Wert -921.3</title></circle>
|
||||||
|
<circle cx="165.3" cy="150.0" r="5" fill="#706342" stroke="#333" stroke-width="0.5"><title>Id 45, Wert -799.9</title></circle>
|
||||||
|
<circle cx="191.6" cy="150.0" r="5" fill="#9d4a3a" stroke="#333" stroke-width="0.5"><title>Id 46, Wert -949.5</title></circle>
|
||||||
|
<circle cx="218.0" cy="150.0" r="5" fill="#8d523c" stroke="#333" stroke-width="0.5"><title>Id 47, Wert -897.9</title></circle>
|
||||||
|
<circle cx="244.3" cy="150.0" r="5" fill="#9a4b3a" stroke="#333" stroke-width="0.5"><title>Id 48, Wert -938.8</title></circle>
|
||||||
|
<circle cx="270.6" cy="150.0" r="5" fill="#a64438" stroke="#333" stroke-width="0.5"><title>Id 49, Wert -980.4</title></circle>
|
||||||
|
<circle cx="297.0" cy="150.0" r="5" fill="#6d6442" stroke="#333" stroke-width="0.5"><title>Id 50, Wert -789.5</title></circle>
|
||||||
|
<circle cx="323.3" cy="150.0" r="5" fill="#6d6442" stroke="#333" stroke-width="0.5"><title>Id 51, Wert -789.6</title></circle>
|
||||||
|
<circle cx="349.6" cy="150.0" r="5" fill="#606c45" stroke="#333" stroke-width="0.5"><title>Id 52, Wert -743.7</title></circle>
|
||||||
|
<circle cx="375.9" cy="150.0" r="5" fill="#676844" stroke="#333" stroke-width="0.5"><title>Id 53, Wert -767.0</title></circle>
|
||||||
|
<circle cx="402.3" cy="150.0" r="5" fill="#5d6e46" stroke="#333" stroke-width="0.5"><title>Id 54, Wert -733.7</title></circle>
|
||||||
|
<circle cx="428.6" cy="150.0" r="5" fill="#a04739" stroke="#333" stroke-width="0.5"><title>Id 55, Wert -962.0</title></circle>
|
||||||
|
<circle cx="454.9" cy="150.0" r="5" fill="#517448" stroke="#333" stroke-width="0.5"><title>Id 56, Wert -693.1</title></circle>
|
||||||
|
<circle cx="481.3" cy="150.0" r="5" fill="#6d6543" stroke="#333" stroke-width="0.5"><title>Id 57, Wert -787.6</title></circle>
|
||||||
|
<circle cx="507.6" cy="150.0" r="5" fill="#636a44" stroke="#333" stroke-width="0.5"><title>Id 58, Wert -756.7</title></circle>
|
||||||
|
<circle cx="533.9" cy="150.0" r="5" fill="#5c6e46" stroke="#333" stroke-width="0.5"><title>Id 59, Wert -732.1</title></circle>
|
||||||
|
<circle cx="560.3" cy="150.0" r="5" fill="#477a4a" stroke="#333" stroke-width="0.5"><title>Id 60, Wert -662.4</title></circle>
|
||||||
|
<circle cx="586.6" cy="150.0" r="5" fill="#6a6643" stroke="#333" stroke-width="0.5"><title>Id 61, Wert -779.6</title></circle>
|
||||||
|
<circle cx="612.9" cy="150.0" r="5" fill="#527448" stroke="#333" stroke-width="0.5"><title>Id 62, Wert -698.2</title></circle>
|
||||||
|
<circle cx="639.2" cy="150.0" r="5" fill="#686743" stroke="#333" stroke-width="0.5"><title>Id 63, Wert -772.5</title></circle>
|
||||||
|
<circle cx="665.6" cy="150.0" r="5" fill="#736141" stroke="#333" stroke-width="0.5"><title>Id 64, Wert -808.9</title></circle>
|
||||||
|
<circle cx="691.9" cy="150.0" r="5" fill="#7e5b3f" stroke="#333" stroke-width="0.5"><title>Id 65, Wert -845.8</title></circle>
|
||||||
|
<circle cx="718.2" cy="150.0" r="5" fill="#437c4a" stroke="#333" stroke-width="0.5"><title>Id 66, Wert -648.6</title></circle>
|
||||||
|
<circle cx="744.6" cy="150.0" r="5" fill="#775f41" stroke="#333" stroke-width="0.5"><title>Id 67, Wert -823.1</title></circle>
|
||||||
|
<circle cx="770.9" cy="150.0" r="5" fill="#616b45" stroke="#333" stroke-width="0.5"><title>Id 68, Wert -748.9</title></circle>
|
||||||
|
<circle cx="797.2" cy="150.0" r="5" fill="#795e40" stroke="#333" stroke-width="0.5"><title>Id 69, Wert -827.7</title></circle>
|
||||||
|
<circle cx="823.5" cy="150.0" r="5" fill="#6e6442" stroke="#333" stroke-width="0.5"><title>Id 70, Wert -793.0</title></circle>
|
||||||
|
<circle cx="849.9" cy="150.0" r="5" fill="#9b4a3a" stroke="#333" stroke-width="0.5"><title>Id 71, Wert -943.9</title></circle>
|
||||||
|
<circle cx="876.2" cy="150.0" r="5" fill="#527448" stroke="#333" stroke-width="0.5"><title>Id 72, Wert -696.9</title></circle>
|
||||||
|
<circle cx="902.5" cy="150.0" r="5" fill="#89553d" stroke="#333" stroke-width="0.5"><title>Id 73, Wert -881.8</title></circle>
|
||||||
|
<circle cx="928.9" cy="150.0" r="5" fill="#994c3a" stroke="#333" stroke-width="0.5"><title>Id 74, Wert -936.9</title></circle>
|
||||||
|
<circle cx="955.2" cy="150.0" r="5" fill="#a54538" stroke="#333" stroke-width="0.5"><title>Id 75, Wert -976.9</title></circle>
|
||||||
|
<circle cx="981.5" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 76, Wert -901.5</title></circle>
|
||||||
|
<circle cx="1007.8" cy="150.0" r="5" fill="#5e6d45" stroke="#333" stroke-width="0.5"><title>Id 77, Wert -737.7</title></circle>
|
||||||
|
<circle cx="1034.2" cy="150.0" r="5" fill="#775f41" stroke="#333" stroke-width="0.5"><title>Id 78, Wert -821.2</title></circle>
|
||||||
|
<circle cx="1060.5" cy="150.0" r="5" fill="#557247" stroke="#333" stroke-width="0.5"><title>Id 79, Wert -707.3</title></circle>
|
||||||
|
<circle cx="1086.8" cy="150.0" r="5" fill="#517448" stroke="#333" stroke-width="0.5"><title>Id 80, Wert -695.2</title></circle>
|
||||||
|
<circle cx="1113.2" cy="150.0" r="5" fill="#8d533d" stroke="#333" stroke-width="0.5"><title>Id 81, Wert -895.4</title></circle>
|
||||||
|
<circle cx="1139.5" cy="150.0" r="5" fill="#81593f" stroke="#333" stroke-width="0.5"><title>Id 82, Wert -856.3</title></circle>
|
||||||
|
<circle cx="1165.8" cy="150.0" r="5" fill="#84583e" stroke="#333" stroke-width="0.5"><title>Id 83, Wert -865.0</title></circle>
|
||||||
|
<circle cx="1192.2" cy="150.0" r="5" fill="#8b533d" stroke="#333" stroke-width="0.5"><title>Id 84, Wert -891.3</title></circle>
|
||||||
|
<circle cx="1218.5" cy="150.0" r="5" fill="#666844" stroke="#333" stroke-width="0.5"><title>Id 85, Wert -766.9</title></circle>
|
||||||
|
<circle cx="1244.8" cy="150.0" r="5" fill="#7b5c40" stroke="#333" stroke-width="0.5"><title>Id 86, Wert -837.5</title></circle>
|
||||||
|
<circle cx="1271.1" cy="150.0" r="5" fill="#7e5b3f" stroke="#333" stroke-width="0.5"><title>Id 87, Wert -846.5</title></circle>
|
||||||
|
<circle cx="1297.5" cy="150.0" r="5" fill="#86573e" stroke="#333" stroke-width="0.5"><title>Id 88, Wert -871.3</title></circle>
|
||||||
|
<circle cx="1323.8" cy="150.0" r="5" fill="#b43c35" stroke="#333" stroke-width="0.5"><title>Id 89, Wert -1028.5</title></circle>
|
||||||
|
<circle cx="1350.1" cy="150.0" r="5" fill="#6e6442" stroke="#333" stroke-width="0.5"><title>Id 90, Wert -793.5</title></circle>
|
||||||
|
<circle cx="1376.5" cy="150.0" r="5" fill="#616b45" stroke="#333" stroke-width="0.5"><title>Id 91, Wert -748.2</title></circle>
|
||||||
|
<circle cx="1402.8" cy="150.0" r="5" fill="#587046" stroke="#333" stroke-width="0.5"><title>Id 92, Wert -718.6</title></circle>
|
||||||
|
<circle cx="1429.1" cy="150.0" r="5" fill="#636a44" stroke="#333" stroke-width="0.5"><title>Id 93, Wert -756.5</title></circle>
|
||||||
|
<circle cx="1455.4" cy="150.0" r="5" fill="#616b45" stroke="#333" stroke-width="0.5"><title>Id 94, Wert -748.9</title></circle>
|
||||||
|
<circle cx="1481.8" cy="150.0" r="5" fill="#ab4137" stroke="#333" stroke-width="0.5"><title>Id 95, Wert -997.9</title></circle>
|
||||||
|
<circle cx="1508.1" cy="150.0" r="5" fill="#567247" stroke="#333" stroke-width="0.5"><title>Id 96, Wert -710.1</title></circle>
|
||||||
|
<circle cx="1534.4" cy="150.0" r="5" fill="#756041" stroke="#333" stroke-width="0.5"><title>Id 97, Wert -814.8</title></circle>
|
||||||
|
<circle cx="1560.8" cy="150.0" r="5" fill="#587046" stroke="#333" stroke-width="0.5"><title>Id 98, Wert -717.4</title></circle>
|
||||||
|
<circle cx="1587.1" cy="150.0" r="5" fill="#4f7548" stroke="#333" stroke-width="0.5"><title>Id 99, Wert -688.7</title></circle>
|
||||||
|
<circle cx="1613.4" cy="150.0" r="5" fill="#477a4a" stroke="#333" stroke-width="0.5"><title>Id 100, Wert -662.4</title></circle>
|
||||||
|
<circle cx="1639.7" cy="150.0" r="5" fill="#5a6f46" stroke="#333" stroke-width="0.5"><title>Id 101, Wert -726.5</title></circle>
|
||||||
|
<circle cx="1666.1" cy="150.0" r="5" fill="#507548" stroke="#333" stroke-width="0.5"><title>Id 102, Wert -691.2</title></circle>
|
||||||
|
<circle cx="1692.4" cy="150.0" r="5" fill="#6d6543" stroke="#333" stroke-width="0.5"><title>Id 103, Wert -787.7</title></circle>
|
||||||
|
<circle cx="1718.7" cy="150.0" r="5" fill="#726242" stroke="#333" stroke-width="0.5"><title>Id 104, Wert -805.3</title></circle>
|
||||||
|
<circle cx="1745.1" cy="150.0" r="5" fill="#8c533d" stroke="#333" stroke-width="0.5"><title>Id 105, Wert -893.3</title></circle>
|
||||||
|
<circle cx="1771.4" cy="150.0" r="5" fill="#577147" stroke="#333" stroke-width="0.5"><title>Id 106, Wert -715.1</title></circle>
|
||||||
|
<circle cx="1797.7" cy="150.0" r="5" fill="#8a543d" stroke="#333" stroke-width="0.5"><title>Id 107, Wert -885.5</title></circle>
|
||||||
|
<circle cx="1824.1" cy="150.0" r="5" fill="#83583e" stroke="#333" stroke-width="0.5"><title>Id 108, Wert -862.6</title></circle>
|
||||||
|
<circle cx="1850.4" cy="150.0" r="5" fill="#7a5d40" stroke="#333" stroke-width="0.5"><title>Id 109, Wert -831.0</title></circle>
|
||||||
|
<circle cx="1876.7" cy="150.0" r="5" fill="#86573e" stroke="#333" stroke-width="0.5"><title>Id 110, Wert -871.3</title></circle>
|
||||||
|
<circle cx="1903.0" cy="150.0" r="5" fill="#9d4939" stroke="#333" stroke-width="0.5"><title>Id 111, Wert -951.6</title></circle>
|
||||||
|
<circle cx="1929.4" cy="150.0" r="5" fill="#457b4a" stroke="#333" stroke-width="0.5"><title>Id 112, Wert -654.9</title></circle>
|
||||||
|
<circle cx="1955.7" cy="150.0" r="5" fill="#a64538" stroke="#333" stroke-width="0.5"><title>Id 113, Wert -979.4</title></circle>
|
||||||
|
<circle cx="1982.0" cy="150.0" r="5" fill="#83583e" stroke="#333" stroke-width="0.5"><title>Id 114, Wert -861.8</title></circle>
|
||||||
|
<circle cx="2008.4" cy="150.0" r="5" fill="#9d4939" stroke="#333" stroke-width="0.5"><title>Id 115, Wert -949.9</title></circle>
|
||||||
|
<circle cx="2034.7" cy="150.0" r="5" fill="#8d523c" stroke="#333" stroke-width="0.5"><title>Id 116, Wert -897.1</title></circle>
|
||||||
|
<circle cx="2061.0" cy="150.0" r="5" fill="#656944" stroke="#333" stroke-width="0.5"><title>Id 117, Wert -762.8</title></circle>
|
||||||
|
<circle cx="2087.3" cy="150.0" r="5" fill="#775f41" stroke="#333" stroke-width="0.5"><title>Id 118, Wert -821.3</title></circle>
|
||||||
|
<circle cx="2113.7" cy="150.0" r="7" fill="#4f7548" stroke="#c04040" stroke-width="2"><title>Id 119, Wert -689.0</title></circle>
|
||||||
|
<circle cx="2140.0" cy="150.0" r="5" fill="#517448" stroke="#333" stroke-width="0.5"><title>Id 120, Wert -693.1</title></circle>
|
||||||
|
<circle cx="60.0" cy="240.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 121, Wert -595.6</title></circle>
|
||||||
|
<circle cx="91.0" cy="240.0" r="5" fill="#467b4a" stroke="#333" stroke-width="0.5"><title>Id 122, Wert -656.3</title></circle>
|
||||||
|
<circle cx="122.1" cy="240.0" r="5" fill="#3b804c" stroke="#333" stroke-width="0.5"><title>Id 123, Wert -621.8</title></circle>
|
||||||
|
<circle cx="153.1" cy="240.0" r="5" fill="#407e4b" stroke="#333" stroke-width="0.5"><title>Id 124, Wert -636.7</title></circle>
|
||||||
|
<circle cx="184.2" cy="240.0" r="5" fill="#3d7f4b" stroke="#333" stroke-width="0.5"><title>Id 125, Wert -626.9</title></circle>
|
||||||
|
<circle cx="215.2" cy="240.0" r="5" fill="#35844d" stroke="#333" stroke-width="0.5"><title>Id 126, Wert -599.9</title></circle>
|
||||||
|
<circle cx="246.3" cy="240.0" r="5" fill="#507548" stroke="#333" stroke-width="0.5"><title>Id 127, Wert -691.6</title></circle>
|
||||||
|
<circle cx="277.3" cy="240.0" r="5" fill="#5a6f46" stroke="#333" stroke-width="0.5"><title>Id 128, Wert -724.1</title></circle>
|
||||||
|
<circle cx="308.4" cy="240.0" r="5" fill="#3f7e4b" stroke="#333" stroke-width="0.5"><title>Id 129, Wert -633.9</title></circle>
|
||||||
|
<circle cx="339.4" cy="240.0" r="5" fill="#5a6f46" stroke="#333" stroke-width="0.5"><title>Id 130, Wert -724.7</title></circle>
|
||||||
|
<circle cx="370.4" cy="240.0" r="5" fill="#457b4a" stroke="#333" stroke-width="0.5"><title>Id 131, Wert -654.9</title></circle>
|
||||||
|
<circle cx="401.5" cy="240.0" r="5" fill="#4a7849" stroke="#333" stroke-width="0.5"><title>Id 132, Wert -669.8</title></circle>
|
||||||
|
<circle cx="432.5" cy="240.0" r="5" fill="#567147" stroke="#333" stroke-width="0.5"><title>Id 133, Wert -711.9</title></circle>
|
||||||
|
<circle cx="463.6" cy="240.0" r="5" fill="#4b7849" stroke="#333" stroke-width="0.5"><title>Id 134, Wert -673.2</title></circle>
|
||||||
|
<circle cx="494.6" cy="240.0" r="5" fill="#547347" stroke="#333" stroke-width="0.5"><title>Id 135, Wert -703.9</title></circle>
|
||||||
|
<circle cx="525.7" cy="240.0" r="5" fill="#437c4a" stroke="#333" stroke-width="0.5"><title>Id 136, Wert -647.3</title></circle>
|
||||||
|
<circle cx="556.7" cy="240.0" r="5" fill="#517448" stroke="#333" stroke-width="0.5"><title>Id 137, Wert -695.2</title></circle>
|
||||||
|
<circle cx="587.8" cy="240.0" r="5" fill="#537347" stroke="#333" stroke-width="0.5"><title>Id 138, Wert -700.5</title></circle>
|
||||||
|
<circle cx="618.8" cy="240.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 139, Wert -677.0</title></circle>
|
||||||
|
<circle cx="649.9" cy="240.0" r="5" fill="#487949" stroke="#333" stroke-width="0.5"><title>Id 140, Wert -665.6</title></circle>
|
||||||
|
<circle cx="680.9" cy="240.0" r="5" fill="#5a6f46" stroke="#333" stroke-width="0.5"><title>Id 141, Wert -725.2</title></circle>
|
||||||
|
<circle cx="711.9" cy="240.0" r="5" fill="#507548" stroke="#333" stroke-width="0.5"><title>Id 142, Wert -690.5</title></circle>
|
||||||
|
<circle cx="743.0" cy="240.0" r="5" fill="#577147" stroke="#333" stroke-width="0.5"><title>Id 143, Wert -715.4</title></circle>
|
||||||
|
<circle cx="774.0" cy="240.0" r="5" fill="#626a44" stroke="#333" stroke-width="0.5"><title>Id 144, Wert -752.5</title></circle>
|
||||||
|
<circle cx="805.1" cy="240.0" r="5" fill="#4d7648" stroke="#333" stroke-width="0.5"><title>Id 145, Wert -680.9</title></circle>
|
||||||
|
<circle cx="836.1" cy="240.0" r="5" fill="#427c4a" stroke="#333" stroke-width="0.5"><title>Id 146, Wert -645.5</title></circle>
|
||||||
|
<circle cx="867.2" cy="240.0" r="5" fill="#4d7749" stroke="#333" stroke-width="0.5"><title>Id 147, Wert -679.7</title></circle>
|
||||||
|
<circle cx="898.2" cy="240.0" r="5" fill="#616b45" stroke="#333" stroke-width="0.5"><title>Id 148, Wert -748.6</title></circle>
|
||||||
|
<circle cx="929.3" cy="240.0" r="5" fill="#487949" stroke="#333" stroke-width="0.5"><title>Id 149, Wert -664.3</title></circle>
|
||||||
|
<circle cx="960.3" cy="240.0" r="5" fill="#457b4a" stroke="#333" stroke-width="0.5"><title>Id 150, Wert -653.7</title></circle>
|
||||||
|
<circle cx="991.3" cy="240.0" r="5" fill="#4b7849" stroke="#333" stroke-width="0.5"><title>Id 151, Wert -674.5</title></circle>
|
||||||
|
<circle cx="1022.4" cy="240.0" r="5" fill="#4e7648" stroke="#333" stroke-width="0.5"><title>Id 152, Wert -683.8</title></circle>
|
||||||
|
<circle cx="1053.4" cy="240.0" r="5" fill="#686743" stroke="#333" stroke-width="0.5"><title>Id 153, Wert -771.8</title></circle>
|
||||||
|
<circle cx="1084.5" cy="240.0" r="5" fill="#547247" stroke="#333" stroke-width="0.5"><title>Id 154, Wert -705.9</title></circle>
|
||||||
|
<circle cx="1115.5" cy="240.0" r="5" fill="#3c804c" stroke="#333" stroke-width="0.5"><title>Id 155, Wert -622.4</title></circle>
|
||||||
|
<circle cx="1146.6" cy="240.0" r="5" fill="#457b4a" stroke="#333" stroke-width="0.5"><title>Id 156, Wert -654.6</title></circle>
|
||||||
|
<circle cx="1177.6" cy="240.0" r="5" fill="#407e4b" stroke="#333" stroke-width="0.5"><title>Id 157, Wert -636.7</title></circle>
|
||||||
|
<circle cx="1208.7" cy="240.0" r="5" fill="#487949" stroke="#333" stroke-width="0.5"><title>Id 158, Wert -663.4</title></circle>
|
||||||
|
<circle cx="1239.7" cy="240.0" r="5" fill="#4f7548" stroke="#333" stroke-width="0.5"><title>Id 159, Wert -687.9</title></circle>
|
||||||
|
<circle cx="1270.7" cy="240.0" r="7" fill="#417d4b" stroke="#c04040" stroke-width="2"><title>Id 160, Wert -642.0</title></circle>
|
||||||
|
<circle cx="1301.8" cy="240.0" r="5" fill="#487949" stroke="#333" stroke-width="0.5"><title>Id 161, Wert -664.6</title></circle>
|
||||||
|
<circle cx="1332.8" cy="240.0" r="5" fill="#3f7e4b" stroke="#333" stroke-width="0.5"><title>Id 162, Wert -634.2</title></circle>
|
||||||
|
<circle cx="1363.9" cy="240.0" r="5" fill="#4a7849" stroke="#333" stroke-width="0.5"><title>Id 163, Wert -669.8</title></circle>
|
||||||
|
<circle cx="1394.9" cy="240.0" r="5" fill="#3d804c" stroke="#333" stroke-width="0.5"><title>Id 164, Wert -625.8</title></circle>
|
||||||
|
<circle cx="1426.0" cy="240.0" r="5" fill="#3f7f4b" stroke="#333" stroke-width="0.5"><title>Id 165, Wert -632.6</title></circle>
|
||||||
|
<circle cx="1457.0" cy="240.0" r="5" fill="#3f7e4b" stroke="#333" stroke-width="0.5"><title>Id 166, Wert -634.8</title></circle>
|
||||||
|
<circle cx="1488.1" cy="240.0" r="5" fill="#567147" stroke="#333" stroke-width="0.5"><title>Id 167, Wert -711.3</title></circle>
|
||||||
|
<circle cx="1519.1" cy="240.0" r="5" fill="#447c4a" stroke="#333" stroke-width="0.5"><title>Id 168, Wert -650.2</title></circle>
|
||||||
|
<circle cx="1550.1" cy="240.0" r="5" fill="#547347" stroke="#333" stroke-width="0.5"><title>Id 169, Wert -703.9</title></circle>
|
||||||
|
<circle cx="1581.2" cy="240.0" r="5" fill="#437c4a" stroke="#333" stroke-width="0.5"><title>Id 170, Wert -647.3</title></circle>
|
||||||
|
<circle cx="1612.2" cy="240.0" r="5" fill="#527448" stroke="#333" stroke-width="0.5"><title>Id 171, Wert -696.9</title></circle>
|
||||||
|
<circle cx="1643.3" cy="240.0" r="5" fill="#467b4a" stroke="#333" stroke-width="0.5"><title>Id 172, Wert -656.3</title></circle>
|
||||||
|
<circle cx="1674.3" cy="240.0" r="5" fill="#477a4a" stroke="#333" stroke-width="0.5"><title>Id 173, Wert -662.3</title></circle>
|
||||||
|
<circle cx="1705.4" cy="240.0" r="5" fill="#4f7548" stroke="#333" stroke-width="0.5"><title>Id 174, Wert -688.7</title></circle>
|
||||||
|
<circle cx="1736.4" cy="240.0" r="5" fill="#4e7648" stroke="#333" stroke-width="0.5"><title>Id 175, Wert -683.8</title></circle>
|
||||||
|
<circle cx="1767.5" cy="240.0" r="5" fill="#656944" stroke="#333" stroke-width="0.5"><title>Id 176, Wert -760.6</title></circle>
|
||||||
|
<circle cx="1798.5" cy="240.0" r="5" fill="#497949" stroke="#333" stroke-width="0.5"><title>Id 177, Wert -666.4</title></circle>
|
||||||
|
<circle cx="1829.6" cy="240.0" r="5" fill="#5b6e46" stroke="#333" stroke-width="0.5"><title>Id 178, Wert -729.7</title></circle>
|
||||||
|
<circle cx="1860.6" cy="240.0" r="5" fill="#477a4a" stroke="#333" stroke-width="0.5"><title>Id 179, Wert -661.1</title></circle>
|
||||||
|
<circle cx="1891.6" cy="240.0" r="5" fill="#5a6f46" stroke="#333" stroke-width="0.5"><title>Id 180, Wert -725.9</title></circle>
|
||||||
|
<circle cx="1922.7" cy="240.0" r="5" fill="#4e7648" stroke="#333" stroke-width="0.5"><title>Id 181, Wert -683.8</title></circle>
|
||||||
|
<circle cx="1953.7" cy="240.0" r="5" fill="#517448" stroke="#333" stroke-width="0.5"><title>Id 182, Wert -693.8</title></circle>
|
||||||
|
<circle cx="1984.8" cy="240.0" r="5" fill="#507548" stroke="#333" stroke-width="0.5"><title>Id 183, Wert -690.9</title></circle>
|
||||||
|
<circle cx="2015.8" cy="240.0" r="5" fill="#5a6f46" stroke="#333" stroke-width="0.5"><title>Id 184, Wert -724.5</title></circle>
|
||||||
|
<circle cx="2046.9" cy="240.0" r="5" fill="#4a7849" stroke="#333" stroke-width="0.5"><title>Id 185, Wert -671.5</title></circle>
|
||||||
|
<circle cx="2077.9" cy="240.0" r="5" fill="#646944" stroke="#333" stroke-width="0.5"><title>Id 186, Wert -758.6</title></circle>
|
||||||
|
<circle cx="2109.0" cy="240.0" r="5" fill="#537347" stroke="#333" stroke-width="0.5"><title>Id 187, Wert -702.3</title></circle>
|
||||||
|
<circle cx="2140.0" cy="240.0" r="5" fill="#487949" stroke="#333" stroke-width="0.5"><title>Id 188, Wert -664.5</title></circle>
|
||||||
|
<circle cx="60.0" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 189, Wert -569.7</title></circle>
|
||||||
|
<circle cx="97.8" cy="330.0" r="5" fill="#457b4a" stroke="#333" stroke-width="0.5"><title>Id 190, Wert -653.6</title></circle>
|
||||||
|
<circle cx="135.6" cy="330.0" r="5" fill="#3b804c" stroke="#333" stroke-width="0.5"><title>Id 191, Wert -620.8</title></circle>
|
||||||
|
<circle cx="173.5" cy="330.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 192, Wert -595.5</title></circle>
|
||||||
|
<circle cx="211.3" cy="330.0" r="5" fill="#3e7f4b" stroke="#333" stroke-width="0.5"><title>Id 193, Wert -629.6</title></circle>
|
||||||
|
<circle cx="249.1" cy="330.0" r="5" fill="#3d7f4b" stroke="#333" stroke-width="0.5"><title>Id 194, Wert -626.7</title></circle>
|
||||||
|
<circle cx="286.9" cy="330.0" r="5" fill="#2b894f" stroke="#333" stroke-width="0.5"><title>Id 195, Wert -568.2</title></circle>
|
||||||
|
<circle cx="324.7" cy="330.0" r="5" fill="#3f7e4b" stroke="#333" stroke-width="0.5"><title>Id 196, Wert -633.8</title></circle>
|
||||||
|
<circle cx="362.5" cy="330.0" r="5" fill="#37834d" stroke="#333" stroke-width="0.5"><title>Id 197, Wert -608.1</title></circle>
|
||||||
|
<circle cx="400.4" cy="330.0" r="5" fill="#3c804c" stroke="#333" stroke-width="0.5"><title>Id 198, Wert -622.3</title></circle>
|
||||||
|
<circle cx="438.2" cy="330.0" r="5" fill="#407e4b" stroke="#333" stroke-width="0.5"><title>Id 199, Wert -636.7</title></circle>
|
||||||
|
<circle cx="476.0" cy="330.0" r="5" fill="#407e4b" stroke="#333" stroke-width="0.5"><title>Id 200, Wert -636.8</title></circle>
|
||||||
|
<circle cx="513.8" cy="330.0" r="7" fill="#35844d" stroke="#c04040" stroke-width="2"><title>Id 201, Wert -599.9</title></circle>
|
||||||
|
<circle cx="551.6" cy="330.0" r="5" fill="#427c4a" stroke="#333" stroke-width="0.5"><title>Id 202, Wert -645.7</title></circle>
|
||||||
|
<circle cx="589.5" cy="330.0" r="5" fill="#3b804c" stroke="#333" stroke-width="0.5"><title>Id 203, Wert -621.3</title></circle>
|
||||||
|
<circle cx="627.3" cy="330.0" r="5" fill="#38824c" stroke="#333" stroke-width="0.5"><title>Id 204, Wert -611.1</title></circle>
|
||||||
|
<circle cx="665.1" cy="330.0" r="5" fill="#3c804c" stroke="#333" stroke-width="0.5"><title>Id 205, Wert -622.4</title></circle>
|
||||||
|
<circle cx="702.9" cy="330.0" r="5" fill="#3c804c" stroke="#333" stroke-width="0.5"><title>Id 206, Wert -625.4</title></circle>
|
||||||
|
<circle cx="740.7" cy="330.0" r="5" fill="#457b4a" stroke="#333" stroke-width="0.5"><title>Id 207, Wert -653.7</title></circle>
|
||||||
|
<circle cx="778.5" cy="330.0" r="5" fill="#3e7f4b" stroke="#333" stroke-width="0.5"><title>Id 208, Wert -631.8</title></circle>
|
||||||
|
<circle cx="816.4" cy="330.0" r="5" fill="#32854d" stroke="#333" stroke-width="0.5"><title>Id 209, Wert -591.5</title></circle>
|
||||||
|
<circle cx="854.2" cy="330.0" r="5" fill="#3f7e4b" stroke="#333" stroke-width="0.5"><title>Id 210, Wert -634.3</title></circle>
|
||||||
|
<circle cx="892.0" cy="330.0" r="5" fill="#457b4a" stroke="#333" stroke-width="0.5"><title>Id 211, Wert -654.9</title></circle>
|
||||||
|
<circle cx="929.8" cy="330.0" r="5" fill="#3e7f4b" stroke="#333" stroke-width="0.5"><title>Id 212, Wert -630.4</title></circle>
|
||||||
|
<circle cx="967.6" cy="330.0" r="5" fill="#3d7f4b" stroke="#333" stroke-width="0.5"><title>Id 213, Wert -628.8</title></circle>
|
||||||
|
<circle cx="1005.5" cy="330.0" r="5" fill="#38824c" stroke="#333" stroke-width="0.5"><title>Id 214, Wert -610.2</title></circle>
|
||||||
|
<circle cx="1043.3" cy="330.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 215, Wert -594.8</title></circle>
|
||||||
|
<circle cx="1081.1" cy="330.0" r="5" fill="#407e4b" stroke="#333" stroke-width="0.5"><title>Id 216, Wert -637.8</title></circle>
|
||||||
|
<circle cx="1118.9" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 217, Wert -569.7</title></circle>
|
||||||
|
<circle cx="1156.7" cy="330.0" r="5" fill="#3c804c" stroke="#333" stroke-width="0.5"><title>Id 218, Wert -623.6</title></circle>
|
||||||
|
<circle cx="1194.5" cy="330.0" r="5" fill="#437c4a" stroke="#333" stroke-width="0.5"><title>Id 219, Wert -647.7</title></circle>
|
||||||
|
<circle cx="1232.4" cy="330.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 220, Wert -595.5</title></circle>
|
||||||
|
<circle cx="1270.2" cy="330.0" r="5" fill="#457b4a" stroke="#333" stroke-width="0.5"><title>Id 221, Wert -652.9</title></circle>
|
||||||
|
<circle cx="1308.0" cy="330.0" r="5" fill="#31864e" stroke="#333" stroke-width="0.5"><title>Id 222, Wert -585.7</title></circle>
|
||||||
|
<circle cx="1345.8" cy="330.0" r="5" fill="#37834d" stroke="#333" stroke-width="0.5"><title>Id 223, Wert -607.9</title></circle>
|
||||||
|
<circle cx="1383.6" cy="330.0" r="5" fill="#38824c" stroke="#333" stroke-width="0.5"><title>Id 224, Wert -610.9</title></circle>
|
||||||
|
<circle cx="1421.5" cy="330.0" r="5" fill="#477a4a" stroke="#333" stroke-width="0.5"><title>Id 225, Wert -661.3</title></circle>
|
||||||
|
<circle cx="1459.3" cy="330.0" r="5" fill="#34844d" stroke="#333" stroke-width="0.5"><title>Id 226, Wert -596.9</title></circle>
|
||||||
|
<circle cx="1497.1" cy="330.0" r="5" fill="#38824c" stroke="#333" stroke-width="0.5"><title>Id 227, Wert -610.8</title></circle>
|
||||||
|
<circle cx="1534.9" cy="330.0" r="5" fill="#35844d" stroke="#333" stroke-width="0.5"><title>Id 228, Wert -601.8</title></circle>
|
||||||
|
<circle cx="1572.7" cy="330.0" r="5" fill="#4f7548" stroke="#333" stroke-width="0.5"><title>Id 229, Wert -689.0</title></circle>
|
||||||
|
<circle cx="1610.5" cy="330.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 230, Wert -592.8</title></circle>
|
||||||
|
<circle cx="1648.4" cy="330.0" r="5" fill="#3b804c" stroke="#333" stroke-width="0.5"><title>Id 231, Wert -621.3</title></circle>
|
||||||
|
<circle cx="1686.2" cy="330.0" r="5" fill="#437c4a" stroke="#333" stroke-width="0.5"><title>Id 232, Wert -647.2</title></circle>
|
||||||
|
<circle cx="1724.0" cy="330.0" r="5" fill="#3c804c" stroke="#333" stroke-width="0.5"><title>Id 233, Wert -622.6</title></circle>
|
||||||
|
<circle cx="1761.8" cy="330.0" r="5" fill="#3c804c" stroke="#333" stroke-width="0.5"><title>Id 234, Wert -625.4</title></circle>
|
||||||
|
<circle cx="1799.6" cy="330.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 235, Wert -594.3</title></circle>
|
||||||
|
<circle cx="1837.5" cy="330.0" r="5" fill="#2a8a4f" stroke="#333" stroke-width="0.5"><title>Id 236, Wert -564.7</title></circle>
|
||||||
|
<circle cx="1875.3" cy="330.0" r="5" fill="#467b4a" stroke="#333" stroke-width="0.5"><title>Id 237, Wert -656.3</title></circle>
|
||||||
|
<circle cx="1913.1" cy="330.0" r="5" fill="#457b4a" stroke="#333" stroke-width="0.5"><title>Id 238, Wert -654.0</title></circle>
|
||||||
|
<circle cx="1950.9" cy="330.0" r="5" fill="#2a8a4f" stroke="#333" stroke-width="0.5"><title>Id 239, Wert -564.7</title></circle>
|
||||||
|
<circle cx="1988.7" cy="330.0" r="5" fill="#36834d" stroke="#333" stroke-width="0.5"><title>Id 240, Wert -603.5</title></circle>
|
||||||
|
<circle cx="2026.5" cy="330.0" r="5" fill="#35844d" stroke="#333" stroke-width="0.5"><title>Id 241, Wert -601.8</title></circle>
|
||||||
|
<circle cx="2064.4" cy="330.0" r="5" fill="#38824c" stroke="#333" stroke-width="0.5"><title>Id 242, Wert -610.2</title></circle>
|
||||||
|
<circle cx="2102.2" cy="330.0" r="5" fill="#407e4b" stroke="#333" stroke-width="0.5"><title>Id 243, Wert -637.8</title></circle>
|
||||||
|
<circle cx="2140.0" cy="330.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 244, Wert -595.6</title></circle>
|
||||||
|
<circle cx="60.0" cy="420.0" r="5" fill="#2e884e" stroke="#333" stroke-width="0.5"><title>Id 245, Wert -576.5</title></circle>
|
||||||
|
<circle cx="106.2" cy="420.0" r="5" fill="#35844d" stroke="#333" stroke-width="0.5"><title>Id 246, Wert -598.8</title></circle>
|
||||||
|
<circle cx="152.4" cy="420.0" r="5" fill="#31864e" stroke="#333" stroke-width="0.5"><title>Id 247, Wert -588.2</title></circle>
|
||||||
|
<circle cx="198.7" cy="420.0" r="5" fill="#3d7f4b" stroke="#333" stroke-width="0.5"><title>Id 248, Wert -628.0</title></circle>
|
||||||
|
<circle cx="244.9" cy="420.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 249, Wert -555.3</title></circle>
|
||||||
|
<circle cx="291.1" cy="420.0" r="5" fill="#2b894f" stroke="#333" stroke-width="0.5"><title>Id 250, Wert -567.8</title></circle>
|
||||||
|
<circle cx="337.3" cy="420.0" r="5" fill="#32854d" stroke="#333" stroke-width="0.5"><title>Id 251, Wert -591.5</title></circle>
|
||||||
|
<circle cx="383.6" cy="420.0" r="5" fill="#2f874e" stroke="#333" stroke-width="0.5"><title>Id 252, Wert -579.3</title></circle>
|
||||||
|
<circle cx="429.8" cy="420.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 253, Wert -594.3</title></circle>
|
||||||
|
<circle cx="476.0" cy="420.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 254, Wert -595.9</title></circle>
|
||||||
|
<circle cx="522.2" cy="420.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 255, Wert -595.5</title></circle>
|
||||||
|
<circle cx="568.4" cy="420.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 256, Wert -595.5</title></circle>
|
||||||
|
<circle cx="614.7" cy="420.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 257, Wert -569.7</title></circle>
|
||||||
|
<circle cx="660.9" cy="420.0" r="5" fill="#3c804c" stroke="#333" stroke-width="0.5"><title>Id 258, Wert -622.7</title></circle>
|
||||||
|
<circle cx="707.1" cy="420.0" r="5" fill="#38824c" stroke="#333" stroke-width="0.5"><title>Id 259, Wert -609.3</title></circle>
|
||||||
|
<circle cx="753.3" cy="420.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 260, Wert -581.9</title></circle>
|
||||||
|
<circle cx="799.6" cy="420.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 261, Wert -581.9</title></circle>
|
||||||
|
<circle cx="845.8" cy="420.0" r="5" fill="#32864e" stroke="#333" stroke-width="0.5"><title>Id 262, Wert -589.6</title></circle>
|
||||||
|
<circle cx="892.0" cy="420.0" r="5" fill="#36844d" stroke="#333" stroke-width="0.5"><title>Id 263, Wert -602.4</title></circle>
|
||||||
|
<circle cx="938.2" cy="420.0" r="5" fill="#36844d" stroke="#333" stroke-width="0.5"><title>Id 264, Wert -602.2</title></circle>
|
||||||
|
<circle cx="984.4" cy="420.0" r="5" fill="#37834d" stroke="#333" stroke-width="0.5"><title>Id 265, Wert -607.9</title></circle>
|
||||||
|
<circle cx="1030.7" cy="420.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 266, Wert -583.1</title></circle>
|
||||||
|
<circle cx="1076.9" cy="420.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 267, Wert -583.2</title></circle>
|
||||||
|
<circle cx="1123.1" cy="420.0" r="5" fill="#2e884e" stroke="#333" stroke-width="0.5"><title>Id 268, Wert -576.5</title></circle>
|
||||||
|
<circle cx="1169.3" cy="420.0" r="5" fill="#31864e" stroke="#333" stroke-width="0.5"><title>Id 269, Wert -588.2</title></circle>
|
||||||
|
<circle cx="1215.6" cy="420.0" r="5" fill="#2b8a4f" stroke="#333" stroke-width="0.5"><title>Id 270, Wert -565.5</title></circle>
|
||||||
|
<circle cx="1261.8" cy="420.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 271, Wert -558.2</title></circle>
|
||||||
|
<circle cx="1308.0" cy="420.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 272, Wert -558.3</title></circle>
|
||||||
|
<circle cx="1354.2" cy="420.0" r="5" fill="#3b814c" stroke="#333" stroke-width="0.5"><title>Id 273, Wert -619.5</title></circle>
|
||||||
|
<circle cx="1400.4" cy="420.0" r="5" fill="#2b8a4f" stroke="#333" stroke-width="0.5"><title>Id 274, Wert -565.5</title></circle>
|
||||||
|
<circle cx="1446.7" cy="420.0" r="5" fill="#2f874e" stroke="#333" stroke-width="0.5"><title>Id 275, Wert -579.3</title></circle>
|
||||||
|
<circle cx="1492.9" cy="420.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 276, Wert -594.3</title></circle>
|
||||||
|
<circle cx="1539.1" cy="420.0" r="5" fill="#3b804c" stroke="#333" stroke-width="0.5"><title>Id 277, Wert -621.9</title></circle>
|
||||||
|
<circle cx="1585.3" cy="420.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 278, Wert -595.5</title></circle>
|
||||||
|
<circle cx="1631.6" cy="420.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 279, Wert -595.5</title></circle>
|
||||||
|
<circle cx="1677.8" cy="420.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 280, Wert -569.7</title></circle>
|
||||||
|
<circle cx="1724.0" cy="420.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 281, Wert -596.7</title></circle>
|
||||||
|
<circle cx="1770.2" cy="420.0" r="5" fill="#38824c" stroke="#333" stroke-width="0.5"><title>Id 282, Wert -609.3</title></circle>
|
||||||
|
<circle cx="1816.4" cy="420.0" r="7" fill="#288c50" stroke="#c04040" stroke-width="2"><title>Id 283, Wert -554.9</title></circle>
|
||||||
|
<circle cx="1862.7" cy="420.0" r="5" fill="#30864e" stroke="#333" stroke-width="0.5"><title>Id 284, Wert -584.9</title></circle>
|
||||||
|
<circle cx="1908.9" cy="420.0" r="5" fill="#3d7f4b" stroke="#333" stroke-width="0.5"><title>Id 285, Wert -628.8</title></circle>
|
||||||
|
<circle cx="1955.1" cy="420.0" r="5" fill="#35844d" stroke="#333" stroke-width="0.5"><title>Id 286, Wert -601.8</title></circle>
|
||||||
|
<circle cx="2001.3" cy="420.0" r="5" fill="#36834d" stroke="#333" stroke-width="0.5"><title>Id 287, Wert -603.5</title></circle>
|
||||||
|
<circle cx="2047.6" cy="420.0" r="5" fill="#2b894f" stroke="#333" stroke-width="0.5"><title>Id 288, Wert -568.2</title></circle>
|
||||||
|
<circle cx="2093.8" cy="420.0" r="5" fill="#38824c" stroke="#333" stroke-width="0.5"><title>Id 289, Wert -610.5</title></circle>
|
||||||
|
<circle cx="2140.0" cy="420.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 290, Wert -557.2</title></circle>
|
||||||
|
<circle cx="60.0" cy="510.0" r="5" fill="#32864e" stroke="#333" stroke-width="0.5"><title>Id 291, Wert -590.3</title></circle>
|
||||||
|
<circle cx="116.2" cy="510.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 292, Wert -592.3</title></circle>
|
||||||
|
<circle cx="172.4" cy="510.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 293, Wert -555.1</title></circle>
|
||||||
|
<circle cx="228.6" cy="510.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 294, Wert -558.2</title></circle>
|
||||||
|
<circle cx="284.9" cy="510.0" r="5" fill="#39814c" stroke="#333" stroke-width="0.5"><title>Id 295, Wert -615.3</title></circle>
|
||||||
|
<circle cx="341.1" cy="510.0" r="5" fill="#36844d" stroke="#333" stroke-width="0.5"><title>Id 296, Wert -602.2</title></circle>
|
||||||
|
<circle cx="397.3" cy="510.0" r="5" fill="#39814c" stroke="#333" stroke-width="0.5"><title>Id 297, Wert -615.3</title></circle>
|
||||||
|
<circle cx="453.5" cy="510.0" r="5" fill="#2b894f" stroke="#333" stroke-width="0.5"><title>Id 298, Wert -567.0</title></circle>
|
||||||
|
<circle cx="509.7" cy="510.0" r="5" fill="#31864e" stroke="#333" stroke-width="0.5"><title>Id 299, Wert -588.2</title></circle>
|
||||||
|
<circle cx="565.9" cy="510.0" r="5" fill="#2a8a4f" stroke="#333" stroke-width="0.5"><title>Id 300, Wert -564.3</title></circle>
|
||||||
|
<circle cx="622.2" cy="510.0" r="5" fill="#2b8a4f" stroke="#333" stroke-width="0.5"><title>Id 301, Wert -565.5</title></circle>
|
||||||
|
<circle cx="678.4" cy="510.0" r="5" fill="#2b8a4f" stroke="#333" stroke-width="0.5"><title>Id 302, Wert -565.5</title></circle>
|
||||||
|
<circle cx="734.6" cy="510.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 303, Wert -555.2</title></circle>
|
||||||
|
<circle cx="790.8" cy="510.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 304, Wert -595.6</title></circle>
|
||||||
|
<circle cx="847.0" cy="510.0" r="5" fill="#3b804c" stroke="#333" stroke-width="0.5"><title>Id 305, Wert -621.9</title></circle>
|
||||||
|
<circle cx="903.2" cy="510.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 306, Wert -558.3</title></circle>
|
||||||
|
<circle cx="959.5" cy="510.0" r="5" fill="#32864e" stroke="#333" stroke-width="0.5"><title>Id 307, Wert -589.6</title></circle>
|
||||||
|
<circle cx="1015.7" cy="510.0" r="5" fill="#32864e" stroke="#333" stroke-width="0.5"><title>Id 308, Wert -589.6</title></circle>
|
||||||
|
<circle cx="1071.9" cy="510.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 309, Wert -592.9</title></circle>
|
||||||
|
<circle cx="1128.1" cy="510.0" r="5" fill="#2f874e" stroke="#333" stroke-width="0.5"><title>Id 310, Wert -581.8</title></circle>
|
||||||
|
<circle cx="1184.3" cy="510.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 311, Wert -555.3</title></circle>
|
||||||
|
<circle cx="1240.5" cy="510.0" r="5" fill="#38824c" stroke="#333" stroke-width="0.5"><title>Id 312, Wert -609.2</title></circle>
|
||||||
|
<circle cx="1296.8" cy="510.0" r="5" fill="#39814c" stroke="#333" stroke-width="0.5"><title>Id 313, Wert -615.2</title></circle>
|
||||||
|
<circle cx="1353.0" cy="510.0" r="5" fill="#30864e" stroke="#333" stroke-width="0.5"><title>Id 314, Wert -585.2</title></circle>
|
||||||
|
<circle cx="1409.2" cy="510.0" r="5" fill="#2e884e" stroke="#333" stroke-width="0.5"><title>Id 315, Wert -576.5</title></circle>
|
||||||
|
<circle cx="1465.4" cy="510.0" r="5" fill="#35844d" stroke="#333" stroke-width="0.5"><title>Id 316, Wert -598.8</title></circle>
|
||||||
|
<circle cx="1521.6" cy="510.0" r="5" fill="#2b894f" stroke="#333" stroke-width="0.5"><title>Id 317, Wert -567.0</title></circle>
|
||||||
|
<circle cx="1577.8" cy="510.0" r="5" fill="#2a8a4f" stroke="#333" stroke-width="0.5"><title>Id 318, Wert -564.0</title></circle>
|
||||||
|
<circle cx="1634.1" cy="510.0" r="5" fill="#32854d" stroke="#333" stroke-width="0.5"><title>Id 319, Wert -591.2</title></circle>
|
||||||
|
<circle cx="1690.3" cy="510.0" r="5" fill="#39824c" stroke="#333" stroke-width="0.5"><title>Id 320, Wert -614.3</title></circle>
|
||||||
|
<circle cx="1746.5" cy="510.0" r="5" fill="#2b8a4f" stroke="#333" stroke-width="0.5"><title>Id 321, Wert -565.5</title></circle>
|
||||||
|
<circle cx="1802.7" cy="510.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 322, Wert -595.6</title></circle>
|
||||||
|
<circle cx="1858.9" cy="510.0" r="5" fill="#31864e" stroke="#333" stroke-width="0.5"><title>Id 323, Wert -586.8</title></circle>
|
||||||
|
<circle cx="1915.1" cy="510.0" r="5" fill="#31864e" stroke="#333" stroke-width="0.5"><title>Id 324, Wert -587.9</title></circle>
|
||||||
|
<circle cx="1971.4" cy="510.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 325, Wert -555.3</title></circle>
|
||||||
|
<circle cx="2027.6" cy="510.0" r="5" fill="#2a8a4f" stroke="#333" stroke-width="0.5"><title>Id 326, Wert -562.7</title></circle>
|
||||||
|
<circle cx="2083.8" cy="510.0" r="5" fill="#32864e" stroke="#333" stroke-width="0.5"><title>Id 327, Wert -589.6</title></circle>
|
||||||
|
<circle cx="2140.0" cy="510.0" r="5" fill="#2f874e" stroke="#333" stroke-width="0.5"><title>Id 328, Wert -578.9</title></circle>
|
||||||
|
<circle cx="60.0" cy="600.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 329, Wert -558.2</title></circle>
|
||||||
|
<circle cx="127.1" cy="600.0" r="5" fill="#3b814c" stroke="#333" stroke-width="0.5"><title>Id 330, Wert -618.9</title></circle>
|
||||||
|
<circle cx="194.2" cy="600.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 331, Wert -592.2</title></circle>
|
||||||
|
<circle cx="261.3" cy="600.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 332, Wert -555.3</title></circle>
|
||||||
|
<circle cx="328.4" cy="600.0" r="5" fill="#36834d" stroke="#333" stroke-width="0.5"><title>Id 333, Wert -602.8</title></circle>
|
||||||
|
<circle cx="395.5" cy="600.0" r="5" fill="#38824c" stroke="#333" stroke-width="0.5"><title>Id 334, Wert -611.6</title></circle>
|
||||||
|
<circle cx="462.6" cy="600.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 335, Wert -582.2</title></circle>
|
||||||
|
<circle cx="529.7" cy="600.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 336, Wert -596.7</title></circle>
|
||||||
|
<circle cx="596.8" cy="600.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 337, Wert -558.2</title></circle>
|
||||||
|
<circle cx="663.9" cy="600.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 338, Wert -558.3</title></circle>
|
||||||
|
<circle cx="731.0" cy="600.0" r="5" fill="#30864e" stroke="#333" stroke-width="0.5"><title>Id 339, Wert -585.2</title></circle>
|
||||||
|
<circle cx="798.1" cy="600.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 340, Wert -593.2</title></circle>
|
||||||
|
<circle cx="865.2" cy="600.0" r="5" fill="#32864e" stroke="#333" stroke-width="0.5"><title>Id 341, Wert -589.6</title></circle>
|
||||||
|
<circle cx="932.3" cy="600.0" r="5" fill="#32864e" stroke="#333" stroke-width="0.5"><title>Id 342, Wert -589.0</title></circle>
|
||||||
|
<circle cx="999.4" cy="600.0" r="5" fill="#39814c" stroke="#333" stroke-width="0.5"><title>Id 343, Wert -615.3</title></circle>
|
||||||
|
<circle cx="1066.5" cy="600.0" r="5" fill="#35844d" stroke="#333" stroke-width="0.5"><title>Id 344, Wert -598.8</title></circle>
|
||||||
|
<circle cx="1133.5" cy="600.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 345, Wert -558.2</title></circle>
|
||||||
|
<circle cx="1200.6" cy="600.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 346, Wert -555.1</title></circle>
|
||||||
|
<circle cx="1267.7" cy="600.0" r="5" fill="#38824c" stroke="#333" stroke-width="0.5"><title>Id 347, Wert -611.5</title></circle>
|
||||||
|
<circle cx="1334.8" cy="600.0" r="5" fill="#31864e" stroke="#333" stroke-width="0.5"><title>Id 348, Wert -585.9</title></circle>
|
||||||
|
<circle cx="1401.9" cy="600.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 349, Wert -584.5</title></circle>
|
||||||
|
<circle cx="1469.0" cy="600.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 350, Wert -592.3</title></circle>
|
||||||
|
<circle cx="1536.1" cy="600.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 351, Wert -582.2</title></circle>
|
||||||
|
<circle cx="1603.2" cy="600.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 352, Wert -558.2</title></circle>
|
||||||
|
<circle cx="1670.3" cy="600.0" r="5" fill="#34844d" stroke="#333" stroke-width="0.5"><title>Id 353, Wert -598.6</title></circle>
|
||||||
|
<circle cx="1737.4" cy="600.0" r="5" fill="#31864e" stroke="#333" stroke-width="0.5"><title>Id 354, Wert -587.9</title></circle>
|
||||||
|
<circle cx="1804.5" cy="600.0" r="5" fill="#2a8a4f" stroke="#333" stroke-width="0.5"><title>Id 355, Wert -562.2</title></circle>
|
||||||
|
<circle cx="1871.6" cy="600.0" r="5" fill="#31864e" stroke="#333" stroke-width="0.5"><title>Id 356, Wert -588.4</title></circle>
|
||||||
|
<circle cx="1938.7" cy="600.0" r="5" fill="#2a8a4f" stroke="#333" stroke-width="0.5"><title>Id 357, Wert -564.0</title></circle>
|
||||||
|
<circle cx="2005.8" cy="600.0" r="5" fill="#35844d" stroke="#333" stroke-width="0.5"><title>Id 358, Wert -601.1</title></circle>
|
||||||
|
<circle cx="2072.9" cy="600.0" r="5" fill="#32864e" stroke="#333" stroke-width="0.5"><title>Id 359, Wert -589.6</title></circle>
|
||||||
|
<circle cx="2140.0" cy="600.0" r="5" fill="#39814c" stroke="#333" stroke-width="0.5"><title>Id 360, Wert -615.3</title></circle>
|
||||||
|
<circle cx="60.0" cy="690.0" r="5" fill="#32864e" stroke="#333" stroke-width="0.5"><title>Id 361, Wert -590.3</title></circle>
|
||||||
|
<circle cx="143.2" cy="690.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 362, Wert -582.1</title></circle>
|
||||||
|
<circle cx="226.4" cy="690.0" r="5" fill="#38824c" stroke="#333" stroke-width="0.5"><title>Id 363, Wert -609.1</title></circle>
|
||||||
|
<circle cx="309.6" cy="690.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 364, Wert -555.2</title></circle>
|
||||||
|
<circle cx="392.8" cy="690.0" r="5" fill="#38824c" stroke="#333" stroke-width="0.5"><title>Id 365, Wert -611.6</title></circle>
|
||||||
|
<circle cx="476.0" cy="690.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 366, Wert -592.3</title></circle>
|
||||||
|
<circle cx="559.2" cy="690.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 367, Wert -592.3</title></circle>
|
||||||
|
<circle cx="642.4" cy="690.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 368, Wert -555.2</title></circle>
|
||||||
|
<circle cx="725.6" cy="690.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 369, Wert -582.2</title></circle>
|
||||||
|
<circle cx="808.8" cy="690.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 370, Wert -558.2</title></circle>
|
||||||
|
<circle cx="892.0" cy="690.0" r="5" fill="#31864e" stroke="#333" stroke-width="0.5"><title>Id 371, Wert -587.8</title></circle>
|
||||||
|
<circle cx="975.2" cy="690.0" r="5" fill="#31864e" stroke="#333" stroke-width="0.5"><title>Id 372, Wert -585.8</title></circle>
|
||||||
|
<circle cx="1058.4" cy="690.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 373, Wert -558.2</title></circle>
|
||||||
|
<circle cx="1141.6" cy="690.0" r="5" fill="#2f874e" stroke="#333" stroke-width="0.5"><title>Id 374, Wert -581.8</title></circle>
|
||||||
|
<circle cx="1224.8" cy="690.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 375, Wert -555.1</title></circle>
|
||||||
|
<circle cx="1308.0" cy="690.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 376, Wert -593.6</title></circle>
|
||||||
|
<circle cx="1391.2" cy="690.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 377, Wert -592.7</title></circle>
|
||||||
|
<circle cx="1474.4" cy="690.0" r="5" fill="#33854d" stroke="#333" stroke-width="0.5"><title>Id 378, Wert -592.3</title></circle>
|
||||||
|
<circle cx="1557.6" cy="690.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 379, Wert -555.3</title></circle>
|
||||||
|
<circle cx="1640.8" cy="690.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 380, Wert -555.3</title></circle>
|
||||||
|
<circle cx="1724.0" cy="690.0" r="5" fill="#30874e" stroke="#333" stroke-width="0.5"><title>Id 381, Wert -584.5</title></circle>
|
||||||
|
<circle cx="1807.2" cy="690.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 382, Wert -556.2</title></circle>
|
||||||
|
<circle cx="1890.4" cy="690.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 383, Wert -558.2</title></circle>
|
||||||
|
<circle cx="1973.6" cy="690.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 384, Wert -558.2</title></circle>
|
||||||
|
<circle cx="2056.8" cy="690.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 385, Wert -558.2</title></circle>
|
||||||
|
<circle cx="2140.0" cy="690.0" r="5" fill="#288b4f" stroke="#333" stroke-width="0.5"><title>Id 386, Wert -558.2</title></circle>
|
||||||
|
<text x="1816.4" y="442.0" text-anchor="middle" font-size="12" font-weight="bold" fill="#c04040">283</text>
|
||||||
|
<text x="48" y="64.0" text-anchor="end" font-size="11" fill="#666">Gen 0</text>
|
||||||
|
<text x="48" y="154.0" text-anchor="end" font-size="11" fill="#666">Gen 1</text>
|
||||||
|
<text x="48" y="244.0" text-anchor="end" font-size="11" fill="#666">Gen 2</text>
|
||||||
|
<text x="48" y="334.0" text-anchor="end" font-size="11" fill="#666">Gen 3</text>
|
||||||
|
<text x="48" y="424.0" text-anchor="end" font-size="11" fill="#666">Gen 4</text>
|
||||||
|
<text x="48" y="514.0" text-anchor="end" font-size="11" fill="#666">Gen 5</text>
|
||||||
|
<text x="48" y="604.0" text-anchor="end" font-size="11" fill="#666">Gen 6</text>
|
||||||
|
<text x="48" y="694.0" text-anchor="end" font-size="11" fill="#666">Gen 7</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 78 KiB |
@@ -0,0 +1,62 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="650" viewBox="0 0 900 650" font-family="sans-serif">
|
||||||
|
<rect width="100%" height="100%" fill="white"/>
|
||||||
|
<text x="450" y="30" text-anchor="middle" font-size="16" fill="#333">Entwicklung der Loesungsfindung</text>
|
||||||
|
<line x1="60" y1="60" x2="60" y2="390.0" stroke="#333" stroke-width="1.5"/>
|
||||||
|
<line x1="60" y1="390.0" x2="840" y2="390.0" stroke="#333" stroke-width="1.5"/>
|
||||||
|
<line x1="60" y1="390.0" x2="840" y2="390.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="394.0" text-anchor="end" font-size="11" fill="#666">-1093</text>
|
||||||
|
<line x1="60" y1="324.0" x2="840" y2="324.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="328.0" text-anchor="end" font-size="11" fill="#666">-986</text>
|
||||||
|
<line x1="60" y1="258.0" x2="840" y2="258.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="262.0" text-anchor="end" font-size="11" fill="#666">-878</text>
|
||||||
|
<line x1="60" y1="192.0" x2="840" y2="192.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="196.0" text-anchor="end" font-size="11" fill="#666">-770</text>
|
||||||
|
<line x1="60" y1="126.0" x2="840" y2="126.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="130.0" text-anchor="end" font-size="11" fill="#666">-663</text>
|
||||||
|
<line x1="60" y1="60.0" x2="840" y2="60.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="64.0" text-anchor="end" font-size="11" fill="#666">-555</text>
|
||||||
|
<text x="18" y="225.0" text-anchor="middle" font-size="12" fill="#333" transform="rotate(-90 18 225.0)">Wertigkeit (hoeher = besser)</text>
|
||||||
|
<polyline points="60.0,167.5 97.1,117.4 134.3,117.4 171.4,117.4 208.6,84.9 245.7,84.9 282.9,84.9 320.0,66.0 357.1,66.0 394.3,66.0 431.4,60.0 468.6,60.0 505.7,60.0 542.9,60.1 580.0,60.0 617.1,60.0 654.3,60.1 691.4,60.0 728.6,60.0 765.7,60.1 802.9,60.0 840.0,60.0" fill="none" stroke="#2f6f4f" stroke-width="2"/>
|
||||||
|
<polyline points="60.0,263.3 97.1,218.5 134.3,233.5 171.4,160.6 208.6,135.5 245.7,143.9 282.9,113.1 320.0,99.0 357.1,103.7 394.3,82.5 431.4,81.0 468.6,81.5 505.7,67.0 542.9,77.4 580.0,73.9 617.1,62.4 654.3,78.8 691.4,73.4 728.6,60.8 765.7,72.5 802.9,68.6 840.0,60.2" fill="none" stroke="#c08a2d" stroke-width="2"/>
|
||||||
|
<polyline points="60.0,390.0 97.1,350.3 134.3,390.0 171.4,190.0 208.6,193.0 245.7,193.0 282.9,125.9 320.0,142.2 357.1,142.2 394.3,93.9 431.4,105.3 468.6,105.3 505.7,75.0 542.9,101.0 580.0,101.0 617.1,66.0 654.3,99.2 691.4,99.2 728.6,62.0 765.7,94.7 802.9,94.7 840.0,60.2" fill="none" stroke="#a03030" stroke-width="2"/>
|
||||||
|
<line x1="680" y1="70" x2="704" y2="70" stroke="#2f6f4f" stroke-width="2"/>
|
||||||
|
<text x="710" y="74" font-size="11" fill="#333">beste Loesung</text>
|
||||||
|
<line x1="680" y1="88" x2="704" y2="88" stroke="#c08a2d" stroke-width="2"/>
|
||||||
|
<text x="710" y="92" font-size="11" fill="#333">Durchschnitt</text>
|
||||||
|
<line x1="680" y1="106" x2="704" y2="106" stroke="#a03030" stroke-width="2"/>
|
||||||
|
<text x="710" y="110" font-size="11" fill="#333">schlechteste Loesung</text>
|
||||||
|
<text x="450" y="428.0" text-anchor="middle" font-size="13" fill="#333">Anzahl erzeugter Verteilungen im Pool</text>
|
||||||
|
<line x1="60" y1="440.0" x2="60" y2="590.0" stroke="#333" stroke-width="1.5"/>
|
||||||
|
<line x1="60" y1="590.0" x2="840" y2="590.0" stroke="#333" stroke-width="1.5"/>
|
||||||
|
<line x1="60" y1="590.0" x2="840" y2="590.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="594.0" text-anchor="end" font-size="11" fill="#666">0</text>
|
||||||
|
<line x1="60" y1="515.0" x2="840" y2="515.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="519.0" text-anchor="end" font-size="11" fill="#666">60</text>
|
||||||
|
<line x1="60" y1="440.0" x2="840" y2="440.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="444.0" text-anchor="end" font-size="11" fill="#666">120</text>
|
||||||
|
<polyline points="60.0,540.0 97.1,490.0 134.3,440.0 171.4,547.5 208.6,505.0 245.7,462.5 282.9,555.0 320.0,520.0 357.1,485.0 394.3,561.2 431.4,532.5 468.6,503.8 505.7,566.2 542.9,542.5 580.0,518.8 617.1,570.0 654.3,550.0 691.4,530.0 728.6,573.8 765.7,557.5 802.9,541.2 840.0,576.2" fill="none" stroke="#4060a0" stroke-width="2"/>
|
||||||
|
<text x="60.0" y="606.0" text-anchor="middle" font-size="10" fill="#999">e</text>
|
||||||
|
<text x="97.1" y="606.0" text-anchor="middle" font-size="10" fill="#999">m</text>
|
||||||
|
<text x="134.3" y="606.0" text-anchor="middle" font-size="10" fill="#999">j</text>
|
||||||
|
<text x="171.4" y="606.0" text-anchor="middle" font-size="10" fill="#999">s</text>
|
||||||
|
<text x="208.6" y="606.0" text-anchor="middle" font-size="10" fill="#999">m</text>
|
||||||
|
<text x="245.7" y="606.0" text-anchor="middle" font-size="10" fill="#999">j</text>
|
||||||
|
<text x="282.9" y="606.0" text-anchor="middle" font-size="10" fill="#999">s</text>
|
||||||
|
<text x="320.0" y="606.0" text-anchor="middle" font-size="10" fill="#999">m</text>
|
||||||
|
<text x="357.1" y="606.0" text-anchor="middle" font-size="10" fill="#999">j</text>
|
||||||
|
<text x="394.3" y="606.0" text-anchor="middle" font-size="10" fill="#999">s</text>
|
||||||
|
<text x="431.4" y="606.0" text-anchor="middle" font-size="10" fill="#999">m</text>
|
||||||
|
<text x="468.6" y="606.0" text-anchor="middle" font-size="10" fill="#999">j</text>
|
||||||
|
<text x="505.7" y="606.0" text-anchor="middle" font-size="10" fill="#999">s</text>
|
||||||
|
<text x="542.9" y="606.0" text-anchor="middle" font-size="10" fill="#999">m</text>
|
||||||
|
<text x="580.0" y="606.0" text-anchor="middle" font-size="10" fill="#999">j</text>
|
||||||
|
<text x="617.1" y="606.0" text-anchor="middle" font-size="10" fill="#999">s</text>
|
||||||
|
<text x="654.3" y="606.0" text-anchor="middle" font-size="10" fill="#999">m</text>
|
||||||
|
<text x="691.4" y="606.0" text-anchor="middle" font-size="10" fill="#999">j</text>
|
||||||
|
<text x="728.6" y="606.0" text-anchor="middle" font-size="10" fill="#999">s</text>
|
||||||
|
<text x="765.7" y="606.0" text-anchor="middle" font-size="10" fill="#999">m</text>
|
||||||
|
<text x="802.9" y="606.0" text-anchor="middle" font-size="10" fill="#999">j</text>
|
||||||
|
<text x="840.0" y="606.0" text-anchor="middle" font-size="10" fill="#999">s</text>
|
||||||
|
<text x="450" y="638" text-anchor="middle" font-size="12" fill="#333">Zyklus-Aktion (Zeit)</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 5.8 KiB |
@@ -0,0 +1,300 @@
|
|||||||
|
Aksoy, Luca, = Hof 1, Tisch 33, Nummer 2
|
||||||
|
Aksoy, Marie, = Hof 1, Tisch 25, Nummer 4
|
||||||
|
Aksoy, Marija, = Hof 2, Tisch 59, Nummer 5
|
||||||
|
Aksoy, Michael, Dr. = Hof 2, Tisch 53, Nummer 3
|
||||||
|
Aksoy, Nadine, = Hof 1, Tisch 25, Nummer 2
|
||||||
|
Aksoy, Nicole, = Hof 2, Tisch 57, Nummer 4
|
||||||
|
Aksoy, Sergej, = Hof 1, Tisch 33, Nummer 4
|
||||||
|
Aksoy, Sofia, = Hof 1, Tisch 33, Nummer 3
|
||||||
|
Aksoy, Thomas, = Hof 1, Tisch 25, Nummer 3
|
||||||
|
Albrecht, Andreas, = Hof 1, Tisch 12, Nummer 4
|
||||||
|
Albrecht, Emre, Prof. Dr. = Hof 2, Tisch 82, Nummer 3
|
||||||
|
Albrecht, Sarah, = Hof 1, Tisch 12, Nummer 3
|
||||||
|
Albrecht, Yusuf, Prof. Dr. = Hof 1, Tisch 13, Nummer 2
|
||||||
|
Arnold, Christian, = Hof 1, Tisch 35, Nummer 3
|
||||||
|
Arnold, Jennifer, = Hof 1, Tisch 43, Nummer 2
|
||||||
|
Arnold, Jennifer, Dr. = Hof 2, Tisch 88, Nummer 3
|
||||||
|
Arnold, Leni, = Hof 1, Tisch 35, Nummer 2
|
||||||
|
Arnold, Mila, = Hof 1, Tisch 35, Nummer 4
|
||||||
|
Arnold, Nadine, = Hof 2, Tisch 65, Nummer 2
|
||||||
|
Arnold, Patrick, = Hof 1, Tisch 43, Nummer 3
|
||||||
|
Barth, Lina, = Hof 2, Tisch 74, Nummer 5
|
||||||
|
Barth, Markus, = Hof 1, Tisch 39, Nummer 2
|
||||||
|
Barth, Nadine, = Hof 2, Tisch 74, Nummer 3
|
||||||
|
Barth, Patrick, = Hof 2, Tisch 74, Nummer 2
|
||||||
|
Barth, Timo, = Hof 2, Tisch 74, Nummer 4
|
||||||
|
Bauer, Dragana, = Hof 1, Tisch 45, Nummer 4
|
||||||
|
Bauer, Yusuf, = Hof 1, Tisch 4, Nummer 4
|
||||||
|
Becker, Jan, = Hof 1, Tisch 14, Nummer 3
|
||||||
|
Becker, Marija, = Hof 2, Tisch 76, Nummer 3
|
||||||
|
Becker, Nicole, = Hof 1, Tisch 14, Nummer 2
|
||||||
|
Becker, Sandra, = Hof 1, Tisch 14, Nummer 4
|
||||||
|
Berger, Andreas, = Hof 1, Tisch 24, Nummer 2
|
||||||
|
Berger, Anton, = Hof 1, Tisch 32, Nummer 3
|
||||||
|
Berger, Jennifer, = Hof 1, Tisch 32, Nummer 2
|
||||||
|
Berger, Layla, = Hof 1, Tisch 32, Nummer 4
|
||||||
|
Berger, Nadine, Dr. = Hof 1, Tisch 26, Nummer 3
|
||||||
|
Berger, Stefan, = Hof 1, Tisch 32, Nummer 5
|
||||||
|
Berger, Svenja, = Hof 1, Tisch 24, Nummer 5
|
||||||
|
Bianchi, Jan, Dr. = Hof 1, Tisch 4, Nummer 5
|
||||||
|
Bianchi, Mia, = Hof 2, Tisch 54, Nummer 4
|
||||||
|
Bianchi, Sandra, = Hof 2, Tisch 54, Nummer 2
|
||||||
|
Bianchi, Thomas, = Hof 2, Tisch 54, Nummer 3
|
||||||
|
Bianchi, Thomas, = Hof 2, Tisch 82, Nummer 4
|
||||||
|
Braun, Christian, = Hof 1, Tisch 42, Nummer 4
|
||||||
|
Braun, Dragana, = Hof 1, Tisch 42, Nummer 3
|
||||||
|
Braun, Jan, = Hof 1, Tisch 42, Nummer 2
|
||||||
|
Braun, Julia, = Hof 1, Tisch 41, Nummer 2
|
||||||
|
Braun, Milan, = Hof 1, Tisch 41, Nummer 3
|
||||||
|
Braun, Nadine, = Hof 1, Tisch 41, Nummer 4
|
||||||
|
Busch, Emre, = Hof 2, Tisch 56, Nummer 3
|
||||||
|
Busch, Marie, = Hof 2, Tisch 56, Nummer 4
|
||||||
|
Busch, Michael, = Hof 2, Tisch 56, Nummer 5
|
||||||
|
Busch, Olga, = Hof 2, Tisch 56, Nummer 2
|
||||||
|
Busch, Patrick, = Hof 2, Tisch 64, Nummer 3
|
||||||
|
Celik, Elif, = Hof 1, Tisch 24, Nummer 4
|
||||||
|
Celik, Patrick, = Hof 1, Tisch 24, Nummer 3
|
||||||
|
Dallmann, Charlotte, = Hof 1, Tisch 7, Nummer 5
|
||||||
|
Dallmann, Heinrich, = Hof 1, Tisch 7, Nummer 2
|
||||||
|
Dallmann, Margarete, = Hof 1, Tisch 7, Nummer 3
|
||||||
|
Dallmann, Maximilian, = Hof 1, Tisch 7, Nummer 4
|
||||||
|
Demir, Sandra, Dr. = Hof 1, Tisch 28, Nummer 3
|
||||||
|
Dietrich, Dragana, Prof. Dr. = Hof 2, Tisch 53, Nummer 2
|
||||||
|
Dietrich, Jennifer, = Hof 1, Tisch 27, Nummer 2
|
||||||
|
Dietrich, Marco, = Hof 1, Tisch 27, Nummer 3
|
||||||
|
Dietrich, Sofia, = Hof 1, Tisch 27, Nummer 4
|
||||||
|
Engel, Anja, = Hof 1, Tisch 21, Nummer 3
|
||||||
|
Engel, Anton, = Hof 1, Tisch 20, Nummer 5
|
||||||
|
Engel, Julia, = Hof 1, Tisch 20, Nummer 4
|
||||||
|
Engel, Nicole, = Hof 1, Tisch 21, Nummer 2
|
||||||
|
Engel, Yusuf, = Hof 1, Tisch 21, Nummer 4
|
||||||
|
Esposito, Jan, Dr. = Hof 1, Tisch 17, Nummer 3
|
||||||
|
Esposito, Yusuf, Prof. Dr. = Hof 2, Tisch 76, Nummer 2
|
||||||
|
Frank, Dennis, = Hof 2, Tisch 88, Nummer 5
|
||||||
|
Frank, Finn, = Hof 2, Tisch 87, Nummer 4
|
||||||
|
Frank, Lena, = Hof 2, Tisch 87, Nummer 2
|
||||||
|
Frank, Marie, = Hof 2, Tisch 87, Nummer 3
|
||||||
|
Frank, Nadine, = Hof 2, Tisch 88, Nummer 4
|
||||||
|
Franke, Amira, = Hof 2, Tisch 69, Nummer 3
|
||||||
|
Franke, Julia, = Hof 2, Tisch 78, Nummer 5
|
||||||
|
Franke, Marco, = Hof 2, Tisch 69, Nummer 4
|
||||||
|
Franke, Michael, = Hof 2, Tisch 78, Nummer 4
|
||||||
|
Franke, Olga, = Hof 2, Tisch 69, Nummer 2
|
||||||
|
Freifrau von Waldeck, Antonia, = Hof 1, Tisch 6, Nummer 4
|
||||||
|
Freiherr von Waldeck, Konstantin, Dr. = Hof 1, Tisch 6, Nummer 3
|
||||||
|
Grothe, Alexander, Dr. h.c. = Hof 1, Tisch 5, Nummer 2
|
||||||
|
Grothe, Beate, = Hof 1, Tisch 5, Nummer 3
|
||||||
|
Haas, Jennifer, Dr. = Hof 1, Tisch 31, Nummer 3
|
||||||
|
Haas, Patrick, = Hof 1, Tisch 45, Nummer 2
|
||||||
|
Hansen, Giovanna, = Hof 1, Tisch 8, Nummer 2
|
||||||
|
Hansen, Markus, = Hof 1, Tisch 8, Nummer 3
|
||||||
|
Hansen, Nicole, Dr. = Hof 1, Tisch 38, Nummer 2
|
||||||
|
Hansen, Olga, = Hof 1, Tisch 8, Nummer 4
|
||||||
|
Hansen, Thomas, = Hof 1, Tisch 16, Nummer 2
|
||||||
|
Hartmann, Deniz, = Hof 2, Tisch 78, Nummer 2
|
||||||
|
Hartmann, Marija, = Hof 2, Tisch 84, Nummer 2
|
||||||
|
Hartmann, Nadine, = Hof 2, Tisch 78, Nummer 3
|
||||||
|
Hartmann, Olga, = Hof 2, Tisch 84, Nummer 4
|
||||||
|
Hartmann, Thomas, = Hof 2, Tisch 84, Nummer 3
|
||||||
|
Hoffmann, Emre, = Hof 2, Tisch 64, Nummer 4
|
||||||
|
Hoffmann, Patrick, Prof. Dr. = Hof 2, Tisch 65, Nummer 4
|
||||||
|
Hoffmann, Thomas, Dr. = Hof 2, Tisch 51, Nummer 3
|
||||||
|
Horn, Kathrin, = Hof 2, Tisch 79, Nummer 2
|
||||||
|
Horn, Layla, = Hof 2, Tisch 79, Nummer 4
|
||||||
|
Horn, Leon, = Hof 2, Tisch 79, Nummer 5
|
||||||
|
Horn, Michael, = Hof 2, Tisch 79, Nummer 3
|
||||||
|
Kaya, Christina, = Hof 2, Tisch 77, Nummer 3
|
||||||
|
Kaya, Luca, = Hof 2, Tisch 77, Nummer 2
|
||||||
|
Kaya, Nicole, = Hof 2, Tisch 77, Nummer 4
|
||||||
|
Kaya, Patrick, Dr. = Hof 1, Tisch 3, Nummer 3
|
||||||
|
Kaya, Timo, Prof. Dr. = Hof 1, Tisch 28, Nummer 2
|
||||||
|
Kessler, Ferdinand, Dr. = Hof 1, Tisch 5, Nummer 4
|
||||||
|
Kessler, Viktoria, = Hof 1, Tisch 5, Nummer 5
|
||||||
|
Klein, Emre, = Hof 1, Tisch 3, Nummer 2
|
||||||
|
Klein, Lina, = Hof 1, Tisch 18, Nummer 4
|
||||||
|
Klein, Markus, = Hof 2, Tisch 57, Nummer 5
|
||||||
|
Klein, Milan, = Hof 1, Tisch 18, Nummer 3
|
||||||
|
Klein, Olga, Dr. = Hof 2, Tisch 88, Nummer 2
|
||||||
|
Klein, Stefanie, = Hof 1, Tisch 18, Nummer 2
|
||||||
|
Koch, Emil, = Hof 2, Tisch 48, Nummer 3
|
||||||
|
Koch, Jan, = Hof 2, Tisch 49, Nummer 3
|
||||||
|
Koch, Kathrin, Dr. = Hof 2, Tisch 52, Nummer 4
|
||||||
|
Koch, Marie, = Hof 2, Tisch 49, Nummer 4
|
||||||
|
Koch, Michael, = Hof 2, Tisch 48, Nummer 2
|
||||||
|
Koch, Olga, = Hof 2, Tisch 48, Nummer 4
|
||||||
|
Koch, Sarah, = Hof 2, Tisch 49, Nummer 2
|
||||||
|
Kovac, Anja, = Hof 1, Tisch 36, Nummer 3
|
||||||
|
Kovac, Henry, = Hof 1, Tisch 36, Nummer 4
|
||||||
|
Kovac, Lena, = Hof 1, Tisch 28, Nummer 4
|
||||||
|
Kovac, Luca, = Hof 2, Tisch 62, Nummer 2
|
||||||
|
Kovac, Marco, = Hof 1, Tisch 36, Nummer 2
|
||||||
|
Kovac, Marija, = Hof 1, Tisch 36, Nummer 5
|
||||||
|
Kovac, Matthias, = Hof 2, Tisch 76, Nummer 4
|
||||||
|
Kovac, Tobias, = Hof 1, Tisch 28, Nummer 5
|
||||||
|
Kraus, Markus, = Hof 1, Tisch 11, Nummer 4
|
||||||
|
Kraus, Patrick, Dr. = Hof 2, Tisch 67, Nummer 3
|
||||||
|
Krause, Andreas, = Hof 2, Tisch 63, Nummer 2
|
||||||
|
Krause, Arda, = Hof 2, Tisch 63, Nummer 4
|
||||||
|
Krause, Christina, Dr. = Hof 1, Tisch 3, Nummer 4
|
||||||
|
Krause, Daniel, = Hof 2, Tisch 57, Nummer 3
|
||||||
|
Krause, Dragana, Dr. = Hof 2, Tisch 62, Nummer 3
|
||||||
|
Krause, Emma, = Hof 2, Tisch 63, Nummer 3
|
||||||
|
Krause, Julia, = Hof 2, Tisch 63, Nummer 5
|
||||||
|
Krause, Matthias, = Hof 2, Tisch 58, Nummer 3
|
||||||
|
Krause, Thomas, = Hof 1, Tisch 38, Nummer 3
|
||||||
|
Kuhn, Julia, Dr. = Hof 2, Tisch 52, Nummer 5
|
||||||
|
Lange, Dragana, = Hof 1, Tisch 43, Nummer 4
|
||||||
|
Lange, Jan, = Hof 1, Tisch 44, Nummer 2
|
||||||
|
Lange, Michael, = Hof 1, Tisch 43, Nummer 5
|
||||||
|
Lange, Sergej, = Hof 2, Tisch 64, Nummer 5
|
||||||
|
Lange, Sofia, = Hof 1, Tisch 44, Nummer 4
|
||||||
|
Lange, Svenja, = Hof 1, Tisch 44, Nummer 3
|
||||||
|
Lehmann, Giovanna, = Hof 1, Tisch 13, Nummer 3
|
||||||
|
Lehmann, Layla, = Hof 1, Tisch 2, Nummer 2
|
||||||
|
Lehmann, Markus, = Hof 1, Tisch 2, Nummer 5
|
||||||
|
Lehmann, Milan, = Hof 1, Tisch 13, Nummer 4
|
||||||
|
Lehmann, Nicole, = Hof 1, Tisch 2, Nummer 4
|
||||||
|
Lehmann, Patrick, = Hof 1, Tisch 26, Nummer 4
|
||||||
|
Lehmann, Thomas, = Hof 1, Tisch 2, Nummer 3
|
||||||
|
Ludwig, Aylin, Dr. = Hof 2, Tisch 67, Nummer 4
|
||||||
|
Ludwig, Elias, = Hof 1, Tisch 9, Nummer 5
|
||||||
|
Ludwig, Elif, = Hof 1, Tisch 9, Nummer 4
|
||||||
|
Ludwig, Emre, = Hof 1, Tisch 9, Nummer 3
|
||||||
|
Ludwig, Emre, Prof. Dr. = Hof 2, Tisch 57, Nummer 2
|
||||||
|
Ludwig, Giovanna, = Hof 1, Tisch 9, Nummer 2
|
||||||
|
Maier, Arda, = Hof 2, Tisch 61, Nummer 5
|
||||||
|
Maier, Christian, = Hof 2, Tisch 61, Nummer 3
|
||||||
|
Maier, Olga, = Hof 2, Tisch 61, Nummer 4
|
||||||
|
Maier, Sarah, = Hof 2, Tisch 61, Nummer 2
|
||||||
|
Neumann, Jennifer, = Hof 2, Tisch 73, Nummer 2
|
||||||
|
Neumann, Lina, = Hof 2, Tisch 73, Nummer 4
|
||||||
|
Neumann, Matteo, = Hof 2, Tisch 73, Nummer 5
|
||||||
|
Neumann, Thomas, = Hof 2, Tisch 73, Nummer 3
|
||||||
|
Nguyen, Anja, = Hof 1, Tisch 15, Nummer 2
|
||||||
|
Nguyen, Daniel, = Hof 1, Tisch 15, Nummer 3
|
||||||
|
Nguyen, Julia, = Hof 1, Tisch 16, Nummer 4
|
||||||
|
Nguyen, Sofia, = Hof 1, Tisch 15, Nummer 4
|
||||||
|
Nowak, Aylin, = Hof 1, Tisch 37, Nummer 2
|
||||||
|
Nowak, Felix, = Hof 1, Tisch 29, Nummer 2
|
||||||
|
Nowak, Kathrin, = Hof 1, Tisch 29, Nummer 5
|
||||||
|
Nowak, Lina, = Hof 1, Tisch 37, Nummer 4
|
||||||
|
Nowak, Markus, = Hof 1, Tisch 37, Nummer 3
|
||||||
|
Nowak, Noah, = Hof 1, Tisch 37, Nummer 5
|
||||||
|
Ott, Daniel, = Hof 2, Tisch 80, Nummer 5
|
||||||
|
Ott, Hannah, = Hof 2, Tisch 72, Nummer 3
|
||||||
|
Ott, Luca, = Hof 2, Tisch 71, Nummer 2
|
||||||
|
Ott, Matthias, = Hof 2, Tisch 72, Nummer 2
|
||||||
|
Ott, Melanie, = Hof 2, Tisch 80, Nummer 4
|
||||||
|
Ott, Olga, = Hof 2, Tisch 72, Nummer 4
|
||||||
|
Ott, Sergej, Prof. Dr. = Hof 1, Tisch 45, Nummer 3
|
||||||
|
Ott, Yusuf, Prof. Dr. = Hof 1, Tisch 26, Nummer 2
|
||||||
|
Peters, Christian, = Hof 1, Tisch 10, Nummer 5
|
||||||
|
Peters, Nicole, = Hof 1, Tisch 45, Nummer 5
|
||||||
|
Petrov, Giovanna, = Hof 1, Tisch 10, Nummer 2
|
||||||
|
Petrov, Kathrin, = Hof 1, Tisch 38, Nummer 4
|
||||||
|
Petrov, Kathrin, Prof. Dr. = Hof 1, Tisch 11, Nummer 2
|
||||||
|
Petrov, Matthias, = Hof 1, Tisch 39, Nummer 3
|
||||||
|
Petrov, Milan, = Hof 1, Tisch 38, Nummer 5
|
||||||
|
Petrov, Sergej, = Hof 2, Tisch 59, Nummer 3
|
||||||
|
Pohl, Dragana, = Hof 2, Tisch 75, Nummer 2
|
||||||
|
Pohl, Emre, = Hof 2, Tisch 75, Nummer 3
|
||||||
|
Pohl, Mia, = Hof 2, Tisch 75, Nummer 4
|
||||||
|
Pohl, Theo, = Hof 2, Tisch 75, Nummer 5
|
||||||
|
Polat, Kathrin, = Hof 2, Tisch 59, Nummer 4
|
||||||
|
Polat, Katrin, = Hof 2, Tisch 81, Nummer 4
|
||||||
|
Polat, Marija, = Hof 2, Tisch 65, Nummer 5
|
||||||
|
Polat, Markus, = Hof 2, Tisch 81, Nummer 3
|
||||||
|
Polat, Sarah, = Hof 2, Tisch 81, Nummer 2
|
||||||
|
Polat, Stefan, = Hof 2, Tisch 80, Nummer 3
|
||||||
|
Polat, Stefanie, = Hof 2, Tisch 80, Nummer 2
|
||||||
|
Popescu, Matthias, = Hof 1, Tisch 12, Nummer 2
|
||||||
|
Richter, Anja, = Hof 2, Tisch 50, Nummer 2
|
||||||
|
Richter, Anja, Prof. Dr. = Hof 1, Tisch 22, Nummer 2
|
||||||
|
Richter, Anton, = Hof 2, Tisch 50, Nummer 5
|
||||||
|
Richter, Greta, = Hof 2, Tisch 50, Nummer 4
|
||||||
|
Richter, Julia, Prof. Dr. = Hof 1, Tisch 31, Nummer 2
|
||||||
|
Richter, Marco, = Hof 2, Tisch 65, Nummer 3
|
||||||
|
Richter, Matthias, = Hof 2, Tisch 50, Nummer 3
|
||||||
|
Richter, Stefan, = Hof 2, Tisch 71, Nummer 4
|
||||||
|
Rossi, Emilia, = Hof 1, Tisch 40, Nummer 4
|
||||||
|
Rossi, Luca, = Hof 1, Tisch 40, Nummer 3
|
||||||
|
Rossi, Melanie, = Hof 1, Tisch 40, Nummer 2
|
||||||
|
Roth, Christian, = Hof 1, Tisch 23, Nummer 3
|
||||||
|
Roth, Julia, Prof. Dr. = Hof 1, Tisch 17, Nummer 4
|
||||||
|
Roth, Olga, = Hof 2, Tisch 82, Nummer 2
|
||||||
|
Roth, Sarah, = Hof 1, Tisch 23, Nummer 2
|
||||||
|
Roth, Sofia, = Hof 1, Tisch 23, Nummer 4
|
||||||
|
Sahin, Kathrin, = Hof 2, Tisch 60, Nummer 4
|
||||||
|
Sahin, Markus, = Hof 2, Tisch 60, Nummer 3
|
||||||
|
Sahin, Nicole, = Hof 2, Tisch 60, Nummer 2
|
||||||
|
Sahin, Patrick, = Hof 2, Tisch 60, Nummer 5
|
||||||
|
Sahin, Thomas, = Hof 1, Tisch 22, Nummer 4
|
||||||
|
Schmidt, Giovanna, = Hof 2, Tisch 85, Nummer 4
|
||||||
|
Schmidt, Marie, = Hof 2, Tisch 85, Nummer 3
|
||||||
|
Schmidt, Matthias, = Hof 2, Tisch 85, Nummer 2
|
||||||
|
Schmidt, Nicole, = Hof 1, Tisch 16, Nummer 3
|
||||||
|
Schmitt, Dennis, Prof. Dr. = Hof 2, Tisch 62, Nummer 4
|
||||||
|
Schmitt, Markus, = Hof 1, Tisch 10, Nummer 4
|
||||||
|
Schmitt, Markus, = Hof 2, Tisch 47, Nummer 3
|
||||||
|
Schmitt, Sarah, = Hof 2, Tisch 47, Nummer 2
|
||||||
|
Schmitt, Sofia, = Hof 2, Tisch 47, Nummer 4
|
||||||
|
Schmitt, Stefan, Prof. Dr. = Hof 2, Tisch 52, Nummer 2
|
||||||
|
Schwarz, Giovanna, = Hof 2, Tisch 58, Nummer 4
|
||||||
|
Seidel, Anja, Dr. = Hof 2, Tisch 51, Nummer 5
|
||||||
|
Seidel, Markus, Dr. = Hof 1, Tisch 11, Nummer 3
|
||||||
|
Seidel, Yusuf, Prof. Dr. = Hof 1, Tisch 4, Nummer 3
|
||||||
|
Seifert, Elif, = Hof 1, Tisch 20, Nummer 3
|
||||||
|
Seifert, Leni, = Hof 1, Tisch 19, Nummer 4
|
||||||
|
Seifert, Marco, Prof. Dr. = Hof 2, Tisch 58, Nummer 2
|
||||||
|
Seifert, Nicole, = Hof 1, Tisch 19, Nummer 2
|
||||||
|
Seifert, Stefanie, Dr. = Hof 1, Tisch 16, Nummer 5
|
||||||
|
Seifert, Timo, = Hof 1, Tisch 20, Nummer 2
|
||||||
|
Seifert, Yusuf, = Hof 1, Tisch 19, Nummer 3
|
||||||
|
Simon, Andreas, = Hof 2, Tisch 66, Nummer 5
|
||||||
|
Simon, Emma, = Hof 2, Tisch 66, Nummer 4
|
||||||
|
Simon, Lena, = Hof 2, Tisch 66, Nummer 2
|
||||||
|
Simon, Markus, = Hof 2, Tisch 66, Nummer 3
|
||||||
|
Simon, Svenja, = Hof 1, Tisch 13, Nummer 5
|
||||||
|
Stein, Ben, = Hof 2, Tisch 86, Nummer 4
|
||||||
|
Stein, Emilia, = Hof 2, Tisch 86, Nummer 3
|
||||||
|
Stein, Giovanna, = Hof 2, Tisch 86, Nummer 5
|
||||||
|
Stein, Markus, Prof. Dr. = Hof 1, Tisch 12, Nummer 5
|
||||||
|
Stein, Nadine, Dr. = Hof 1, Tisch 10, Nummer 3
|
||||||
|
Stein, Thomas, = Hof 2, Tisch 86, Nummer 2
|
||||||
|
Steinbach, Elisabeth, = Hof 1, Tisch 6, Nummer 2
|
||||||
|
Steinbach, Georg, = Hof 1, Tisch 6, Nummer 5
|
||||||
|
Thiel, Christina, = Hof 2, Tisch 46, Nummer 3
|
||||||
|
Thiel, Jan, Dr. = Hof 1, Tisch 22, Nummer 3
|
||||||
|
Thiel, Julia, = Hof 2, Tisch 46, Nummer 4
|
||||||
|
Thiel, Yusuf, = Hof 2, Tisch 46, Nummer 2
|
||||||
|
Tran, Marija, = Hof 2, Tisch 52, Nummer 3
|
||||||
|
Tran, Olga, = Hof 2, Tisch 51, Nummer 4
|
||||||
|
Tran, Thomas, Prof. Dr. = Hof 2, Tisch 59, Nummer 2
|
||||||
|
Wagner, Henry, = Hof 2, Tisch 68, Nummer 5
|
||||||
|
Wagner, Marco, = Hof 2, Tisch 68, Nummer 3
|
||||||
|
Wagner, Nicole, = Hof 2, Tisch 68, Nummer 2
|
||||||
|
Wagner, Sarah, = Hof 2, Tisch 68, Nummer 4
|
||||||
|
Weber, Andreas, = Hof 1, Tisch 39, Nummer 4
|
||||||
|
Weber, Julia, = Hof 1, Tisch 3, Nummer 5
|
||||||
|
Weber, Katrin, = Hof 2, Tisch 53, Nummer 4
|
||||||
|
Weber, Yusuf, = Hof 2, Tisch 67, Nummer 2
|
||||||
|
Werner, Andreas, = Hof 2, Tisch 55, Nummer 3
|
||||||
|
Werner, Dennis, Prof. Dr. = Hof 2, Tisch 51, Nummer 2
|
||||||
|
Werner, Katrin, = Hof 2, Tisch 64, Nummer 2
|
||||||
|
Werner, Luca, = Hof 2, Tisch 53, Nummer 5
|
||||||
|
Werner, Marco, = Hof 2, Tisch 55, Nummer 5
|
||||||
|
Werner, Nadine, = Hof 2, Tisch 55, Nummer 4
|
||||||
|
Werner, Sandra, = Hof 2, Tisch 55, Nummer 2
|
||||||
|
Winkler, Lena, = Hof 1, Tisch 29, Nummer 3
|
||||||
|
Winkler, Marco, = Hof 1, Tisch 4, Nummer 2
|
||||||
|
Winkler, Patrick, = Hof 1, Tisch 29, Nummer 4
|
||||||
|
Winkler, Thomas, = Hof 1, Tisch 17, Nummer 2
|
||||||
|
Wolf, Ben, = Hof 2, Tisch 83, Nummer 3
|
||||||
|
Wolf, Emma, = Hof 2, Tisch 83, Nummer 2
|
||||||
|
Wolf, Julia, = Hof 2, Tisch 83, Nummer 4
|
||||||
|
Wolf, Thomas, = Hof 2, Tisch 83, Nummer 5
|
||||||
|
Zimmermann, Jan, = Hof 2, Tisch 70, Nummer 3
|
||||||
|
Zimmermann, Markus, = Hof 2, Tisch 70, Nummer 5
|
||||||
|
Zimmermann, Mia, = Hof 2, Tisch 70, Nummer 4
|
||||||
|
Zimmermann, Patrick, = Hof 2, Tisch 71, Nummer 3
|
||||||
|
Zimmermann, Svenja, = Hof 2, Tisch 70, Nummer 2
|
||||||
|
@@ -0,0 +1,682 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="2476.05" height="466.676" viewBox="0 0 2476.05 466.676">
|
||||||
|
<rect width="100%" height="100%" fill="white"/>
|
||||||
|
<polyline points="187.67,324.673 233.338,416.009" fill="none" stroke="#e6194b" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="964.02,50.6676 872.685,50.6676" fill="none" stroke="#4363d8" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="553.011,142.003 461.676,142.003" fill="none" stroke="#42d4f4" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="735.682,142.003 836.351,132.669" fill="none" stroke="#bfef45" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="918.352,142.003 817.683,151.337" fill="none" stroke="#fabed4" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="416.009,233.338 370.341,324.673" fill="none" stroke="#9a6324" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="553.011,324.673 608.013,406.675" fill="none" stroke="#000075" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="416.009,416.009 507.344,416.009" fill="none" stroke="#3cb44b" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="690.014,416.009 589.345,425.342" fill="none" stroke="#4363d8" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="1694.7,50.6676 1786.04,50.6676" fill="none" stroke="#42d4f4" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="1649.03,142.003 1603.37,233.338" fill="none" stroke="#bfef45" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="2014.38,142.003 1968.71,233.338" fill="none" stroke="#fabed4" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="1786.04,233.338 1822.37,334.007" fill="none" stroke="#469990" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="2060.04,233.338 2005.04,334.007" fill="none" stroke="#dcbeff" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="2105.71,324.673 2023.71,315.34" fill="none" stroke="#aaffc3" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="2197.05,324.673 2160.71,406.675" fill="none" stroke="#000075" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="1786.04,416.009 1841.04,315.34" fill="none" stroke="#e6194b" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="2060.04,416.009 2142.04,425.342" fill="none" stroke="#4363d8" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="142.003,50.6676 197.004,151.337" fill="none" stroke="#f58231" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="239.561,50.6676 324.673,50.6676" fill="none" stroke="#911eb4" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="315.34,224.004 279.006,324.673" fill="none" stroke="#dcbeff" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="680.68,242.672 644.347,324.673" fill="none" stroke="#aaffc3" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="772.016,224.004 735.682,324.673" fill="none" stroke="#000075" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="836.351,315.34 781.35,416.009" fill="none" stroke="#3cb44b" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="2060.04,50.6676 2142.04,60.0014" fill="none" stroke="#42d4f4" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<polyline points="2160.71,41.3338 2197.05,142.003" fill="none" stroke="#f032e6" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<circle cx="50.6676" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<ellipse cx="50.6676" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="50.6676" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">1</text>
|
||||||
|
<text x="50.6676" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="872.685" cy="233.338" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<ellipse cx="872.685" cy="233.338" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="872.685" y="228.538" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">30</text>
|
||||||
|
<text x="872.685" y="241.738" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="461.676" cy="324.673" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<ellipse cx="461.676" cy="324.673" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="461.676" y="319.873" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">34</text>
|
||||||
|
<text x="461.676" y="333.073" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="187.67" cy="324.673" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="7" data-gruppe="Lehrstuhl Thermodynamik" data-name="Prof. Dr. Julia Richter" cx="187.67" cy="306.006" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Prof. Dr. Julia Richter — Lehrstuhl Thermodynamik</title></circle>
|
||||||
|
<circle class="person" data-gid="7" data-gruppe="Lehrstuhl Thermodynamik" data-name="Dr. Jennifer Haas" cx="187.67" cy="343.341" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Dr. Jennifer Haas — Lehrstuhl Thermodynamik</title></circle>
|
||||||
|
<ellipse cx="187.67" cy="324.673" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="187.67" y="319.873" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">31</text>
|
||||||
|
<text x="187.67" y="333.073" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="690.014" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="53" data-gruppe="Familie Hansen (Studierenden-Familie 33)" data-name="Giovanna Hansen" cx="690.014" cy="32" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Giovanna Hansen — Familie Hansen (Studierenden-Familie 33)</title></circle>
|
||||||
|
<circle class="person" data-gid="53" data-gruppe="Familie Hansen (Studierenden-Familie 33)" data-name="Markus Hansen" cx="706.181" cy="60.0014" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Markus Hansen — Familie Hansen (Studierenden-Familie 33)</title></circle>
|
||||||
|
<circle class="person" data-gid="53" data-gruppe="Familie Hansen (Studierenden-Familie 33)" data-name="Olga Hansen" cx="673.848" cy="60.0014" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Olga Hansen — Familie Hansen (Studierenden-Familie 33)</title></circle>
|
||||||
|
<ellipse cx="690.014" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="690.014" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">8</text>
|
||||||
|
<text x="690.014" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="964.02" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="16" data-gruppe="Lehrstuhl Mathematik" data-name="Prof. Dr. Kathrin Petrov" cx="964.02" cy="32" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Prof. Dr. Kathrin Petrov — Lehrstuhl Mathematik</title></circle>
|
||||||
|
<circle class="person" data-gid="16" data-gruppe="Lehrstuhl Mathematik" data-name="Dr. Markus Seidel" cx="980.187" cy="60.0014" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Dr. Markus Seidel — Lehrstuhl Mathematik</title></circle>
|
||||||
|
<circle class="person" data-gid="16" data-gruppe="Lehrstuhl Mathematik" data-name="Markus Kraus" cx="947.853" cy="60.0014" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Markus Kraus — Lehrstuhl Mathematik</title></circle>
|
||||||
|
<ellipse cx="964.02" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="964.02" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">11</text>
|
||||||
|
<text x="964.02" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="279.006" cy="142.003" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="15" data-gruppe="Familie Becker (Studierenden-Familie 8)" data-name="Nicole Becker" cx="279.006" cy="123.335" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Nicole Becker — Familie Becker (Studierenden-Familie 8)</title></circle>
|
||||||
|
<circle class="person" data-gid="15" data-gruppe="Familie Becker (Studierenden-Familie 8)" data-name="Jan Becker" cx="295.172" cy="151.337" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Jan Becker — Familie Becker (Studierenden-Familie 8)</title></circle>
|
||||||
|
<circle class="person" data-gid="15" data-gruppe="Familie Becker (Studierenden-Familie 8)" data-name="Sandra Becker" cx="262.839" cy="151.337" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Sandra Becker — Familie Becker (Studierenden-Familie 8)</title></circle>
|
||||||
|
<ellipse cx="279.006" cy="142.003" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="279.006" y="137.203" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">14</text>
|
||||||
|
<text x="279.006" y="150.403" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="370.341" cy="142.003" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="17" data-gruppe="Familie Nguyen (Studierenden-Familie 9)" data-name="Anja Nguyen" cx="370.341" cy="123.335" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Anja Nguyen — Familie Nguyen (Studierenden-Familie 9)</title></circle>
|
||||||
|
<circle class="person" data-gid="17" data-gruppe="Familie Nguyen (Studierenden-Familie 9)" data-name="Daniel Nguyen" cx="386.508" cy="151.337" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Daniel Nguyen — Familie Nguyen (Studierenden-Familie 9)</title></circle>
|
||||||
|
<circle class="person" data-gid="17" data-gruppe="Familie Nguyen (Studierenden-Familie 9)" data-name="Sofia Nguyen" cx="354.174" cy="151.337" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Sofia Nguyen — Familie Nguyen (Studierenden-Familie 9)</title></circle>
|
||||||
|
<ellipse cx="370.341" cy="142.003" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="370.341" y="137.203" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">15</text>
|
||||||
|
<text x="370.341" y="150.403" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="553.011" cy="142.003" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="14" data-gruppe="Institut fuer Elektrotechnik" data-name="Thomas Winkler" cx="553.011" cy="123.335" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Thomas Winkler — Institut fuer Elektrotechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="14" data-gruppe="Institut fuer Elektrotechnik" data-name="Dr. Jan Esposito" cx="569.178" cy="151.337" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Dr. Jan Esposito — Institut fuer Elektrotechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="14" data-gruppe="Institut fuer Elektrotechnik" data-name="Prof. Dr. Julia Roth" cx="536.845" cy="151.337" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Prof. Dr. Julia Roth — Institut fuer Elektrotechnik</title></circle>
|
||||||
|
<ellipse cx="553.011" cy="142.003" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="553.011" y="137.203" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">17</text>
|
||||||
|
<text x="553.011" y="150.403" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="644.347" cy="142.003" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="19" data-gruppe="Familie Klein (Studierenden-Familie 11)" data-name="Stefanie Klein" cx="644.347" cy="123.335" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Stefanie Klein — Familie Klein (Studierenden-Familie 11)</title></circle>
|
||||||
|
<circle class="person" data-gid="19" data-gruppe="Familie Klein (Studierenden-Familie 11)" data-name="Milan Klein" cx="660.513" cy="151.337" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Milan Klein — Familie Klein (Studierenden-Familie 11)</title></circle>
|
||||||
|
<circle class="person" data-gid="19" data-gruppe="Familie Klein (Studierenden-Familie 11)" data-name="Lina Klein" cx="628.18" cy="151.337" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Lina Klein — Familie Klein (Studierenden-Familie 11)</title></circle>
|
||||||
|
<ellipse cx="644.347" cy="142.003" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="644.347" y="137.203" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">18</text>
|
||||||
|
<text x="644.347" y="150.403" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="735.682" cy="142.003" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="3" data-gruppe="Familie Seifert (Studierenden-Familie 3)" data-name="Nicole Seifert" cx="735.682" cy="123.335" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Nicole Seifert — Familie Seifert (Studierenden-Familie 3)</title></circle>
|
||||||
|
<circle class="person" data-gid="3" data-gruppe="Familie Seifert (Studierenden-Familie 3)" data-name="Yusuf Seifert" cx="751.849" cy="151.337" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Yusuf Seifert — Familie Seifert (Studierenden-Familie 3)</title></circle>
|
||||||
|
<circle class="person" data-gid="3" data-gruppe="Familie Seifert (Studierenden-Familie 3)" data-name="Leni Seifert" cx="719.515" cy="151.337" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Leni Seifert — Familie Seifert (Studierenden-Familie 3)</title></circle>
|
||||||
|
<ellipse cx="735.682" cy="142.003" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="735.682" y="137.203" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">19</text>
|
||||||
|
<text x="735.682" y="150.403" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="918.352" cy="142.003" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="22" data-gruppe="Familie Engel (Studierenden-Familie 13)" data-name="Nicole Engel" cx="918.352" cy="123.335" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Nicole Engel — Familie Engel (Studierenden-Familie 13)</title></circle>
|
||||||
|
<circle class="person" data-gid="22" data-gruppe="Familie Engel (Studierenden-Familie 13)" data-name="Anja Engel" cx="934.519" cy="151.337" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Anja Engel — Familie Engel (Studierenden-Familie 13)</title></circle>
|
||||||
|
<circle class="person" data-gid="22" data-gruppe="Familie Engel (Studierenden-Familie 13)" data-name="Yusuf Engel" cx="902.186" cy="151.337" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Yusuf Engel — Familie Engel (Studierenden-Familie 13)</title></circle>
|
||||||
|
<ellipse cx="918.352" cy="142.003" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="918.352" y="137.203" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">21</text>
|
||||||
|
<text x="918.352" y="150.403" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="142.003" cy="233.338" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="32" data-gruppe="Doktorandenrunde Robotik" data-name="Prof. Dr. Anja Richter" cx="142.003" cy="214.67" r="12" fill="#469990" stroke="black" stroke-width="1"><title>Prof. Dr. Anja Richter — Doktorandenrunde Robotik</title></circle>
|
||||||
|
<circle class="person" data-gid="32" data-gruppe="Doktorandenrunde Robotik" data-name="Dr. Jan Thiel" cx="158.169" cy="242.672" r="12" fill="#469990" stroke="black" stroke-width="1"><title>Dr. Jan Thiel — Doktorandenrunde Robotik</title></circle>
|
||||||
|
<circle class="person" data-gid="32" data-gruppe="Doktorandenrunde Robotik" data-name="Thomas Sahin" cx="125.836" cy="242.672" r="12" fill="#469990" stroke="black" stroke-width="1"><title>Thomas Sahin — Doktorandenrunde Robotik</title></circle>
|
||||||
|
<ellipse cx="142.003" cy="233.338" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="142.003" y="228.538" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">22</text>
|
||||||
|
<text x="142.003" y="241.738" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="233.338" cy="233.338" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="28" data-gruppe="Familie Roth (Studierenden-Familie 16)" data-name="Sarah Roth" cx="233.338" cy="214.67" r="12" fill="#dcbeff" stroke="black" stroke-width="1"><title>Sarah Roth — Familie Roth (Studierenden-Familie 16)</title></circle>
|
||||||
|
<circle class="person" data-gid="28" data-gruppe="Familie Roth (Studierenden-Familie 16)" data-name="Christian Roth" cx="249.505" cy="242.672" r="12" fill="#dcbeff" stroke="black" stroke-width="1"><title>Christian Roth — Familie Roth (Studierenden-Familie 16)</title></circle>
|
||||||
|
<circle class="person" data-gid="28" data-gruppe="Familie Roth (Studierenden-Familie 16)" data-name="Sofia Roth" cx="217.171" cy="242.672" r="12" fill="#dcbeff" stroke="black" stroke-width="1"><title>Sofia Roth — Familie Roth (Studierenden-Familie 16)</title></circle>
|
||||||
|
<ellipse cx="233.338" cy="233.338" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="233.338" y="228.538" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">23</text>
|
||||||
|
<text x="233.338" y="241.738" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="416.009" cy="233.338" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="52" data-gruppe="Familie Aksoy (Studierenden-Familie 32)" data-name="Nadine Aksoy" cx="416.009" cy="214.67" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Nadine Aksoy — Familie Aksoy (Studierenden-Familie 32)</title></circle>
|
||||||
|
<circle class="person" data-gid="52" data-gruppe="Familie Aksoy (Studierenden-Familie 32)" data-name="Thomas Aksoy" cx="432.175" cy="242.672" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Thomas Aksoy — Familie Aksoy (Studierenden-Familie 32)</title></circle>
|
||||||
|
<circle class="person" data-gid="52" data-gruppe="Familie Aksoy (Studierenden-Familie 32)" data-name="Marie Aksoy" cx="399.842" cy="242.672" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Marie Aksoy — Familie Aksoy (Studierenden-Familie 32)</title></circle>
|
||||||
|
<ellipse cx="416.009" cy="233.338" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="416.009" y="228.538" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">25</text>
|
||||||
|
<text x="416.009" y="241.738" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="507.344" cy="233.338" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="37" data-gruppe="Institut fuer Luftfahrttechnik" data-name="Prof. Dr. Yusuf Ott" cx="507.344" cy="214.67" r="12" fill="#800000" stroke="black" stroke-width="1"><title>Prof. Dr. Yusuf Ott — Institut fuer Luftfahrttechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="37" data-gruppe="Institut fuer Luftfahrttechnik" data-name="Dr. Nadine Berger" cx="523.51" cy="242.672" r="12" fill="#800000" stroke="black" stroke-width="1"><title>Dr. Nadine Berger — Institut fuer Luftfahrttechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="37" data-gruppe="Institut fuer Luftfahrttechnik" data-name="Patrick Lehmann" cx="491.177" cy="242.672" r="12" fill="#800000" stroke="black" stroke-width="1"><title>Patrick Lehmann — Institut fuer Luftfahrttechnik</title></circle>
|
||||||
|
<ellipse cx="507.344" cy="233.338" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="507.344" y="228.538" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">26</text>
|
||||||
|
<text x="507.344" y="241.738" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="598.679" cy="233.338" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="39" data-gruppe="Familie Dietrich (Studierenden-Familie 19)" data-name="Jennifer Dietrich" cx="598.679" cy="214.67" r="12" fill="#aaffc3" stroke="black" stroke-width="1"><title>Jennifer Dietrich — Familie Dietrich (Studierenden-Familie 19)</title></circle>
|
||||||
|
<circle class="person" data-gid="39" data-gruppe="Familie Dietrich (Studierenden-Familie 19)" data-name="Marco Dietrich" cx="614.846" cy="242.672" r="12" fill="#aaffc3" stroke="black" stroke-width="1"><title>Marco Dietrich — Familie Dietrich (Studierenden-Familie 19)</title></circle>
|
||||||
|
<circle class="person" data-gid="39" data-gruppe="Familie Dietrich (Studierenden-Familie 19)" data-name="Sofia Dietrich" cx="582.512" cy="242.672" r="12" fill="#aaffc3" stroke="black" stroke-width="1"><title>Sofia Dietrich — Familie Dietrich (Studierenden-Familie 19)</title></circle>
|
||||||
|
<ellipse cx="598.679" cy="233.338" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="598.679" y="228.538" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">27</text>
|
||||||
|
<text x="598.679" y="241.738" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="370.341" cy="324.673" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="52" data-gruppe="Familie Aksoy (Studierenden-Familie 32)" data-name="Luca Aksoy" cx="370.341" cy="306.006" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Luca Aksoy — Familie Aksoy (Studierenden-Familie 32)</title></circle>
|
||||||
|
<circle class="person" data-gid="52" data-gruppe="Familie Aksoy (Studierenden-Familie 32)" data-name="Sofia Aksoy" cx="386.508" cy="334.007" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Sofia Aksoy — Familie Aksoy (Studierenden-Familie 32)</title></circle>
|
||||||
|
<circle class="person" data-gid="52" data-gruppe="Familie Aksoy (Studierenden-Familie 32)" data-name="Sergej Aksoy" cx="354.174" cy="334.007" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Sergej Aksoy — Familie Aksoy (Studierenden-Familie 32)</title></circle>
|
||||||
|
<ellipse cx="370.341" cy="324.673" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="370.341" y="319.873" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">33</text>
|
||||||
|
<text x="370.341" y="333.073" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="553.011" cy="324.673" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="2" data-gruppe="Familie Arnold (Studierenden-Familie 2)" data-name="Leni Arnold" cx="553.011" cy="306.006" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Leni Arnold — Familie Arnold (Studierenden-Familie 2)</title></circle>
|
||||||
|
<circle class="person" data-gid="2" data-gruppe="Familie Arnold (Studierenden-Familie 2)" data-name="Christian Arnold" cx="569.178" cy="334.007" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Christian Arnold — Familie Arnold (Studierenden-Familie 2)</title></circle>
|
||||||
|
<circle class="person" data-gid="2" data-gruppe="Familie Arnold (Studierenden-Familie 2)" data-name="Mila Arnold" cx="536.845" cy="334.007" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Mila Arnold — Familie Arnold (Studierenden-Familie 2)</title></circle>
|
||||||
|
<ellipse cx="553.011" cy="324.673" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="553.011" y="319.873" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">35</text>
|
||||||
|
<text x="553.011" y="333.073" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="233.338" cy="416.009" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="7" data-gruppe="Lehrstuhl Thermodynamik" data-name="Markus Barth" cx="233.338" cy="397.341" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Markus Barth — Lehrstuhl Thermodynamik</title></circle>
|
||||||
|
<circle class="person" data-gid="7" data-gruppe="Lehrstuhl Thermodynamik" data-name="Matthias Petrov" cx="249.505" cy="425.342" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Matthias Petrov — Lehrstuhl Thermodynamik</title></circle>
|
||||||
|
<circle class="person" data-gid="7" data-gruppe="Lehrstuhl Thermodynamik" data-name="Andreas Weber" cx="217.171" cy="425.342" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Andreas Weber — Lehrstuhl Thermodynamik</title></circle>
|
||||||
|
<ellipse cx="233.338" cy="416.009" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="233.338" y="411.209" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">39</text>
|
||||||
|
<text x="233.338" y="424.409" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="324.673" cy="416.009" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="43" data-gruppe="Familie Rossi (Studierenden-Familie 23)" data-name="Melanie Rossi" cx="324.673" cy="397.341" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Melanie Rossi — Familie Rossi (Studierenden-Familie 23)</title></circle>
|
||||||
|
<circle class="person" data-gid="43" data-gruppe="Familie Rossi (Studierenden-Familie 23)" data-name="Luca Rossi" cx="340.84" cy="425.342" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Luca Rossi — Familie Rossi (Studierenden-Familie 23)</title></circle>
|
||||||
|
<circle class="person" data-gid="43" data-gruppe="Familie Rossi (Studierenden-Familie 23)" data-name="Emilia Rossi" cx="308.507" cy="425.342" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Emilia Rossi — Familie Rossi (Studierenden-Familie 23)</title></circle>
|
||||||
|
<ellipse cx="324.673" cy="416.009" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="324.673" y="411.209" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">40</text>
|
||||||
|
<text x="324.673" y="424.409" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="416.009" cy="416.009" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="44" data-gruppe="Familie Braun (Studierenden-Familie 24)" data-name="Julia Braun" cx="416.009" cy="397.341" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Julia Braun — Familie Braun (Studierenden-Familie 24)</title></circle>
|
||||||
|
<circle class="person" data-gid="44" data-gruppe="Familie Braun (Studierenden-Familie 24)" data-name="Milan Braun" cx="432.175" cy="425.342" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Milan Braun — Familie Braun (Studierenden-Familie 24)</title></circle>
|
||||||
|
<circle class="person" data-gid="44" data-gruppe="Familie Braun (Studierenden-Familie 24)" data-name="Nadine Braun" cx="399.842" cy="425.342" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Nadine Braun — Familie Braun (Studierenden-Familie 24)</title></circle>
|
||||||
|
<ellipse cx="416.009" cy="416.009" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="416.009" y="411.209" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">41</text>
|
||||||
|
<text x="416.009" y="424.409" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="507.344" cy="416.009" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="44" data-gruppe="Familie Braun (Studierenden-Familie 24)" data-name="Jan Braun" cx="507.344" cy="397.341" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Jan Braun — Familie Braun (Studierenden-Familie 24)</title></circle>
|
||||||
|
<circle class="person" data-gid="44" data-gruppe="Familie Braun (Studierenden-Familie 24)" data-name="Dragana Braun" cx="523.51" cy="425.342" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Dragana Braun — Familie Braun (Studierenden-Familie 24)</title></circle>
|
||||||
|
<circle class="person" data-gid="44" data-gruppe="Familie Braun (Studierenden-Familie 24)" data-name="Christian Braun" cx="491.177" cy="425.342" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Christian Braun — Familie Braun (Studierenden-Familie 24)</title></circle>
|
||||||
|
<ellipse cx="507.344" cy="416.009" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="507.344" y="411.209" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">42</text>
|
||||||
|
<text x="507.344" y="424.409" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="690.014" cy="416.009" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="64" data-gruppe="Familie Lange (Studierenden-Familie 44)" data-name="Jan Lange" cx="690.014" cy="397.341" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Jan Lange — Familie Lange (Studierenden-Familie 44)</title></circle>
|
||||||
|
<circle class="person" data-gid="64" data-gruppe="Familie Lange (Studierenden-Familie 44)" data-name="Svenja Lange" cx="706.181" cy="425.342" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Svenja Lange — Familie Lange (Studierenden-Familie 44)</title></circle>
|
||||||
|
<circle class="person" data-gid="64" data-gruppe="Familie Lange (Studierenden-Familie 44)" data-name="Sofia Lange" cx="673.848" cy="425.342" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Sofia Lange — Familie Lange (Studierenden-Familie 44)</title></circle>
|
||||||
|
<ellipse cx="690.014" cy="416.009" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="690.014" y="411.209" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">44</text>
|
||||||
|
<text x="690.014" y="424.409" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1512.03" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="40" data-gruppe="Familie Thiel (Studierenden-Familie 20)" data-name="Yusuf Thiel" cx="1512.03" cy="32" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Yusuf Thiel — Familie Thiel (Studierenden-Familie 20)</title></circle>
|
||||||
|
<circle class="person" data-gid="40" data-gruppe="Familie Thiel (Studierenden-Familie 20)" data-name="Christina Thiel" cx="1528.2" cy="60.0014" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Christina Thiel — Familie Thiel (Studierenden-Familie 20)</title></circle>
|
||||||
|
<circle class="person" data-gid="40" data-gruppe="Familie Thiel (Studierenden-Familie 20)" data-name="Julia Thiel" cx="1495.86" cy="60.0014" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Julia Thiel — Familie Thiel (Studierenden-Familie 20)</title></circle>
|
||||||
|
<ellipse cx="1512.03" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1512.03" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">46</text>
|
||||||
|
<text x="1512.03" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1603.37" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="41" data-gruppe="Familie Schmitt (Studierenden-Familie 21)" data-name="Sarah Schmitt" cx="1603.37" cy="32" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Sarah Schmitt — Familie Schmitt (Studierenden-Familie 21)</title></circle>
|
||||||
|
<circle class="person" data-gid="41" data-gruppe="Familie Schmitt (Studierenden-Familie 21)" data-name="Markus Schmitt" cx="1619.53" cy="60.0014" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Markus Schmitt — Familie Schmitt (Studierenden-Familie 21)</title></circle>
|
||||||
|
<circle class="person" data-gid="41" data-gruppe="Familie Schmitt (Studierenden-Familie 21)" data-name="Sofia Schmitt" cx="1587.2" cy="60.0014" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Sofia Schmitt — Familie Schmitt (Studierenden-Familie 21)</title></circle>
|
||||||
|
<ellipse cx="1603.37" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1603.37" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">47</text>
|
||||||
|
<text x="1603.37" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1694.7" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="33" data-gruppe="Familie Koch (Studierenden-Familie 17)" data-name="Michael Koch" cx="1694.7" cy="32" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Michael Koch — Familie Koch (Studierenden-Familie 17)</title></circle>
|
||||||
|
<circle class="person" data-gid="33" data-gruppe="Familie Koch (Studierenden-Familie 17)" data-name="Emil Koch" cx="1710.87" cy="60.0014" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Emil Koch — Familie Koch (Studierenden-Familie 17)</title></circle>
|
||||||
|
<circle class="person" data-gid="33" data-gruppe="Familie Koch (Studierenden-Familie 17)" data-name="Olga Koch" cx="1678.54" cy="60.0014" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Olga Koch — Familie Koch (Studierenden-Familie 17)</title></circle>
|
||||||
|
<ellipse cx="1694.7" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1694.7" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">48</text>
|
||||||
|
<text x="1694.7" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1786.04" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="33" data-gruppe="Familie Koch (Studierenden-Familie 17)" data-name="Sarah Koch" cx="1786.04" cy="32" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Sarah Koch — Familie Koch (Studierenden-Familie 17)</title></circle>
|
||||||
|
<circle class="person" data-gid="33" data-gruppe="Familie Koch (Studierenden-Familie 17)" data-name="Jan Koch" cx="1802.2" cy="60.0014" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Jan Koch — Familie Koch (Studierenden-Familie 17)</title></circle>
|
||||||
|
<circle class="person" data-gid="33" data-gruppe="Familie Koch (Studierenden-Familie 17)" data-name="Marie Koch" cx="1769.87" cy="60.0014" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Marie Koch — Familie Koch (Studierenden-Familie 17)</title></circle>
|
||||||
|
<ellipse cx="1786.04" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1786.04" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">49</text>
|
||||||
|
<text x="1786.04" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="2242.71" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="1" data-gruppe="Familie Bianchi (Studierenden-Familie 1)" data-name="Sandra Bianchi" cx="2242.71" cy="32" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Sandra Bianchi — Familie Bianchi (Studierenden-Familie 1)</title></circle>
|
||||||
|
<circle class="person" data-gid="1" data-gruppe="Familie Bianchi (Studierenden-Familie 1)" data-name="Thomas Bianchi" cx="2258.88" cy="60.0014" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Thomas Bianchi — Familie Bianchi (Studierenden-Familie 1)</title></circle>
|
||||||
|
<circle class="person" data-gid="1" data-gruppe="Familie Bianchi (Studierenden-Familie 1)" data-name="Mia Bianchi" cx="2226.55" cy="60.0014" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Mia Bianchi — Familie Bianchi (Studierenden-Familie 1)</title></circle>
|
||||||
|
<ellipse cx="2242.71" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="2242.71" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">54</text>
|
||||||
|
<text x="2242.71" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1649.03" cy="142.003" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="29" data-gruppe="Institut fuer Bauingenieurwesen" data-name="Prof. Dr. Marco Seifert" cx="1649.03" cy="123.335" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Prof. Dr. Marco Seifert — Institut fuer Bauingenieurwesen</title></circle>
|
||||||
|
<circle class="person" data-gid="29" data-gruppe="Institut fuer Bauingenieurwesen" data-name="Matthias Krause" cx="1665.2" cy="151.337" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Matthias Krause — Institut fuer Bauingenieurwesen</title></circle>
|
||||||
|
<circle class="person" data-gid="29" data-gruppe="Institut fuer Bauingenieurwesen" data-name="Giovanna Schwarz" cx="1632.87" cy="151.337" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Giovanna Schwarz — Institut fuer Bauingenieurwesen</title></circle>
|
||||||
|
<ellipse cx="1649.03" cy="142.003" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1649.03" y="137.203" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">58</text>
|
||||||
|
<text x="1649.03" y="150.403" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="2014.38" cy="142.003" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="24" data-gruppe="Institut fuer Chemie" data-name="Luca Kovac" cx="2014.38" cy="123.335" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Luca Kovac — Institut fuer Chemie</title></circle>
|
||||||
|
<circle class="person" data-gid="24" data-gruppe="Institut fuer Chemie" data-name="Dr. Dragana Krause" cx="2030.54" cy="151.337" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Dr. Dragana Krause — Institut fuer Chemie</title></circle>
|
||||||
|
<circle class="person" data-gid="24" data-gruppe="Institut fuer Chemie" data-name="Prof. Dr. Dennis Schmitt" cx="1998.21" cy="151.337" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Prof. Dr. Dennis Schmitt — Institut fuer Chemie</title></circle>
|
||||||
|
<ellipse cx="2014.38" cy="142.003" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="2014.38" y="137.203" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">62</text>
|
||||||
|
<text x="2014.38" y="150.403" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1603.37" cy="233.338" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="29" data-gruppe="Institut fuer Bauingenieurwesen" data-name="Yusuf Weber" cx="1603.37" cy="214.67" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Yusuf Weber — Institut fuer Bauingenieurwesen</title></circle>
|
||||||
|
<circle class="person" data-gid="29" data-gruppe="Institut fuer Bauingenieurwesen" data-name="Dr. Patrick Kraus" cx="1619.53" cy="242.672" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Dr. Patrick Kraus — Institut fuer Bauingenieurwesen</title></circle>
|
||||||
|
<circle class="person" data-gid="29" data-gruppe="Institut fuer Bauingenieurwesen" data-name="Dr. Aylin Ludwig" cx="1587.2" cy="242.672" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Dr. Aylin Ludwig — Institut fuer Bauingenieurwesen</title></circle>
|
||||||
|
<ellipse cx="1603.37" cy="233.338" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1603.37" y="228.538" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">67</text>
|
||||||
|
<text x="1603.37" y="241.738" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1786.04" cy="233.338" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="55" data-gruppe="Familie Franke (Studierenden-Familie 35)" data-name="Olga Franke" cx="1786.04" cy="214.67" r="12" fill="#469990" stroke="black" stroke-width="1"><title>Olga Franke — Familie Franke (Studierenden-Familie 35)</title></circle>
|
||||||
|
<circle class="person" data-gid="55" data-gruppe="Familie Franke (Studierenden-Familie 35)" data-name="Amira Franke" cx="1802.2" cy="242.672" r="12" fill="#469990" stroke="black" stroke-width="1"><title>Amira Franke — Familie Franke (Studierenden-Familie 35)</title></circle>
|
||||||
|
<circle class="person" data-gid="55" data-gruppe="Familie Franke (Studierenden-Familie 35)" data-name="Marco Franke" cx="1769.87" cy="242.672" r="12" fill="#469990" stroke="black" stroke-width="1"><title>Marco Franke — Familie Franke (Studierenden-Familie 35)</title></circle>
|
||||||
|
<ellipse cx="1786.04" cy="233.338" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1786.04" y="228.538" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">69</text>
|
||||||
|
<text x="1786.04" y="241.738" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1968.71" cy="233.338" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="24" data-gruppe="Institut fuer Chemie" data-name="Luca Ott" cx="1968.71" cy="214.67" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Luca Ott — Institut fuer Chemie</title></circle>
|
||||||
|
<circle class="person" data-gid="24" data-gruppe="Institut fuer Chemie" data-name="Patrick Zimmermann" cx="1984.87" cy="242.672" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Patrick Zimmermann — Institut fuer Chemie</title></circle>
|
||||||
|
<circle class="person" data-gid="24" data-gruppe="Institut fuer Chemie" data-name="Stefan Richter" cx="1952.54" cy="242.672" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Stefan Richter — Institut fuer Chemie</title></circle>
|
||||||
|
<ellipse cx="1968.71" cy="233.338" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1968.71" y="228.538" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">71</text>
|
||||||
|
<text x="1968.71" y="241.738" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="2060.04" cy="233.338" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="49" data-gruppe="Familie Ott (Studierenden-Familie 29)" data-name="Matthias Ott" cx="2060.04" cy="214.67" r="12" fill="#dcbeff" stroke="black" stroke-width="1"><title>Matthias Ott — Familie Ott (Studierenden-Familie 29)</title></circle>
|
||||||
|
<circle class="person" data-gid="49" data-gruppe="Familie Ott (Studierenden-Familie 29)" data-name="Hannah Ott" cx="2076.21" cy="242.672" r="12" fill="#dcbeff" stroke="black" stroke-width="1"><title>Hannah Ott — Familie Ott (Studierenden-Familie 29)</title></circle>
|
||||||
|
<circle class="person" data-gid="49" data-gruppe="Familie Ott (Studierenden-Familie 29)" data-name="Olga Ott" cx="2043.88" cy="242.672" r="12" fill="#dcbeff" stroke="black" stroke-width="1"><title>Olga Ott — Familie Ott (Studierenden-Familie 29)</title></circle>
|
||||||
|
<ellipse cx="2060.04" cy="233.338" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="2060.04" y="228.538" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">72</text>
|
||||||
|
<text x="2060.04" y="241.738" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1649.03" cy="324.673" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="5" data-gruppe="Institut fuer Maschinenwesen" data-name="Prof. Dr. Yusuf Esposito" cx="1649.03" cy="306.006" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Prof. Dr. Yusuf Esposito — Institut fuer Maschinenwesen</title></circle>
|
||||||
|
<circle class="person" data-gid="5" data-gruppe="Institut fuer Maschinenwesen" data-name="Marija Becker" cx="1665.2" cy="334.007" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Marija Becker — Institut fuer Maschinenwesen</title></circle>
|
||||||
|
<circle class="person" data-gid="5" data-gruppe="Institut fuer Maschinenwesen" data-name="Matthias Kovac" cx="1632.87" cy="334.007" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Matthias Kovac — Institut fuer Maschinenwesen</title></circle>
|
||||||
|
<ellipse cx="1649.03" cy="324.673" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1649.03" y="319.873" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">76</text>
|
||||||
|
<text x="1649.03" y="333.073" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1740.37" cy="324.673" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="6" data-gruppe="Familie Kaya (Studierenden-Familie 5)" data-name="Luca Kaya" cx="1740.37" cy="306.006" r="12" fill="#800000" stroke="black" stroke-width="1"><title>Luca Kaya — Familie Kaya (Studierenden-Familie 5)</title></circle>
|
||||||
|
<circle class="person" data-gid="6" data-gruppe="Familie Kaya (Studierenden-Familie 5)" data-name="Christina Kaya" cx="1756.54" cy="334.007" r="12" fill="#800000" stroke="black" stroke-width="1"><title>Christina Kaya — Familie Kaya (Studierenden-Familie 5)</title></circle>
|
||||||
|
<circle class="person" data-gid="6" data-gruppe="Familie Kaya (Studierenden-Familie 5)" data-name="Nicole Kaya" cx="1724.2" cy="334.007" r="12" fill="#800000" stroke="black" stroke-width="1"><title>Nicole Kaya — Familie Kaya (Studierenden-Familie 5)</title></circle>
|
||||||
|
<ellipse cx="1740.37" cy="324.673" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1740.37" y="319.873" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">77</text>
|
||||||
|
<text x="1740.37" y="333.073" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="2105.71" cy="324.673" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="54" data-gruppe="Familie Polat (Studierenden-Familie 34)" data-name="Sarah Polat" cx="2105.71" cy="306.006" r="12" fill="#aaffc3" stroke="black" stroke-width="1"><title>Sarah Polat — Familie Polat (Studierenden-Familie 34)</title></circle>
|
||||||
|
<circle class="person" data-gid="54" data-gruppe="Familie Polat (Studierenden-Familie 34)" data-name="Markus Polat" cx="2121.88" cy="334.007" r="12" fill="#aaffc3" stroke="black" stroke-width="1"><title>Markus Polat — Familie Polat (Studierenden-Familie 34)</title></circle>
|
||||||
|
<circle class="person" data-gid="54" data-gruppe="Familie Polat (Studierenden-Familie 34)" data-name="Katrin Polat" cx="2089.54" cy="334.007" r="12" fill="#aaffc3" stroke="black" stroke-width="1"><title>Katrin Polat — Familie Polat (Studierenden-Familie 34)</title></circle>
|
||||||
|
<ellipse cx="2105.71" cy="324.673" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="2105.71" y="319.873" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">81</text>
|
||||||
|
<text x="2105.71" y="333.073" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="2197.05" cy="324.673" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="10" data-gruppe="Institut fuer Informatik" data-name="Olga Roth" cx="2197.05" cy="306.006" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Olga Roth — Institut fuer Informatik</title></circle>
|
||||||
|
<circle class="person" data-gid="10" data-gruppe="Institut fuer Informatik" data-name="Prof. Dr. Emre Albrecht" cx="2213.21" cy="334.007" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Prof. Dr. Emre Albrecht — Institut fuer Informatik</title></circle>
|
||||||
|
<circle class="person" data-gid="10" data-gruppe="Institut fuer Informatik" data-name="Thomas Bianchi" cx="2180.88" cy="334.007" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Thomas Bianchi — Institut fuer Informatik</title></circle>
|
||||||
|
<ellipse cx="2197.05" cy="324.673" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="2197.05" y="319.873" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">82</text>
|
||||||
|
<text x="2197.05" y="333.073" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1786.04" cy="416.009" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="42" data-gruppe="Familie Hartmann (Studierenden-Familie 22)" data-name="Marija Hartmann" cx="1786.04" cy="397.341" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Marija Hartmann — Familie Hartmann (Studierenden-Familie 22)</title></circle>
|
||||||
|
<circle class="person" data-gid="42" data-gruppe="Familie Hartmann (Studierenden-Familie 22)" data-name="Thomas Hartmann" cx="1802.2" cy="425.342" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Thomas Hartmann — Familie Hartmann (Studierenden-Familie 22)</title></circle>
|
||||||
|
<circle class="person" data-gid="42" data-gruppe="Familie Hartmann (Studierenden-Familie 22)" data-name="Olga Hartmann" cx="1769.87" cy="425.342" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Olga Hartmann — Familie Hartmann (Studierenden-Familie 22)</title></circle>
|
||||||
|
<ellipse cx="1786.04" cy="416.009" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1786.04" y="411.209" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">84</text>
|
||||||
|
<text x="1786.04" y="424.409" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1877.37" cy="416.009" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="8" data-gruppe="Familie Schmidt (Studierenden-Familie 6)" data-name="Matthias Schmidt" cx="1877.37" cy="397.341" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Matthias Schmidt — Familie Schmidt (Studierenden-Familie 6)</title></circle>
|
||||||
|
<circle class="person" data-gid="8" data-gruppe="Familie Schmidt (Studierenden-Familie 6)" data-name="Marie Schmidt" cx="1893.54" cy="425.342" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Marie Schmidt — Familie Schmidt (Studierenden-Familie 6)</title></circle>
|
||||||
|
<circle class="person" data-gid="8" data-gruppe="Familie Schmidt (Studierenden-Familie 6)" data-name="Giovanna Schmidt" cx="1861.21" cy="425.342" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Giovanna Schmidt — Familie Schmidt (Studierenden-Familie 6)</title></circle>
|
||||||
|
<ellipse cx="1877.37" cy="416.009" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1877.37" y="411.209" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">85</text>
|
||||||
|
<text x="1877.37" y="424.409" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="2060.04" cy="416.009" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="26" data-gruppe="Familie Frank (Studierenden-Familie 14)" data-name="Lena Frank" cx="2060.04" cy="397.341" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Lena Frank — Familie Frank (Studierenden-Familie 14)</title></circle>
|
||||||
|
<circle class="person" data-gid="26" data-gruppe="Familie Frank (Studierenden-Familie 14)" data-name="Marie Frank" cx="2076.21" cy="425.342" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Marie Frank — Familie Frank (Studierenden-Familie 14)</title></circle>
|
||||||
|
<circle class="person" data-gid="26" data-gruppe="Familie Frank (Studierenden-Familie 14)" data-name="Finn Frank" cx="2043.88" cy="425.342" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Finn Frank — Familie Frank (Studierenden-Familie 14)</title></circle>
|
||||||
|
<ellipse cx="2060.04" cy="416.009" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="2060.04" y="411.209" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">87</text>
|
||||||
|
<text x="2060.04" y="424.409" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="142.003" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="65" data-gruppe="Familie Lehmann (Studierenden-Familie 45)" data-name="Layla Lehmann" cx="142.003" cy="32" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Layla Lehmann — Familie Lehmann (Studierenden-Familie 45)</title></circle>
|
||||||
|
<circle class="person" data-gid="65" data-gruppe="Familie Lehmann (Studierenden-Familie 45)" data-name="Thomas Lehmann" cx="160.67" cy="50.6676" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Thomas Lehmann — Familie Lehmann (Studierenden-Familie 45)</title></circle>
|
||||||
|
<circle class="person" data-gid="65" data-gruppe="Familie Lehmann (Studierenden-Familie 45)" data-name="Nicole Lehmann" cx="142.003" cy="69.3352" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Nicole Lehmann — Familie Lehmann (Studierenden-Familie 45)</title></circle>
|
||||||
|
<circle class="person" data-gid="65" data-gruppe="Familie Lehmann (Studierenden-Familie 45)" data-name="Markus Lehmann" cx="123.335" cy="50.6676" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Markus Lehmann — Familie Lehmann (Studierenden-Familie 45)</title></circle>
|
||||||
|
<ellipse cx="142.003" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="142.003" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">2</text>
|
||||||
|
<text x="142.003" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="233.338" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="25" data-gruppe="Lehrstuhl Fahrzeugtechnik" data-name="Emre Klein" cx="233.338" cy="32" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Emre Klein — Lehrstuhl Fahrzeugtechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="25" data-gruppe="Lehrstuhl Fahrzeugtechnik" data-name="Dr. Patrick Kaya" cx="252.006" cy="50.6676" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Dr. Patrick Kaya — Lehrstuhl Fahrzeugtechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="25" data-gruppe="Lehrstuhl Fahrzeugtechnik" data-name="Dr. Christina Krause" cx="233.338" cy="69.3352" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Dr. Christina Krause — Lehrstuhl Fahrzeugtechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="69" data-gruppe="Familie Weber (Studierenden-Familie 49)" data-name="Julia Weber" cx="214.67" cy="50.6676" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Julia Weber — Familie Weber (Studierenden-Familie 49)</title></circle>
|
||||||
|
<ellipse cx="233.338" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="233.338" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">3</text>
|
||||||
|
<text x="233.338" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="324.673" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="25" data-gruppe="Lehrstuhl Fahrzeugtechnik" data-name="Marco Winkler" cx="324.673" cy="32" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Marco Winkler — Lehrstuhl Fahrzeugtechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="25" data-gruppe="Lehrstuhl Fahrzeugtechnik" data-name="Prof. Dr. Yusuf Seidel" cx="343.341" cy="50.6676" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Prof. Dr. Yusuf Seidel — Lehrstuhl Fahrzeugtechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="25" data-gruppe="Lehrstuhl Fahrzeugtechnik" data-name="Yusuf Bauer" cx="324.673" cy="69.3352" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Yusuf Bauer — Lehrstuhl Fahrzeugtechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="25" data-gruppe="Lehrstuhl Fahrzeugtechnik" data-name="Dr. Jan Bianchi" cx="306.006" cy="50.6676" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Dr. Jan Bianchi — Lehrstuhl Fahrzeugtechnik</title></circle>
|
||||||
|
<ellipse cx="324.673" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="324.673" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">4</text>
|
||||||
|
<text x="324.673" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="416.009" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Dr. h.c. Alexander Grothe" cx="416.009" cy="32" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Dr. h.c. Alexander Grothe — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Beate Grothe" cx="434.676" cy="50.6676" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Beate Grothe — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Dr. Ferdinand Kessler" cx="416.009" cy="69.3352" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Dr. Ferdinand Kessler — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Viktoria Kessler" cx="397.341" cy="50.6676" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Viktoria Kessler — VIP / feste Platzierung</title></circle>
|
||||||
|
<ellipse cx="416.009" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="416.009" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">5</text>
|
||||||
|
<text x="416.009" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="507.344" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Elisabeth Steinbach" cx="507.344" cy="32" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Elisabeth Steinbach — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Dr. Konstantin Freiherr von Waldeck" cx="526.011" cy="50.6676" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Dr. Konstantin Freiherr von Waldeck — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Antonia Freifrau von Waldeck" cx="507.344" cy="69.3352" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Antonia Freifrau von Waldeck — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Georg Steinbach" cx="488.676" cy="50.6676" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Georg Steinbach — VIP / feste Platzierung</title></circle>
|
||||||
|
<ellipse cx="507.344" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="507.344" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">6</text>
|
||||||
|
<text x="507.344" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="598.679" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Heinrich Dallmann" cx="598.679" cy="32" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Heinrich Dallmann — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Margarete Dallmann" cx="617.347" cy="50.6676" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Margarete Dallmann — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Maximilian Dallmann" cx="598.679" cy="69.3352" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Maximilian Dallmann — VIP / feste Platzierung</title></circle>
|
||||||
|
<circle class="person" data-gid="-1" data-gruppe="VIP / feste Platzierung" data-name="Charlotte Dallmann" cx="580.011" cy="50.6676" r="12" fill="#888888" stroke="black" stroke-width="1"><title>Charlotte Dallmann — VIP / feste Platzierung</title></circle>
|
||||||
|
<ellipse cx="598.679" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="598.679" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">7</text>
|
||||||
|
<text x="598.679" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="781.35" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="68" data-gruppe="Familie Ludwig (Studierenden-Familie 48)" data-name="Giovanna Ludwig" cx="781.35" cy="32" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Giovanna Ludwig — Familie Ludwig (Studierenden-Familie 48)</title></circle>
|
||||||
|
<circle class="person" data-gid="68" data-gruppe="Familie Ludwig (Studierenden-Familie 48)" data-name="Emre Ludwig" cx="800.017" cy="50.6676" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Emre Ludwig — Familie Ludwig (Studierenden-Familie 48)</title></circle>
|
||||||
|
<circle class="person" data-gid="68" data-gruppe="Familie Ludwig (Studierenden-Familie 48)" data-name="Elif Ludwig" cx="781.35" cy="69.3352" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Elif Ludwig — Familie Ludwig (Studierenden-Familie 48)</title></circle>
|
||||||
|
<circle class="person" data-gid="68" data-gruppe="Familie Ludwig (Studierenden-Familie 48)" data-name="Elias Ludwig" cx="762.682" cy="50.6676" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Elias Ludwig — Familie Ludwig (Studierenden-Familie 48)</title></circle>
|
||||||
|
<ellipse cx="781.35" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="781.35" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">9</text>
|
||||||
|
<text x="781.35" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="872.685" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="16" data-gruppe="Lehrstuhl Mathematik" data-name="Giovanna Petrov" cx="872.685" cy="32" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Giovanna Petrov — Lehrstuhl Mathematik</title></circle>
|
||||||
|
<circle class="person" data-gid="16" data-gruppe="Lehrstuhl Mathematik" data-name="Dr. Nadine Stein" cx="891.352" cy="50.6676" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Dr. Nadine Stein — Lehrstuhl Mathematik</title></circle>
|
||||||
|
<circle class="person" data-gid="16" data-gruppe="Lehrstuhl Mathematik" data-name="Markus Schmitt" cx="872.685" cy="69.3352" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Markus Schmitt — Lehrstuhl Mathematik</title></circle>
|
||||||
|
<circle class="person" data-gid="16" data-gruppe="Lehrstuhl Mathematik" data-name="Christian Peters" cx="854.017" cy="50.6676" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Christian Peters — Lehrstuhl Mathematik</title></circle>
|
||||||
|
<ellipse cx="872.685" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="872.685" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">10</text>
|
||||||
|
<text x="872.685" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="96.3352" cy="142.003" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="12" data-gruppe="Institut fuer Werkstoffkunde" data-name="Matthias Popescu" cx="96.3352" cy="123.335" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Matthias Popescu — Institut fuer Werkstoffkunde</title></circle>
|
||||||
|
<circle class="person" data-gid="4" data-gruppe="Familie Albrecht (Studierenden-Familie 4)" data-name="Sarah Albrecht" cx="115.003" cy="142.003" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Sarah Albrecht — Familie Albrecht (Studierenden-Familie 4)</title></circle>
|
||||||
|
<circle class="person" data-gid="4" data-gruppe="Familie Albrecht (Studierenden-Familie 4)" data-name="Andreas Albrecht" cx="96.3352" cy="160.67" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Andreas Albrecht — Familie Albrecht (Studierenden-Familie 4)</title></circle>
|
||||||
|
<circle class="person" data-gid="12" data-gruppe="Institut fuer Werkstoffkunde" data-name="Prof. Dr. Markus Stein" cx="77.6676" cy="142.003" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Prof. Dr. Markus Stein — Institut fuer Werkstoffkunde</title></circle>
|
||||||
|
<ellipse cx="96.3352" cy="142.003" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="96.3352" y="137.203" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">12</text>
|
||||||
|
<text x="96.3352" y="150.403" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="187.67" cy="142.003" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="13" data-gruppe="Lehrstuhl Stroemungsmechanik" data-name="Prof. Dr. Yusuf Albrecht" cx="187.67" cy="123.335" r="12" fill="#469990" stroke="black" stroke-width="1"><title>Prof. Dr. Yusuf Albrecht — Lehrstuhl Stroemungsmechanik</title></circle>
|
||||||
|
<circle class="person" data-gid="65" data-gruppe="Familie Lehmann (Studierenden-Familie 45)" data-name="Giovanna Lehmann" cx="206.338" cy="142.003" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Giovanna Lehmann — Familie Lehmann (Studierenden-Familie 45)</title></circle>
|
||||||
|
<circle class="person" data-gid="65" data-gruppe="Familie Lehmann (Studierenden-Familie 45)" data-name="Milan Lehmann" cx="187.67" cy="160.67" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Milan Lehmann — Familie Lehmann (Studierenden-Familie 45)</title></circle>
|
||||||
|
<circle class="person" data-gid="13" data-gruppe="Lehrstuhl Stroemungsmechanik" data-name="Svenja Simon" cx="169.003" cy="142.003" r="12" fill="#469990" stroke="black" stroke-width="1"><title>Svenja Simon — Lehrstuhl Stroemungsmechanik</title></circle>
|
||||||
|
<ellipse cx="187.67" cy="142.003" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="187.67" y="137.203" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">13</text>
|
||||||
|
<text x="187.67" y="150.403" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="461.676" cy="142.003" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="14" data-gruppe="Institut fuer Elektrotechnik" data-name="Thomas Hansen" cx="461.676" cy="123.335" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Thomas Hansen — Institut fuer Elektrotechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="14" data-gruppe="Institut fuer Elektrotechnik" data-name="Nicole Schmidt" cx="480.344" cy="142.003" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Nicole Schmidt — Institut fuer Elektrotechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="14" data-gruppe="Institut fuer Elektrotechnik" data-name="Julia Nguyen" cx="461.676" cy="160.67" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Julia Nguyen — Institut fuer Elektrotechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="14" data-gruppe="Institut fuer Elektrotechnik" data-name="Dr. Stefanie Seifert" cx="443.009" cy="142.003" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Dr. Stefanie Seifert — Institut fuer Elektrotechnik</title></circle>
|
||||||
|
<ellipse cx="461.676" cy="142.003" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="461.676" y="137.203" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">16</text>
|
||||||
|
<text x="461.676" y="150.403" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="827.017" cy="142.003" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="3" data-gruppe="Familie Seifert (Studierenden-Familie 3)" data-name="Timo Seifert" cx="827.017" cy="123.335" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Timo Seifert — Familie Seifert (Studierenden-Familie 3)</title></circle>
|
||||||
|
<circle class="person" data-gid="3" data-gruppe="Familie Seifert (Studierenden-Familie 3)" data-name="Elif Seifert" cx="845.685" cy="142.003" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Elif Seifert — Familie Seifert (Studierenden-Familie 3)</title></circle>
|
||||||
|
<circle class="person" data-gid="22" data-gruppe="Familie Engel (Studierenden-Familie 13)" data-name="Julia Engel" cx="827.017" cy="160.67" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Julia Engel — Familie Engel (Studierenden-Familie 13)</title></circle>
|
||||||
|
<circle class="person" data-gid="22" data-gruppe="Familie Engel (Studierenden-Familie 13)" data-name="Anton Engel" cx="808.35" cy="142.003" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Anton Engel — Familie Engel (Studierenden-Familie 13)</title></circle>
|
||||||
|
<ellipse cx="827.017" cy="142.003" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="827.017" y="137.203" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">20</text>
|
||||||
|
<text x="827.017" y="150.403" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="324.673" cy="233.338" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="61" data-gruppe="Familie Berger (Studierenden-Familie 41)" data-name="Andreas Berger" cx="324.673" cy="214.67" r="12" fill="#dcbeff" stroke="black" stroke-width="1"><title>Andreas Berger — Familie Berger (Studierenden-Familie 41)</title></circle>
|
||||||
|
<circle class="person" data-gid="18" data-gruppe="Familie Celik (Studierenden-Familie 10)" data-name="Patrick Celik" cx="343.341" cy="233.338" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Patrick Celik — Familie Celik (Studierenden-Familie 10)</title></circle>
|
||||||
|
<circle class="person" data-gid="18" data-gruppe="Familie Celik (Studierenden-Familie 10)" data-name="Elif Celik" cx="324.673" cy="252.006" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Elif Celik — Familie Celik (Studierenden-Familie 10)</title></circle>
|
||||||
|
<circle class="person" data-gid="61" data-gruppe="Familie Berger (Studierenden-Familie 41)" data-name="Svenja Berger" cx="306.006" cy="233.338" r="12" fill="#dcbeff" stroke="black" stroke-width="1"><title>Svenja Berger — Familie Berger (Studierenden-Familie 41)</title></circle>
|
||||||
|
<ellipse cx="324.673" cy="233.338" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="324.673" y="228.538" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">24</text>
|
||||||
|
<text x="324.673" y="241.738" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="690.014" cy="233.338" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="36" data-gruppe="Lehrstuhl Mechatronik" data-name="Prof. Dr. Timo Kaya" cx="690.014" cy="214.67" r="12" fill="#800000" stroke="black" stroke-width="1"><title>Prof. Dr. Timo Kaya — Lehrstuhl Mechatronik</title></circle>
|
||||||
|
<circle class="person" data-gid="36" data-gruppe="Lehrstuhl Mechatronik" data-name="Dr. Sandra Demir" cx="708.682" cy="233.338" r="12" fill="#800000" stroke="black" stroke-width="1"><title>Dr. Sandra Demir — Lehrstuhl Mechatronik</title></circle>
|
||||||
|
<circle class="person" data-gid="56" data-gruppe="Familie Kovac (Studierenden-Familie 36)" data-name="Lena Kovac" cx="690.014" cy="252.006" r="12" fill="#aaffc3" stroke="black" stroke-width="1"><title>Lena Kovac — Familie Kovac (Studierenden-Familie 36)</title></circle>
|
||||||
|
<circle class="person" data-gid="56" data-gruppe="Familie Kovac (Studierenden-Familie 36)" data-name="Tobias Kovac" cx="671.347" cy="233.338" r="12" fill="#aaffc3" stroke="black" stroke-width="1"><title>Tobias Kovac — Familie Kovac (Studierenden-Familie 36)</title></circle>
|
||||||
|
<ellipse cx="690.014" cy="233.338" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="690.014" y="228.538" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">28</text>
|
||||||
|
<text x="690.014" y="241.738" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="781.35" cy="233.338" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="47" data-gruppe="Familie Nowak (Studierenden-Familie 27)" data-name="Felix Nowak" cx="781.35" cy="214.67" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Felix Nowak — Familie Nowak (Studierenden-Familie 27)</title></circle>
|
||||||
|
<circle class="person" data-gid="57" data-gruppe="Familie Winkler (Studierenden-Familie 37)" data-name="Lena Winkler" cx="800.017" cy="233.338" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Lena Winkler — Familie Winkler (Studierenden-Familie 37)</title></circle>
|
||||||
|
<circle class="person" data-gid="57" data-gruppe="Familie Winkler (Studierenden-Familie 37)" data-name="Patrick Winkler" cx="781.35" cy="252.006" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Patrick Winkler — Familie Winkler (Studierenden-Familie 37)</title></circle>
|
||||||
|
<circle class="person" data-gid="47" data-gruppe="Familie Nowak (Studierenden-Familie 27)" data-name="Kathrin Nowak" cx="762.682" cy="233.338" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Kathrin Nowak — Familie Nowak (Studierenden-Familie 27)</title></circle>
|
||||||
|
<ellipse cx="781.35" cy="233.338" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="781.35" y="228.538" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">29</text>
|
||||||
|
<text x="781.35" y="241.738" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="279.006" cy="324.673" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="61" data-gruppe="Familie Berger (Studierenden-Familie 41)" data-name="Jennifer Berger" cx="279.006" cy="306.006" r="12" fill="#dcbeff" stroke="black" stroke-width="1"><title>Jennifer Berger — Familie Berger (Studierenden-Familie 41)</title></circle>
|
||||||
|
<circle class="person" data-gid="61" data-gruppe="Familie Berger (Studierenden-Familie 41)" data-name="Anton Berger" cx="297.673" cy="324.673" r="12" fill="#dcbeff" stroke="black" stroke-width="1"><title>Anton Berger — Familie Berger (Studierenden-Familie 41)</title></circle>
|
||||||
|
<circle class="person" data-gid="61" data-gruppe="Familie Berger (Studierenden-Familie 41)" data-name="Layla Berger" cx="279.006" cy="343.341" r="12" fill="#dcbeff" stroke="black" stroke-width="1"><title>Layla Berger — Familie Berger (Studierenden-Familie 41)</title></circle>
|
||||||
|
<circle class="person" data-gid="61" data-gruppe="Familie Berger (Studierenden-Familie 41)" data-name="Stefan Berger" cx="260.338" cy="324.673" r="12" fill="#dcbeff" stroke="black" stroke-width="1"><title>Stefan Berger — Familie Berger (Studierenden-Familie 41)</title></circle>
|
||||||
|
<ellipse cx="279.006" cy="324.673" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="279.006" y="319.873" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">32</text>
|
||||||
|
<text x="279.006" y="333.073" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="644.347" cy="324.673" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="56" data-gruppe="Familie Kovac (Studierenden-Familie 36)" data-name="Marco Kovac" cx="644.347" cy="306.006" r="12" fill="#aaffc3" stroke="black" stroke-width="1"><title>Marco Kovac — Familie Kovac (Studierenden-Familie 36)</title></circle>
|
||||||
|
<circle class="person" data-gid="56" data-gruppe="Familie Kovac (Studierenden-Familie 36)" data-name="Anja Kovac" cx="663.014" cy="324.673" r="12" fill="#aaffc3" stroke="black" stroke-width="1"><title>Anja Kovac — Familie Kovac (Studierenden-Familie 36)</title></circle>
|
||||||
|
<circle class="person" data-gid="56" data-gruppe="Familie Kovac (Studierenden-Familie 36)" data-name="Henry Kovac" cx="644.347" cy="343.341" r="12" fill="#aaffc3" stroke="black" stroke-width="1"><title>Henry Kovac — Familie Kovac (Studierenden-Familie 36)</title></circle>
|
||||||
|
<circle class="person" data-gid="56" data-gruppe="Familie Kovac (Studierenden-Familie 36)" data-name="Marija Kovac" cx="625.679" cy="324.673" r="12" fill="#aaffc3" stroke="black" stroke-width="1"><title>Marija Kovac — Familie Kovac (Studierenden-Familie 36)</title></circle>
|
||||||
|
<ellipse cx="644.347" cy="324.673" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="644.347" y="319.873" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">36</text>
|
||||||
|
<text x="644.347" y="333.073" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="735.682" cy="324.673" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="47" data-gruppe="Familie Nowak (Studierenden-Familie 27)" data-name="Aylin Nowak" cx="735.682" cy="306.006" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Aylin Nowak — Familie Nowak (Studierenden-Familie 27)</title></circle>
|
||||||
|
<circle class="person" data-gid="47" data-gruppe="Familie Nowak (Studierenden-Familie 27)" data-name="Markus Nowak" cx="754.35" cy="324.673" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Markus Nowak — Familie Nowak (Studierenden-Familie 27)</title></circle>
|
||||||
|
<circle class="person" data-gid="47" data-gruppe="Familie Nowak (Studierenden-Familie 27)" data-name="Lina Nowak" cx="735.682" cy="343.341" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Lina Nowak — Familie Nowak (Studierenden-Familie 27)</title></circle>
|
||||||
|
<circle class="person" data-gid="47" data-gruppe="Familie Nowak (Studierenden-Familie 27)" data-name="Noah Nowak" cx="717.014" cy="324.673" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Noah Nowak — Familie Nowak (Studierenden-Familie 27)</title></circle>
|
||||||
|
<ellipse cx="735.682" cy="324.673" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="735.682" y="319.873" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">37</text>
|
||||||
|
<text x="735.682" y="333.073" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="827.017" cy="324.673" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="35" data-gruppe="Institut fuer Verfahrenstechnik" data-name="Dr. Nicole Hansen" cx="827.017" cy="306.006" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Dr. Nicole Hansen — Institut fuer Verfahrenstechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="35" data-gruppe="Institut fuer Verfahrenstechnik" data-name="Thomas Krause" cx="845.685" cy="324.673" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Thomas Krause — Institut fuer Verfahrenstechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="58" data-gruppe="Familie Petrov (Studierenden-Familie 38)" data-name="Kathrin Petrov" cx="827.017" cy="343.341" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Kathrin Petrov — Familie Petrov (Studierenden-Familie 38)</title></circle>
|
||||||
|
<circle class="person" data-gid="58" data-gruppe="Familie Petrov (Studierenden-Familie 38)" data-name="Milan Petrov" cx="808.35" cy="324.673" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Milan Petrov — Familie Petrov (Studierenden-Familie 38)</title></circle>
|
||||||
|
<ellipse cx="827.017" cy="324.673" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="827.017" y="319.873" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">38</text>
|
||||||
|
<text x="827.017" y="333.073" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="598.679" cy="416.009" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="2" data-gruppe="Familie Arnold (Studierenden-Familie 2)" data-name="Jennifer Arnold" cx="598.679" cy="397.341" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Jennifer Arnold — Familie Arnold (Studierenden-Familie 2)</title></circle>
|
||||||
|
<circle class="person" data-gid="2" data-gruppe="Familie Arnold (Studierenden-Familie 2)" data-name="Patrick Arnold" cx="617.347" cy="416.009" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Patrick Arnold — Familie Arnold (Studierenden-Familie 2)</title></circle>
|
||||||
|
<circle class="person" data-gid="64" data-gruppe="Familie Lange (Studierenden-Familie 44)" data-name="Dragana Lange" cx="598.679" cy="434.676" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Dragana Lange — Familie Lange (Studierenden-Familie 44)</title></circle>
|
||||||
|
<circle class="person" data-gid="64" data-gruppe="Familie Lange (Studierenden-Familie 44)" data-name="Michael Lange" cx="580.011" cy="416.009" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Michael Lange — Familie Lange (Studierenden-Familie 44)</title></circle>
|
||||||
|
<ellipse cx="598.679" cy="416.009" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="598.679" y="411.209" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">43</text>
|
||||||
|
<text x="598.679" y="424.409" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="781.35" cy="416.009" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="35" data-gruppe="Institut fuer Verfahrenstechnik" data-name="Patrick Haas" cx="781.35" cy="397.341" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Patrick Haas — Institut fuer Verfahrenstechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="35" data-gruppe="Institut fuer Verfahrenstechnik" data-name="Prof. Dr. Sergej Ott" cx="800.017" cy="416.009" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Prof. Dr. Sergej Ott — Institut fuer Verfahrenstechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="35" data-gruppe="Institut fuer Verfahrenstechnik" data-name="Dragana Bauer" cx="781.35" cy="434.676" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Dragana Bauer — Institut fuer Verfahrenstechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="35" data-gruppe="Institut fuer Verfahrenstechnik" data-name="Nicole Peters" cx="762.682" cy="416.009" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Nicole Peters — Institut fuer Verfahrenstechnik</title></circle>
|
||||||
|
<ellipse cx="781.35" cy="416.009" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="781.35" y="411.209" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">45</text>
|
||||||
|
<text x="781.35" y="424.409" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1877.37" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="9" data-gruppe="Familie Richter (Studierenden-Familie 7)" data-name="Anja Richter" cx="1877.37" cy="32" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Anja Richter — Familie Richter (Studierenden-Familie 7)</title></circle>
|
||||||
|
<circle class="person" data-gid="9" data-gruppe="Familie Richter (Studierenden-Familie 7)" data-name="Matthias Richter" cx="1896.04" cy="50.6676" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Matthias Richter — Familie Richter (Studierenden-Familie 7)</title></circle>
|
||||||
|
<circle class="person" data-gid="9" data-gruppe="Familie Richter (Studierenden-Familie 7)" data-name="Greta Richter" cx="1877.37" cy="69.3352" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Greta Richter — Familie Richter (Studierenden-Familie 7)</title></circle>
|
||||||
|
<circle class="person" data-gid="9" data-gruppe="Familie Richter (Studierenden-Familie 7)" data-name="Anton Richter" cx="1858.7" cy="50.6676" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Anton Richter — Familie Richter (Studierenden-Familie 7)</title></circle>
|
||||||
|
<ellipse cx="1877.37" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1877.37" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">50</text>
|
||||||
|
<text x="1877.37" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1968.71" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="11" data-gruppe="Lehrstuhl Regelungstechnik" data-name="Prof. Dr. Dennis Werner" cx="1968.71" cy="32" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Prof. Dr. Dennis Werner — Lehrstuhl Regelungstechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="11" data-gruppe="Lehrstuhl Regelungstechnik" data-name="Dr. Thomas Hoffmann" cx="1987.38" cy="50.6676" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Dr. Thomas Hoffmann — Lehrstuhl Regelungstechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="11" data-gruppe="Lehrstuhl Regelungstechnik" data-name="Olga Tran" cx="1968.71" cy="69.3352" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Olga Tran — Lehrstuhl Regelungstechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="11" data-gruppe="Lehrstuhl Regelungstechnik" data-name="Dr. Anja Seidel" cx="1950.04" cy="50.6676" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Dr. Anja Seidel — Lehrstuhl Regelungstechnik</title></circle>
|
||||||
|
<ellipse cx="1968.71" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1968.71" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">51</text>
|
||||||
|
<text x="1968.71" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="2060.04" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="21" data-gruppe="Institut fuer Physik" data-name="Prof. Dr. Stefan Schmitt" cx="2060.04" cy="32" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Prof. Dr. Stefan Schmitt — Institut fuer Physik</title></circle>
|
||||||
|
<circle class="person" data-gid="21" data-gruppe="Institut fuer Physik" data-name="Marija Tran" cx="2078.71" cy="50.6676" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Marija Tran — Institut fuer Physik</title></circle>
|
||||||
|
<circle class="person" data-gid="21" data-gruppe="Institut fuer Physik" data-name="Dr. Kathrin Koch" cx="2060.04" cy="69.3352" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Dr. Kathrin Koch — Institut fuer Physik</title></circle>
|
||||||
|
<circle class="person" data-gid="21" data-gruppe="Institut fuer Physik" data-name="Dr. Julia Kuhn" cx="2041.38" cy="50.6676" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Dr. Julia Kuhn — Institut fuer Physik</title></circle>
|
||||||
|
<ellipse cx="2060.04" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="2060.04" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">52</text>
|
||||||
|
<text x="2060.04" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="2151.38" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="31" data-gruppe="Doktorandenrunde Energietechnik" data-name="Prof. Dr. Dragana Dietrich" cx="2151.38" cy="32" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Prof. Dr. Dragana Dietrich — Doktorandenrunde Energietechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="31" data-gruppe="Doktorandenrunde Energietechnik" data-name="Dr. Michael Aksoy" cx="2170.05" cy="50.6676" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Dr. Michael Aksoy — Doktorandenrunde Energietechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="21" data-gruppe="Institut fuer Physik" data-name="Katrin Weber" cx="2151.38" cy="69.3352" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Katrin Weber — Institut fuer Physik</title></circle>
|
||||||
|
<circle class="person" data-gid="21" data-gruppe="Institut fuer Physik" data-name="Luca Werner" cx="2132.71" cy="50.6676" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Luca Werner — Institut fuer Physik</title></circle>
|
||||||
|
<ellipse cx="2151.38" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="2151.38" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">53</text>
|
||||||
|
<text x="2151.38" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="2334.05" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="27" data-gruppe="Familie Werner (Studierenden-Familie 15)" data-name="Sandra Werner" cx="2334.05" cy="32" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Sandra Werner — Familie Werner (Studierenden-Familie 15)</title></circle>
|
||||||
|
<circle class="person" data-gid="27" data-gruppe="Familie Werner (Studierenden-Familie 15)" data-name="Andreas Werner" cx="2352.72" cy="50.6676" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Andreas Werner — Familie Werner (Studierenden-Familie 15)</title></circle>
|
||||||
|
<circle class="person" data-gid="27" data-gruppe="Familie Werner (Studierenden-Familie 15)" data-name="Nadine Werner" cx="2334.05" cy="69.3352" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Nadine Werner — Familie Werner (Studierenden-Familie 15)</title></circle>
|
||||||
|
<circle class="person" data-gid="27" data-gruppe="Familie Werner (Studierenden-Familie 15)" data-name="Marco Werner" cx="2315.38" cy="50.6676" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Marco Werner — Familie Werner (Studierenden-Familie 15)</title></circle>
|
||||||
|
<ellipse cx="2334.05" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="2334.05" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">55</text>
|
||||||
|
<text x="2334.05" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="2425.38" cy="50.6676" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="20" data-gruppe="Familie Busch (Studierenden-Familie 12)" data-name="Olga Busch" cx="2425.38" cy="32" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Olga Busch — Familie Busch (Studierenden-Familie 12)</title></circle>
|
||||||
|
<circle class="person" data-gid="20" data-gruppe="Familie Busch (Studierenden-Familie 12)" data-name="Emre Busch" cx="2444.05" cy="50.6676" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Emre Busch — Familie Busch (Studierenden-Familie 12)</title></circle>
|
||||||
|
<circle class="person" data-gid="20" data-gruppe="Familie Busch (Studierenden-Familie 12)" data-name="Marie Busch" cx="2425.38" cy="69.3352" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Marie Busch — Familie Busch (Studierenden-Familie 12)</title></circle>
|
||||||
|
<circle class="person" data-gid="20" data-gruppe="Familie Busch (Studierenden-Familie 12)" data-name="Michael Busch" cx="2406.72" cy="50.6676" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Michael Busch — Familie Busch (Studierenden-Familie 12)</title></circle>
|
||||||
|
<ellipse cx="2425.38" cy="50.6676" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="2425.38" y="45.8676" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">56</text>
|
||||||
|
<text x="2425.38" y="59.0676" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1557.7" cy="142.003" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="23" data-gruppe="Lehrstuhl Produktionstechnik" data-name="Prof. Dr. Emre Ludwig" cx="1557.7" cy="123.335" r="12" fill="#469990" stroke="black" stroke-width="1"><title>Prof. Dr. Emre Ludwig — Lehrstuhl Produktionstechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="23" data-gruppe="Lehrstuhl Produktionstechnik" data-name="Daniel Krause" cx="1576.37" cy="142.003" r="12" fill="#469990" stroke="black" stroke-width="1"><title>Daniel Krause — Lehrstuhl Produktionstechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="23" data-gruppe="Lehrstuhl Produktionstechnik" data-name="Nicole Aksoy" cx="1557.7" cy="160.67" r="12" fill="#469990" stroke="black" stroke-width="1"><title>Nicole Aksoy — Lehrstuhl Produktionstechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="23" data-gruppe="Lehrstuhl Produktionstechnik" data-name="Markus Klein" cx="1539.03" cy="142.003" r="12" fill="#469990" stroke="black" stroke-width="1"><title>Markus Klein — Lehrstuhl Produktionstechnik</title></circle>
|
||||||
|
<ellipse cx="1557.7" cy="142.003" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1557.7" y="137.203" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">57</text>
|
||||||
|
<text x="1557.7" y="150.403" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1740.37" cy="142.003" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="34" data-gruppe="Emeriti-Stammtisch" data-name="Prof. Dr. Thomas Tran" cx="1740.37" cy="123.335" r="12" fill="#dcbeff" stroke="black" stroke-width="1"><title>Prof. Dr. Thomas Tran — Emeriti-Stammtisch</title></circle>
|
||||||
|
<circle class="person" data-gid="34" data-gruppe="Emeriti-Stammtisch" data-name="Sergej Petrov" cx="1759.04" cy="142.003" r="12" fill="#dcbeff" stroke="black" stroke-width="1"><title>Sergej Petrov — Emeriti-Stammtisch</title></circle>
|
||||||
|
<circle class="person" data-gid="34" data-gruppe="Emeriti-Stammtisch" data-name="Kathrin Polat" cx="1740.37" cy="160.67" r="12" fill="#dcbeff" stroke="black" stroke-width="1"><title>Kathrin Polat — Emeriti-Stammtisch</title></circle>
|
||||||
|
<circle class="person" data-gid="34" data-gruppe="Emeriti-Stammtisch" data-name="Marija Aksoy" cx="1721.7" cy="142.003" r="12" fill="#dcbeff" stroke="black" stroke-width="1"><title>Marija Aksoy — Emeriti-Stammtisch</title></circle>
|
||||||
|
<ellipse cx="1740.37" cy="142.003" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1740.37" y="137.203" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">59</text>
|
||||||
|
<text x="1740.37" y="150.403" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1831.7" cy="142.003" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="67" data-gruppe="Familie Sahin (Studierenden-Familie 47)" data-name="Nicole Sahin" cx="1831.7" cy="123.335" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Nicole Sahin — Familie Sahin (Studierenden-Familie 47)</title></circle>
|
||||||
|
<circle class="person" data-gid="67" data-gruppe="Familie Sahin (Studierenden-Familie 47)" data-name="Markus Sahin" cx="1850.37" cy="142.003" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Markus Sahin — Familie Sahin (Studierenden-Familie 47)</title></circle>
|
||||||
|
<circle class="person" data-gid="67" data-gruppe="Familie Sahin (Studierenden-Familie 47)" data-name="Kathrin Sahin" cx="1831.7" cy="160.67" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Kathrin Sahin — Familie Sahin (Studierenden-Familie 47)</title></circle>
|
||||||
|
<circle class="person" data-gid="67" data-gruppe="Familie Sahin (Studierenden-Familie 47)" data-name="Patrick Sahin" cx="1813.04" cy="142.003" r="12" fill="#9a6324" stroke="black" stroke-width="1"><title>Patrick Sahin — Familie Sahin (Studierenden-Familie 47)</title></circle>
|
||||||
|
<ellipse cx="1831.7" cy="142.003" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1831.7" y="137.203" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">60</text>
|
||||||
|
<text x="1831.7" y="150.403" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1923.04" cy="142.003" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="66" data-gruppe="Familie Maier (Studierenden-Familie 46)" data-name="Sarah Maier" cx="1923.04" cy="123.335" r="12" fill="#800000" stroke="black" stroke-width="1"><title>Sarah Maier — Familie Maier (Studierenden-Familie 46)</title></circle>
|
||||||
|
<circle class="person" data-gid="66" data-gruppe="Familie Maier (Studierenden-Familie 46)" data-name="Christian Maier" cx="1941.71" cy="142.003" r="12" fill="#800000" stroke="black" stroke-width="1"><title>Christian Maier — Familie Maier (Studierenden-Familie 46)</title></circle>
|
||||||
|
<circle class="person" data-gid="66" data-gruppe="Familie Maier (Studierenden-Familie 46)" data-name="Olga Maier" cx="1923.04" cy="160.67" r="12" fill="#800000" stroke="black" stroke-width="1"><title>Olga Maier — Familie Maier (Studierenden-Familie 46)</title></circle>
|
||||||
|
<circle class="person" data-gid="66" data-gruppe="Familie Maier (Studierenden-Familie 46)" data-name="Arda Maier" cx="1904.37" cy="142.003" r="12" fill="#800000" stroke="black" stroke-width="1"><title>Arda Maier — Familie Maier (Studierenden-Familie 46)</title></circle>
|
||||||
|
<ellipse cx="1923.04" cy="142.003" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1923.04" y="137.203" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">61</text>
|
||||||
|
<text x="1923.04" y="150.403" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="2105.71" cy="142.003" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="46" data-gruppe="Familie Krause (Studierenden-Familie 26)" data-name="Andreas Krause" cx="2105.71" cy="123.335" r="12" fill="#aaffc3" stroke="black" stroke-width="1"><title>Andreas Krause — Familie Krause (Studierenden-Familie 26)</title></circle>
|
||||||
|
<circle class="person" data-gid="46" data-gruppe="Familie Krause (Studierenden-Familie 26)" data-name="Emma Krause" cx="2124.38" cy="142.003" r="12" fill="#aaffc3" stroke="black" stroke-width="1"><title>Emma Krause — Familie Krause (Studierenden-Familie 26)</title></circle>
|
||||||
|
<circle class="person" data-gid="46" data-gruppe="Familie Krause (Studierenden-Familie 26)" data-name="Arda Krause" cx="2105.71" cy="160.67" r="12" fill="#aaffc3" stroke="black" stroke-width="1"><title>Arda Krause — Familie Krause (Studierenden-Familie 26)</title></circle>
|
||||||
|
<circle class="person" data-gid="46" data-gruppe="Familie Krause (Studierenden-Familie 26)" data-name="Julia Krause" cx="2087.04" cy="142.003" r="12" fill="#aaffc3" stroke="black" stroke-width="1"><title>Julia Krause — Familie Krause (Studierenden-Familie 26)</title></circle>
|
||||||
|
<ellipse cx="2105.71" cy="142.003" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="2105.71" y="137.203" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">63</text>
|
||||||
|
<text x="2105.71" y="150.403" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="2197.05" cy="142.003" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="31" data-gruppe="Doktorandenrunde Energietechnik" data-name="Katrin Werner" cx="2197.05" cy="123.335" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Katrin Werner — Doktorandenrunde Energietechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="31" data-gruppe="Doktorandenrunde Energietechnik" data-name="Patrick Busch" cx="2215.71" cy="142.003" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Patrick Busch — Doktorandenrunde Energietechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="31" data-gruppe="Doktorandenrunde Energietechnik" data-name="Emre Hoffmann" cx="2197.05" cy="160.67" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Emre Hoffmann — Doktorandenrunde Energietechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="31" data-gruppe="Doktorandenrunde Energietechnik" data-name="Sergej Lange" cx="2178.38" cy="142.003" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Sergej Lange — Doktorandenrunde Energietechnik</title></circle>
|
||||||
|
<ellipse cx="2197.05" cy="142.003" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="2197.05" y="137.203" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">64</text>
|
||||||
|
<text x="2197.05" y="150.403" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="2288.38" cy="142.003" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="30" data-gruppe="Lehrstuhl Messtechnik" data-name="Nadine Arnold" cx="2288.38" cy="123.335" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Nadine Arnold — Lehrstuhl Messtechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="30" data-gruppe="Lehrstuhl Messtechnik" data-name="Marco Richter" cx="2307.05" cy="142.003" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Marco Richter — Lehrstuhl Messtechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="30" data-gruppe="Lehrstuhl Messtechnik" data-name="Prof. Dr. Patrick Hoffmann" cx="2288.38" cy="160.67" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Prof. Dr. Patrick Hoffmann — Lehrstuhl Messtechnik</title></circle>
|
||||||
|
<circle class="person" data-gid="30" data-gruppe="Lehrstuhl Messtechnik" data-name="Marija Polat" cx="2269.71" cy="142.003" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Marija Polat — Lehrstuhl Messtechnik</title></circle>
|
||||||
|
<ellipse cx="2288.38" cy="142.003" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="2288.38" y="137.203" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">65</text>
|
||||||
|
<text x="2288.38" y="150.403" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="2379.72" cy="142.003" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="63" data-gruppe="Familie Simon (Studierenden-Familie 43)" data-name="Lena Simon" cx="2379.72" cy="123.335" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Lena Simon — Familie Simon (Studierenden-Familie 43)</title></circle>
|
||||||
|
<circle class="person" data-gid="63" data-gruppe="Familie Simon (Studierenden-Familie 43)" data-name="Markus Simon" cx="2398.38" cy="142.003" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Markus Simon — Familie Simon (Studierenden-Familie 43)</title></circle>
|
||||||
|
<circle class="person" data-gid="63" data-gruppe="Familie Simon (Studierenden-Familie 43)" data-name="Emma Simon" cx="2379.72" cy="160.67" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Emma Simon — Familie Simon (Studierenden-Familie 43)</title></circle>
|
||||||
|
<circle class="person" data-gid="63" data-gruppe="Familie Simon (Studierenden-Familie 43)" data-name="Andreas Simon" cx="2361.05" cy="142.003" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Andreas Simon — Familie Simon (Studierenden-Familie 43)</title></circle>
|
||||||
|
<ellipse cx="2379.72" cy="142.003" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="2379.72" y="137.203" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">66</text>
|
||||||
|
<text x="2379.72" y="150.403" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1694.7" cy="233.338" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="38" data-gruppe="Familie Wagner (Studierenden-Familie 18)" data-name="Nicole Wagner" cx="1694.7" cy="214.67" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Nicole Wagner — Familie Wagner (Studierenden-Familie 18)</title></circle>
|
||||||
|
<circle class="person" data-gid="38" data-gruppe="Familie Wagner (Studierenden-Familie 18)" data-name="Marco Wagner" cx="1713.37" cy="233.338" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Marco Wagner — Familie Wagner (Studierenden-Familie 18)</title></circle>
|
||||||
|
<circle class="person" data-gid="38" data-gruppe="Familie Wagner (Studierenden-Familie 18)" data-name="Sarah Wagner" cx="1694.7" cy="252.006" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Sarah Wagner — Familie Wagner (Studierenden-Familie 18)</title></circle>
|
||||||
|
<circle class="person" data-gid="38" data-gruppe="Familie Wagner (Studierenden-Familie 18)" data-name="Henry Wagner" cx="1676.03" cy="233.338" r="12" fill="#3cb44b" stroke="black" stroke-width="1"><title>Henry Wagner — Familie Wagner (Studierenden-Familie 18)</title></circle>
|
||||||
|
<ellipse cx="1694.7" cy="233.338" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1694.7" y="228.538" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">68</text>
|
||||||
|
<text x="1694.7" y="241.738" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1877.37" cy="233.338" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="45" data-gruppe="Familie Zimmermann (Studierenden-Familie 25)" data-name="Svenja Zimmermann" cx="1877.37" cy="214.67" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Svenja Zimmermann — Familie Zimmermann (Studierenden-Familie 25)</title></circle>
|
||||||
|
<circle class="person" data-gid="45" data-gruppe="Familie Zimmermann (Studierenden-Familie 25)" data-name="Jan Zimmermann" cx="1896.04" cy="233.338" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Jan Zimmermann — Familie Zimmermann (Studierenden-Familie 25)</title></circle>
|
||||||
|
<circle class="person" data-gid="45" data-gruppe="Familie Zimmermann (Studierenden-Familie 25)" data-name="Mia Zimmermann" cx="1877.37" cy="252.006" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Mia Zimmermann — Familie Zimmermann (Studierenden-Familie 25)</title></circle>
|
||||||
|
<circle class="person" data-gid="45" data-gruppe="Familie Zimmermann (Studierenden-Familie 25)" data-name="Markus Zimmermann" cx="1858.7" cy="233.338" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Markus Zimmermann — Familie Zimmermann (Studierenden-Familie 25)</title></circle>
|
||||||
|
<ellipse cx="1877.37" cy="233.338" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1877.37" y="228.538" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">70</text>
|
||||||
|
<text x="1877.37" y="241.738" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="2151.38" cy="233.338" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="50" data-gruppe="Familie Neumann (Studierenden-Familie 30)" data-name="Jennifer Neumann" cx="2151.38" cy="214.67" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Jennifer Neumann — Familie Neumann (Studierenden-Familie 30)</title></circle>
|
||||||
|
<circle class="person" data-gid="50" data-gruppe="Familie Neumann (Studierenden-Familie 30)" data-name="Thomas Neumann" cx="2170.05" cy="233.338" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Thomas Neumann — Familie Neumann (Studierenden-Familie 30)</title></circle>
|
||||||
|
<circle class="person" data-gid="50" data-gruppe="Familie Neumann (Studierenden-Familie 30)" data-name="Lina Neumann" cx="2151.38" cy="252.006" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Lina Neumann — Familie Neumann (Studierenden-Familie 30)</title></circle>
|
||||||
|
<circle class="person" data-gid="50" data-gruppe="Familie Neumann (Studierenden-Familie 30)" data-name="Matteo Neumann" cx="2132.71" cy="233.338" r="12" fill="#f58231" stroke="black" stroke-width="1"><title>Matteo Neumann — Familie Neumann (Studierenden-Familie 30)</title></circle>
|
||||||
|
<ellipse cx="2151.38" cy="233.338" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="2151.38" y="228.538" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">73</text>
|
||||||
|
<text x="2151.38" y="241.738" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="2242.71" cy="233.338" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="62" data-gruppe="Familie Barth (Studierenden-Familie 42)" data-name="Patrick Barth" cx="2242.71" cy="214.67" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Patrick Barth — Familie Barth (Studierenden-Familie 42)</title></circle>
|
||||||
|
<circle class="person" data-gid="62" data-gruppe="Familie Barth (Studierenden-Familie 42)" data-name="Nadine Barth" cx="2261.38" cy="233.338" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Nadine Barth — Familie Barth (Studierenden-Familie 42)</title></circle>
|
||||||
|
<circle class="person" data-gid="62" data-gruppe="Familie Barth (Studierenden-Familie 42)" data-name="Timo Barth" cx="2242.71" cy="252.006" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Timo Barth — Familie Barth (Studierenden-Familie 42)</title></circle>
|
||||||
|
<circle class="person" data-gid="62" data-gruppe="Familie Barth (Studierenden-Familie 42)" data-name="Lina Barth" cx="2224.05" cy="233.338" r="12" fill="#911eb4" stroke="black" stroke-width="1"><title>Lina Barth — Familie Barth (Studierenden-Familie 42)</title></circle>
|
||||||
|
<ellipse cx="2242.71" cy="233.338" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="2242.71" y="228.538" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">74</text>
|
||||||
|
<text x="2242.71" y="241.738" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="2334.05" cy="233.338" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="60" data-gruppe="Familie Pohl (Studierenden-Familie 40)" data-name="Dragana Pohl" cx="2334.05" cy="214.67" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Dragana Pohl — Familie Pohl (Studierenden-Familie 40)</title></circle>
|
||||||
|
<circle class="person" data-gid="60" data-gruppe="Familie Pohl (Studierenden-Familie 40)" data-name="Emre Pohl" cx="2352.72" cy="233.338" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Emre Pohl — Familie Pohl (Studierenden-Familie 40)</title></circle>
|
||||||
|
<circle class="person" data-gid="60" data-gruppe="Familie Pohl (Studierenden-Familie 40)" data-name="Mia Pohl" cx="2334.05" cy="252.006" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Mia Pohl — Familie Pohl (Studierenden-Familie 40)</title></circle>
|
||||||
|
<circle class="person" data-gid="60" data-gruppe="Familie Pohl (Studierenden-Familie 40)" data-name="Theo Pohl" cx="2315.38" cy="233.338" r="12" fill="#42d4f4" stroke="black" stroke-width="1"><title>Theo Pohl — Familie Pohl (Studierenden-Familie 40)</title></circle>
|
||||||
|
<ellipse cx="2334.05" cy="233.338" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="2334.05" y="228.538" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">75</text>
|
||||||
|
<text x="2334.05" y="241.738" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1831.7" cy="324.673" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="42" data-gruppe="Familie Hartmann (Studierenden-Familie 22)" data-name="Deniz Hartmann" cx="1831.7" cy="306.006" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Deniz Hartmann — Familie Hartmann (Studierenden-Familie 22)</title></circle>
|
||||||
|
<circle class="person" data-gid="42" data-gruppe="Familie Hartmann (Studierenden-Familie 22)" data-name="Nadine Hartmann" cx="1850.37" cy="324.673" r="12" fill="#e6194b" stroke="black" stroke-width="1"><title>Nadine Hartmann — Familie Hartmann (Studierenden-Familie 22)</title></circle>
|
||||||
|
<circle class="person" data-gid="55" data-gruppe="Familie Franke (Studierenden-Familie 35)" data-name="Michael Franke" cx="1831.7" cy="343.341" r="12" fill="#469990" stroke="black" stroke-width="1"><title>Michael Franke — Familie Franke (Studierenden-Familie 35)</title></circle>
|
||||||
|
<circle class="person" data-gid="55" data-gruppe="Familie Franke (Studierenden-Familie 35)" data-name="Julia Franke" cx="1813.04" cy="324.673" r="12" fill="#469990" stroke="black" stroke-width="1"><title>Julia Franke — Familie Franke (Studierenden-Familie 35)</title></circle>
|
||||||
|
<ellipse cx="1831.7" cy="324.673" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1831.7" y="319.873" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">78</text>
|
||||||
|
<text x="1831.7" y="333.073" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1923.04" cy="324.673" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="48" data-gruppe="Familie Horn (Studierenden-Familie 28)" data-name="Kathrin Horn" cx="1923.04" cy="306.006" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Kathrin Horn — Familie Horn (Studierenden-Familie 28)</title></circle>
|
||||||
|
<circle class="person" data-gid="48" data-gruppe="Familie Horn (Studierenden-Familie 28)" data-name="Michael Horn" cx="1941.71" cy="324.673" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Michael Horn — Familie Horn (Studierenden-Familie 28)</title></circle>
|
||||||
|
<circle class="person" data-gid="48" data-gruppe="Familie Horn (Studierenden-Familie 28)" data-name="Layla Horn" cx="1923.04" cy="343.341" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Layla Horn — Familie Horn (Studierenden-Familie 28)</title></circle>
|
||||||
|
<circle class="person" data-gid="48" data-gruppe="Familie Horn (Studierenden-Familie 28)" data-name="Leon Horn" cx="1904.37" cy="324.673" r="12" fill="#f032e6" stroke="black" stroke-width="1"><title>Leon Horn — Familie Horn (Studierenden-Familie 28)</title></circle>
|
||||||
|
<ellipse cx="1923.04" cy="324.673" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1923.04" y="319.873" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">79</text>
|
||||||
|
<text x="1923.04" y="333.073" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="2014.38" cy="324.673" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="54" data-gruppe="Familie Polat (Studierenden-Familie 34)" data-name="Stefanie Polat" cx="2014.38" cy="306.006" r="12" fill="#aaffc3" stroke="black" stroke-width="1"><title>Stefanie Polat — Familie Polat (Studierenden-Familie 34)</title></circle>
|
||||||
|
<circle class="person" data-gid="54" data-gruppe="Familie Polat (Studierenden-Familie 34)" data-name="Stefan Polat" cx="2033.04" cy="324.673" r="12" fill="#aaffc3" stroke="black" stroke-width="1"><title>Stefan Polat — Familie Polat (Studierenden-Familie 34)</title></circle>
|
||||||
|
<circle class="person" data-gid="49" data-gruppe="Familie Ott (Studierenden-Familie 29)" data-name="Melanie Ott" cx="2014.38" cy="343.341" r="12" fill="#dcbeff" stroke="black" stroke-width="1"><title>Melanie Ott — Familie Ott (Studierenden-Familie 29)</title></circle>
|
||||||
|
<circle class="person" data-gid="49" data-gruppe="Familie Ott (Studierenden-Familie 29)" data-name="Daniel Ott" cx="1995.71" cy="324.673" r="12" fill="#dcbeff" stroke="black" stroke-width="1"><title>Daniel Ott — Familie Ott (Studierenden-Familie 29)</title></circle>
|
||||||
|
<ellipse cx="2014.38" cy="324.673" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="2014.38" y="319.873" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">80</text>
|
||||||
|
<text x="2014.38" y="333.073" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="2288.38" cy="324.673" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="51" data-gruppe="Familie Wolf (Studierenden-Familie 31)" data-name="Emma Wolf" cx="2288.38" cy="306.006" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Emma Wolf — Familie Wolf (Studierenden-Familie 31)</title></circle>
|
||||||
|
<circle class="person" data-gid="51" data-gruppe="Familie Wolf (Studierenden-Familie 31)" data-name="Ben Wolf" cx="2307.05" cy="324.673" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Ben Wolf — Familie Wolf (Studierenden-Familie 31)</title></circle>
|
||||||
|
<circle class="person" data-gid="51" data-gruppe="Familie Wolf (Studierenden-Familie 31)" data-name="Julia Wolf" cx="2288.38" cy="343.341" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Julia Wolf — Familie Wolf (Studierenden-Familie 31)</title></circle>
|
||||||
|
<circle class="person" data-gid="51" data-gruppe="Familie Wolf (Studierenden-Familie 31)" data-name="Thomas Wolf" cx="2269.71" cy="324.673" r="12" fill="#bfef45" stroke="black" stroke-width="1"><title>Thomas Wolf — Familie Wolf (Studierenden-Familie 31)</title></circle>
|
||||||
|
<ellipse cx="2288.38" cy="324.673" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="2288.38" y="319.873" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">83</text>
|
||||||
|
<text x="2288.38" y="333.073" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="1968.71" cy="416.009" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="59" data-gruppe="Familie Stein (Studierenden-Familie 39)" data-name="Thomas Stein" cx="1968.71" cy="397.341" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Thomas Stein — Familie Stein (Studierenden-Familie 39)</title></circle>
|
||||||
|
<circle class="person" data-gid="59" data-gruppe="Familie Stein (Studierenden-Familie 39)" data-name="Emilia Stein" cx="1987.38" cy="416.009" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Emilia Stein — Familie Stein (Studierenden-Familie 39)</title></circle>
|
||||||
|
<circle class="person" data-gid="59" data-gruppe="Familie Stein (Studierenden-Familie 39)" data-name="Ben Stein" cx="1968.71" cy="434.676" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Ben Stein — Familie Stein (Studierenden-Familie 39)</title></circle>
|
||||||
|
<circle class="person" data-gid="59" data-gruppe="Familie Stein (Studierenden-Familie 39)" data-name="Giovanna Stein" cx="1950.04" cy="416.009" r="12" fill="#fabed4" stroke="black" stroke-width="1"><title>Giovanna Stein — Familie Stein (Studierenden-Familie 39)</title></circle>
|
||||||
|
<ellipse cx="1968.71" cy="416.009" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="1968.71" y="411.209" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">86</text>
|
||||||
|
<text x="1968.71" y="424.409" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
<circle cx="2151.38" cy="416.009" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle class="person" data-gid="10" data-gruppe="Institut fuer Informatik" data-name="Dr. Olga Klein" cx="2151.38" cy="397.341" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Dr. Olga Klein — Institut fuer Informatik</title></circle>
|
||||||
|
<circle class="person" data-gid="10" data-gruppe="Institut fuer Informatik" data-name="Dr. Jennifer Arnold" cx="2170.05" cy="416.009" r="12" fill="#000075" stroke="black" stroke-width="1"><title>Dr. Jennifer Arnold — Institut fuer Informatik</title></circle>
|
||||||
|
<circle class="person" data-gid="26" data-gruppe="Familie Frank (Studierenden-Familie 14)" data-name="Nadine Frank" cx="2151.38" cy="434.676" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Nadine Frank — Familie Frank (Studierenden-Familie 14)</title></circle>
|
||||||
|
<circle class="person" data-gid="26" data-gruppe="Familie Frank (Studierenden-Familie 14)" data-name="Dennis Frank" cx="2132.71" cy="416.009" r="12" fill="#4363d8" stroke="black" stroke-width="1"><title>Dennis Frank — Familie Frank (Studierenden-Familie 14)</title></circle>
|
||||||
|
<ellipse cx="2151.38" cy="416.009" rx="12" ry="15.6" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="2151.38" y="411.209" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">88</text>
|
||||||
|
<text x="2151.38" y="424.409" text-anchor="middle" dominant-baseline="central" font-size="7.44" fill="#333">4 Pl.</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 122 KiB |
@@ -0,0 +1,476 @@
|
|||||||
|
[1]
|
||||||
|
|
||||||
|
[2]
|
||||||
|
Layla Lehmann = Hof 1, Tisch 2, Nummer 1
|
||||||
|
Thomas Lehmann = Hof 1, Tisch 2, Nummer 2
|
||||||
|
Nicole Lehmann = Hof 1, Tisch 2, Nummer 3
|
||||||
|
Markus Lehmann = Hof 1, Tisch 2, Nummer 4
|
||||||
|
|
||||||
|
[3]
|
||||||
|
Emre Klein = Hof 1, Tisch 3, Nummer 1
|
||||||
|
Dr. Patrick Kaya = Hof 1, Tisch 3, Nummer 2
|
||||||
|
Dr. Christina Krause = Hof 1, Tisch 3, Nummer 3
|
||||||
|
Julia Weber = Hof 1, Tisch 3, Nummer 4
|
||||||
|
|
||||||
|
[4]
|
||||||
|
Marco Winkler = Hof 1, Tisch 4, Nummer 1
|
||||||
|
Prof. Dr. Yusuf Seidel = Hof 1, Tisch 4, Nummer 2
|
||||||
|
Yusuf Bauer = Hof 1, Tisch 4, Nummer 3
|
||||||
|
Dr. Jan Bianchi = Hof 1, Tisch 4, Nummer 4
|
||||||
|
|
||||||
|
[5]
|
||||||
|
Dr. h.c. Alexander Grothe = Hof 1, Tisch 5, Nummer 1
|
||||||
|
Beate Grothe = Hof 1, Tisch 5, Nummer 2
|
||||||
|
Dr. Ferdinand Kessler = Hof 1, Tisch 5, Nummer 3
|
||||||
|
Viktoria Kessler = Hof 1, Tisch 5, Nummer 4
|
||||||
|
|
||||||
|
[6]
|
||||||
|
Elisabeth Steinbach = Hof 1, Tisch 6, Nummer 1
|
||||||
|
Dr. Konstantin Freiherr von Waldeck = Hof 1, Tisch 6, Nummer 2
|
||||||
|
Antonia Freifrau von Waldeck = Hof 1, Tisch 6, Nummer 3
|
||||||
|
Georg Steinbach = Hof 1, Tisch 6, Nummer 4
|
||||||
|
|
||||||
|
[7]
|
||||||
|
Heinrich Dallmann = Hof 1, Tisch 7, Nummer 1
|
||||||
|
Margarete Dallmann = Hof 1, Tisch 7, Nummer 2
|
||||||
|
Maximilian Dallmann = Hof 1, Tisch 7, Nummer 3
|
||||||
|
Charlotte Dallmann = Hof 1, Tisch 7, Nummer 4
|
||||||
|
|
||||||
|
[8]
|
||||||
|
Giovanna Hansen = Hof 1, Tisch 8, Nummer 1
|
||||||
|
Markus Hansen = Hof 1, Tisch 8, Nummer 2
|
||||||
|
Olga Hansen = Hof 1, Tisch 8, Nummer 3
|
||||||
|
|
||||||
|
[9]
|
||||||
|
Giovanna Ludwig = Hof 1, Tisch 9, Nummer 1
|
||||||
|
Emre Ludwig = Hof 1, Tisch 9, Nummer 2
|
||||||
|
Elif Ludwig = Hof 1, Tisch 9, Nummer 3
|
||||||
|
Elias Ludwig = Hof 1, Tisch 9, Nummer 4
|
||||||
|
|
||||||
|
[10]
|
||||||
|
Giovanna Petrov = Hof 1, Tisch 10, Nummer 1
|
||||||
|
Dr. Nadine Stein = Hof 1, Tisch 10, Nummer 2
|
||||||
|
Markus Schmitt = Hof 1, Tisch 10, Nummer 3
|
||||||
|
Christian Peters = Hof 1, Tisch 10, Nummer 4
|
||||||
|
|
||||||
|
[11]
|
||||||
|
Prof. Dr. Kathrin Petrov = Hof 1, Tisch 11, Nummer 1
|
||||||
|
Dr. Markus Seidel = Hof 1, Tisch 11, Nummer 2
|
||||||
|
Markus Kraus = Hof 1, Tisch 11, Nummer 3
|
||||||
|
|
||||||
|
[12]
|
||||||
|
Matthias Popescu = Hof 1, Tisch 12, Nummer 1
|
||||||
|
Sarah Albrecht = Hof 1, Tisch 12, Nummer 2
|
||||||
|
Andreas Albrecht = Hof 1, Tisch 12, Nummer 3
|
||||||
|
Prof. Dr. Markus Stein = Hof 1, Tisch 12, Nummer 4
|
||||||
|
|
||||||
|
[13]
|
||||||
|
Prof. Dr. Yusuf Albrecht = Hof 1, Tisch 13, Nummer 1
|
||||||
|
Giovanna Lehmann = Hof 1, Tisch 13, Nummer 2
|
||||||
|
Milan Lehmann = Hof 1, Tisch 13, Nummer 3
|
||||||
|
Svenja Simon = Hof 1, Tisch 13, Nummer 4
|
||||||
|
|
||||||
|
[14]
|
||||||
|
Nicole Becker = Hof 1, Tisch 14, Nummer 1
|
||||||
|
Jan Becker = Hof 1, Tisch 14, Nummer 2
|
||||||
|
Sandra Becker = Hof 1, Tisch 14, Nummer 3
|
||||||
|
|
||||||
|
[15]
|
||||||
|
Anja Nguyen = Hof 1, Tisch 15, Nummer 1
|
||||||
|
Daniel Nguyen = Hof 1, Tisch 15, Nummer 2
|
||||||
|
Sofia Nguyen = Hof 1, Tisch 15, Nummer 3
|
||||||
|
|
||||||
|
[16]
|
||||||
|
Thomas Hansen = Hof 1, Tisch 16, Nummer 1
|
||||||
|
Nicole Schmidt = Hof 1, Tisch 16, Nummer 2
|
||||||
|
Julia Nguyen = Hof 1, Tisch 16, Nummer 3
|
||||||
|
Dr. Stefanie Seifert = Hof 1, Tisch 16, Nummer 4
|
||||||
|
|
||||||
|
[17]
|
||||||
|
Thomas Winkler = Hof 1, Tisch 17, Nummer 1
|
||||||
|
Dr. Jan Esposito = Hof 1, Tisch 17, Nummer 2
|
||||||
|
Prof. Dr. Julia Roth = Hof 1, Tisch 17, Nummer 3
|
||||||
|
|
||||||
|
[18]
|
||||||
|
Stefanie Klein = Hof 1, Tisch 18, Nummer 1
|
||||||
|
Milan Klein = Hof 1, Tisch 18, Nummer 2
|
||||||
|
Lina Klein = Hof 1, Tisch 18, Nummer 3
|
||||||
|
|
||||||
|
[19]
|
||||||
|
Nicole Seifert = Hof 1, Tisch 19, Nummer 1
|
||||||
|
Yusuf Seifert = Hof 1, Tisch 19, Nummer 2
|
||||||
|
Leni Seifert = Hof 1, Tisch 19, Nummer 3
|
||||||
|
|
||||||
|
[20]
|
||||||
|
Timo Seifert = Hof 1, Tisch 20, Nummer 1
|
||||||
|
Elif Seifert = Hof 1, Tisch 20, Nummer 2
|
||||||
|
Julia Engel = Hof 1, Tisch 20, Nummer 3
|
||||||
|
Anton Engel = Hof 1, Tisch 20, Nummer 4
|
||||||
|
|
||||||
|
[21]
|
||||||
|
Nicole Engel = Hof 1, Tisch 21, Nummer 1
|
||||||
|
Anja Engel = Hof 1, Tisch 21, Nummer 2
|
||||||
|
Yusuf Engel = Hof 1, Tisch 21, Nummer 3
|
||||||
|
|
||||||
|
[22]
|
||||||
|
Prof. Dr. Anja Richter = Hof 1, Tisch 22, Nummer 1
|
||||||
|
Dr. Jan Thiel = Hof 1, Tisch 22, Nummer 2
|
||||||
|
Thomas Sahin = Hof 1, Tisch 22, Nummer 3
|
||||||
|
|
||||||
|
[23]
|
||||||
|
Sarah Roth = Hof 1, Tisch 23, Nummer 1
|
||||||
|
Christian Roth = Hof 1, Tisch 23, Nummer 2
|
||||||
|
Sofia Roth = Hof 1, Tisch 23, Nummer 3
|
||||||
|
|
||||||
|
[24]
|
||||||
|
Andreas Berger = Hof 1, Tisch 24, Nummer 1
|
||||||
|
Patrick Celik = Hof 1, Tisch 24, Nummer 2
|
||||||
|
Elif Celik = Hof 1, Tisch 24, Nummer 3
|
||||||
|
Svenja Berger = Hof 1, Tisch 24, Nummer 4
|
||||||
|
|
||||||
|
[25]
|
||||||
|
Nadine Aksoy = Hof 1, Tisch 25, Nummer 1
|
||||||
|
Thomas Aksoy = Hof 1, Tisch 25, Nummer 2
|
||||||
|
Marie Aksoy = Hof 1, Tisch 25, Nummer 3
|
||||||
|
|
||||||
|
[26]
|
||||||
|
Prof. Dr. Yusuf Ott = Hof 1, Tisch 26, Nummer 1
|
||||||
|
Dr. Nadine Berger = Hof 1, Tisch 26, Nummer 2
|
||||||
|
Patrick Lehmann = Hof 1, Tisch 26, Nummer 3
|
||||||
|
|
||||||
|
[27]
|
||||||
|
Jennifer Dietrich = Hof 1, Tisch 27, Nummer 1
|
||||||
|
Marco Dietrich = Hof 1, Tisch 27, Nummer 2
|
||||||
|
Sofia Dietrich = Hof 1, Tisch 27, Nummer 3
|
||||||
|
|
||||||
|
[28]
|
||||||
|
Prof. Dr. Timo Kaya = Hof 1, Tisch 28, Nummer 1
|
||||||
|
Dr. Sandra Demir = Hof 1, Tisch 28, Nummer 2
|
||||||
|
Lena Kovac = Hof 1, Tisch 28, Nummer 3
|
||||||
|
Tobias Kovac = Hof 1, Tisch 28, Nummer 4
|
||||||
|
|
||||||
|
[29]
|
||||||
|
Felix Nowak = Hof 1, Tisch 29, Nummer 1
|
||||||
|
Lena Winkler = Hof 1, Tisch 29, Nummer 2
|
||||||
|
Patrick Winkler = Hof 1, Tisch 29, Nummer 3
|
||||||
|
Kathrin Nowak = Hof 1, Tisch 29, Nummer 4
|
||||||
|
|
||||||
|
[30]
|
||||||
|
|
||||||
|
[31]
|
||||||
|
Prof. Dr. Julia Richter = Hof 1, Tisch 31, Nummer 1
|
||||||
|
Dr. Jennifer Haas = Hof 1, Tisch 31, Nummer 2
|
||||||
|
|
||||||
|
[32]
|
||||||
|
Jennifer Berger = Hof 1, Tisch 32, Nummer 1
|
||||||
|
Anton Berger = Hof 1, Tisch 32, Nummer 2
|
||||||
|
Layla Berger = Hof 1, Tisch 32, Nummer 3
|
||||||
|
Stefan Berger = Hof 1, Tisch 32, Nummer 4
|
||||||
|
|
||||||
|
[33]
|
||||||
|
Luca Aksoy = Hof 1, Tisch 33, Nummer 1
|
||||||
|
Sofia Aksoy = Hof 1, Tisch 33, Nummer 2
|
||||||
|
Sergej Aksoy = Hof 1, Tisch 33, Nummer 3
|
||||||
|
|
||||||
|
[34]
|
||||||
|
|
||||||
|
[35]
|
||||||
|
Leni Arnold = Hof 1, Tisch 35, Nummer 1
|
||||||
|
Christian Arnold = Hof 1, Tisch 35, Nummer 2
|
||||||
|
Mila Arnold = Hof 1, Tisch 35, Nummer 3
|
||||||
|
|
||||||
|
[36]
|
||||||
|
Marco Kovac = Hof 1, Tisch 36, Nummer 1
|
||||||
|
Anja Kovac = Hof 1, Tisch 36, Nummer 2
|
||||||
|
Henry Kovac = Hof 1, Tisch 36, Nummer 3
|
||||||
|
Marija Kovac = Hof 1, Tisch 36, Nummer 4
|
||||||
|
|
||||||
|
[37]
|
||||||
|
Aylin Nowak = Hof 1, Tisch 37, Nummer 1
|
||||||
|
Markus Nowak = Hof 1, Tisch 37, Nummer 2
|
||||||
|
Lina Nowak = Hof 1, Tisch 37, Nummer 3
|
||||||
|
Noah Nowak = Hof 1, Tisch 37, Nummer 4
|
||||||
|
|
||||||
|
[38]
|
||||||
|
Dr. Nicole Hansen = Hof 1, Tisch 38, Nummer 1
|
||||||
|
Thomas Krause = Hof 1, Tisch 38, Nummer 2
|
||||||
|
Kathrin Petrov = Hof 1, Tisch 38, Nummer 3
|
||||||
|
Milan Petrov = Hof 1, Tisch 38, Nummer 4
|
||||||
|
|
||||||
|
[39]
|
||||||
|
Markus Barth = Hof 1, Tisch 39, Nummer 1
|
||||||
|
Matthias Petrov = Hof 1, Tisch 39, Nummer 2
|
||||||
|
Andreas Weber = Hof 1, Tisch 39, Nummer 3
|
||||||
|
|
||||||
|
[40]
|
||||||
|
Melanie Rossi = Hof 1, Tisch 40, Nummer 1
|
||||||
|
Luca Rossi = Hof 1, Tisch 40, Nummer 2
|
||||||
|
Emilia Rossi = Hof 1, Tisch 40, Nummer 3
|
||||||
|
|
||||||
|
[41]
|
||||||
|
Julia Braun = Hof 1, Tisch 41, Nummer 1
|
||||||
|
Milan Braun = Hof 1, Tisch 41, Nummer 2
|
||||||
|
Nadine Braun = Hof 1, Tisch 41, Nummer 3
|
||||||
|
|
||||||
|
[42]
|
||||||
|
Jan Braun = Hof 1, Tisch 42, Nummer 1
|
||||||
|
Dragana Braun = Hof 1, Tisch 42, Nummer 2
|
||||||
|
Christian Braun = Hof 1, Tisch 42, Nummer 3
|
||||||
|
|
||||||
|
[43]
|
||||||
|
Jennifer Arnold = Hof 1, Tisch 43, Nummer 1
|
||||||
|
Patrick Arnold = Hof 1, Tisch 43, Nummer 2
|
||||||
|
Dragana Lange = Hof 1, Tisch 43, Nummer 3
|
||||||
|
Michael Lange = Hof 1, Tisch 43, Nummer 4
|
||||||
|
|
||||||
|
[44]
|
||||||
|
Jan Lange = Hof 1, Tisch 44, Nummer 1
|
||||||
|
Svenja Lange = Hof 1, Tisch 44, Nummer 2
|
||||||
|
Sofia Lange = Hof 1, Tisch 44, Nummer 3
|
||||||
|
|
||||||
|
[45]
|
||||||
|
Patrick Haas = Hof 1, Tisch 45, Nummer 1
|
||||||
|
Prof. Dr. Sergej Ott = Hof 1, Tisch 45, Nummer 2
|
||||||
|
Dragana Bauer = Hof 1, Tisch 45, Nummer 3
|
||||||
|
Nicole Peters = Hof 1, Tisch 45, Nummer 4
|
||||||
|
|
||||||
|
[46]
|
||||||
|
Yusuf Thiel = Hof 2, Tisch 46, Nummer 1
|
||||||
|
Christina Thiel = Hof 2, Tisch 46, Nummer 2
|
||||||
|
Julia Thiel = Hof 2, Tisch 46, Nummer 3
|
||||||
|
|
||||||
|
[47]
|
||||||
|
Sarah Schmitt = Hof 2, Tisch 47, Nummer 1
|
||||||
|
Markus Schmitt = Hof 2, Tisch 47, Nummer 2
|
||||||
|
Sofia Schmitt = Hof 2, Tisch 47, Nummer 3
|
||||||
|
|
||||||
|
[48]
|
||||||
|
Michael Koch = Hof 2, Tisch 48, Nummer 1
|
||||||
|
Emil Koch = Hof 2, Tisch 48, Nummer 2
|
||||||
|
Olga Koch = Hof 2, Tisch 48, Nummer 3
|
||||||
|
|
||||||
|
[49]
|
||||||
|
Sarah Koch = Hof 2, Tisch 49, Nummer 1
|
||||||
|
Jan Koch = Hof 2, Tisch 49, Nummer 2
|
||||||
|
Marie Koch = Hof 2, Tisch 49, Nummer 3
|
||||||
|
|
||||||
|
[50]
|
||||||
|
Anja Richter = Hof 2, Tisch 50, Nummer 1
|
||||||
|
Matthias Richter = Hof 2, Tisch 50, Nummer 2
|
||||||
|
Greta Richter = Hof 2, Tisch 50, Nummer 3
|
||||||
|
Anton Richter = Hof 2, Tisch 50, Nummer 4
|
||||||
|
|
||||||
|
[51]
|
||||||
|
Prof. Dr. Dennis Werner = Hof 2, Tisch 51, Nummer 1
|
||||||
|
Dr. Thomas Hoffmann = Hof 2, Tisch 51, Nummer 2
|
||||||
|
Olga Tran = Hof 2, Tisch 51, Nummer 3
|
||||||
|
Dr. Anja Seidel = Hof 2, Tisch 51, Nummer 4
|
||||||
|
|
||||||
|
[52]
|
||||||
|
Prof. Dr. Stefan Schmitt = Hof 2, Tisch 52, Nummer 1
|
||||||
|
Marija Tran = Hof 2, Tisch 52, Nummer 2
|
||||||
|
Dr. Kathrin Koch = Hof 2, Tisch 52, Nummer 3
|
||||||
|
Dr. Julia Kuhn = Hof 2, Tisch 52, Nummer 4
|
||||||
|
|
||||||
|
[53]
|
||||||
|
Prof. Dr. Dragana Dietrich = Hof 2, Tisch 53, Nummer 1
|
||||||
|
Dr. Michael Aksoy = Hof 2, Tisch 53, Nummer 2
|
||||||
|
Katrin Weber = Hof 2, Tisch 53, Nummer 3
|
||||||
|
Luca Werner = Hof 2, Tisch 53, Nummer 4
|
||||||
|
|
||||||
|
[54]
|
||||||
|
Sandra Bianchi = Hof 2, Tisch 54, Nummer 1
|
||||||
|
Thomas Bianchi = Hof 2, Tisch 54, Nummer 2
|
||||||
|
Mia Bianchi = Hof 2, Tisch 54, Nummer 3
|
||||||
|
|
||||||
|
[55]
|
||||||
|
Sandra Werner = Hof 2, Tisch 55, Nummer 1
|
||||||
|
Andreas Werner = Hof 2, Tisch 55, Nummer 2
|
||||||
|
Nadine Werner = Hof 2, Tisch 55, Nummer 3
|
||||||
|
Marco Werner = Hof 2, Tisch 55, Nummer 4
|
||||||
|
|
||||||
|
[56]
|
||||||
|
Olga Busch = Hof 2, Tisch 56, Nummer 1
|
||||||
|
Emre Busch = Hof 2, Tisch 56, Nummer 2
|
||||||
|
Marie Busch = Hof 2, Tisch 56, Nummer 3
|
||||||
|
Michael Busch = Hof 2, Tisch 56, Nummer 4
|
||||||
|
|
||||||
|
[57]
|
||||||
|
Prof. Dr. Emre Ludwig = Hof 2, Tisch 57, Nummer 1
|
||||||
|
Daniel Krause = Hof 2, Tisch 57, Nummer 2
|
||||||
|
Nicole Aksoy = Hof 2, Tisch 57, Nummer 3
|
||||||
|
Markus Klein = Hof 2, Tisch 57, Nummer 4
|
||||||
|
|
||||||
|
[58]
|
||||||
|
Prof. Dr. Marco Seifert = Hof 2, Tisch 58, Nummer 1
|
||||||
|
Matthias Krause = Hof 2, Tisch 58, Nummer 2
|
||||||
|
Giovanna Schwarz = Hof 2, Tisch 58, Nummer 3
|
||||||
|
|
||||||
|
[59]
|
||||||
|
Prof. Dr. Thomas Tran = Hof 2, Tisch 59, Nummer 1
|
||||||
|
Sergej Petrov = Hof 2, Tisch 59, Nummer 2
|
||||||
|
Kathrin Polat = Hof 2, Tisch 59, Nummer 3
|
||||||
|
Marija Aksoy = Hof 2, Tisch 59, Nummer 4
|
||||||
|
|
||||||
|
[60]
|
||||||
|
Nicole Sahin = Hof 2, Tisch 60, Nummer 1
|
||||||
|
Markus Sahin = Hof 2, Tisch 60, Nummer 2
|
||||||
|
Kathrin Sahin = Hof 2, Tisch 60, Nummer 3
|
||||||
|
Patrick Sahin = Hof 2, Tisch 60, Nummer 4
|
||||||
|
|
||||||
|
[61]
|
||||||
|
Sarah Maier = Hof 2, Tisch 61, Nummer 1
|
||||||
|
Christian Maier = Hof 2, Tisch 61, Nummer 2
|
||||||
|
Olga Maier = Hof 2, Tisch 61, Nummer 3
|
||||||
|
Arda Maier = Hof 2, Tisch 61, Nummer 4
|
||||||
|
|
||||||
|
[62]
|
||||||
|
Luca Kovac = Hof 2, Tisch 62, Nummer 1
|
||||||
|
Dr. Dragana Krause = Hof 2, Tisch 62, Nummer 2
|
||||||
|
Prof. Dr. Dennis Schmitt = Hof 2, Tisch 62, Nummer 3
|
||||||
|
|
||||||
|
[63]
|
||||||
|
Andreas Krause = Hof 2, Tisch 63, Nummer 1
|
||||||
|
Emma Krause = Hof 2, Tisch 63, Nummer 2
|
||||||
|
Arda Krause = Hof 2, Tisch 63, Nummer 3
|
||||||
|
Julia Krause = Hof 2, Tisch 63, Nummer 4
|
||||||
|
|
||||||
|
[64]
|
||||||
|
Katrin Werner = Hof 2, Tisch 64, Nummer 1
|
||||||
|
Patrick Busch = Hof 2, Tisch 64, Nummer 2
|
||||||
|
Emre Hoffmann = Hof 2, Tisch 64, Nummer 3
|
||||||
|
Sergej Lange = Hof 2, Tisch 64, Nummer 4
|
||||||
|
|
||||||
|
[65]
|
||||||
|
Nadine Arnold = Hof 2, Tisch 65, Nummer 1
|
||||||
|
Marco Richter = Hof 2, Tisch 65, Nummer 2
|
||||||
|
Prof. Dr. Patrick Hoffmann = Hof 2, Tisch 65, Nummer 3
|
||||||
|
Marija Polat = Hof 2, Tisch 65, Nummer 4
|
||||||
|
|
||||||
|
[66]
|
||||||
|
Lena Simon = Hof 2, Tisch 66, Nummer 1
|
||||||
|
Markus Simon = Hof 2, Tisch 66, Nummer 2
|
||||||
|
Emma Simon = Hof 2, Tisch 66, Nummer 3
|
||||||
|
Andreas Simon = Hof 2, Tisch 66, Nummer 4
|
||||||
|
|
||||||
|
[67]
|
||||||
|
Yusuf Weber = Hof 2, Tisch 67, Nummer 1
|
||||||
|
Dr. Patrick Kraus = Hof 2, Tisch 67, Nummer 2
|
||||||
|
Dr. Aylin Ludwig = Hof 2, Tisch 67, Nummer 3
|
||||||
|
|
||||||
|
[68]
|
||||||
|
Nicole Wagner = Hof 2, Tisch 68, Nummer 1
|
||||||
|
Marco Wagner = Hof 2, Tisch 68, Nummer 2
|
||||||
|
Sarah Wagner = Hof 2, Tisch 68, Nummer 3
|
||||||
|
Henry Wagner = Hof 2, Tisch 68, Nummer 4
|
||||||
|
|
||||||
|
[69]
|
||||||
|
Olga Franke = Hof 2, Tisch 69, Nummer 1
|
||||||
|
Amira Franke = Hof 2, Tisch 69, Nummer 2
|
||||||
|
Marco Franke = Hof 2, Tisch 69, Nummer 3
|
||||||
|
|
||||||
|
[70]
|
||||||
|
Svenja Zimmermann = Hof 2, Tisch 70, Nummer 1
|
||||||
|
Jan Zimmermann = Hof 2, Tisch 70, Nummer 2
|
||||||
|
Mia Zimmermann = Hof 2, Tisch 70, Nummer 3
|
||||||
|
Markus Zimmermann = Hof 2, Tisch 70, Nummer 4
|
||||||
|
|
||||||
|
[71]
|
||||||
|
Luca Ott = Hof 2, Tisch 71, Nummer 1
|
||||||
|
Patrick Zimmermann = Hof 2, Tisch 71, Nummer 2
|
||||||
|
Stefan Richter = Hof 2, Tisch 71, Nummer 3
|
||||||
|
|
||||||
|
[72]
|
||||||
|
Matthias Ott = Hof 2, Tisch 72, Nummer 1
|
||||||
|
Hannah Ott = Hof 2, Tisch 72, Nummer 2
|
||||||
|
Olga Ott = Hof 2, Tisch 72, Nummer 3
|
||||||
|
|
||||||
|
[73]
|
||||||
|
Jennifer Neumann = Hof 2, Tisch 73, Nummer 1
|
||||||
|
Thomas Neumann = Hof 2, Tisch 73, Nummer 2
|
||||||
|
Lina Neumann = Hof 2, Tisch 73, Nummer 3
|
||||||
|
Matteo Neumann = Hof 2, Tisch 73, Nummer 4
|
||||||
|
|
||||||
|
[74]
|
||||||
|
Patrick Barth = Hof 2, Tisch 74, Nummer 1
|
||||||
|
Nadine Barth = Hof 2, Tisch 74, Nummer 2
|
||||||
|
Timo Barth = Hof 2, Tisch 74, Nummer 3
|
||||||
|
Lina Barth = Hof 2, Tisch 74, Nummer 4
|
||||||
|
|
||||||
|
[75]
|
||||||
|
Dragana Pohl = Hof 2, Tisch 75, Nummer 1
|
||||||
|
Emre Pohl = Hof 2, Tisch 75, Nummer 2
|
||||||
|
Mia Pohl = Hof 2, Tisch 75, Nummer 3
|
||||||
|
Theo Pohl = Hof 2, Tisch 75, Nummer 4
|
||||||
|
|
||||||
|
[76]
|
||||||
|
Prof. Dr. Yusuf Esposito = Hof 2, Tisch 76, Nummer 1
|
||||||
|
Marija Becker = Hof 2, Tisch 76, Nummer 2
|
||||||
|
Matthias Kovac = Hof 2, Tisch 76, Nummer 3
|
||||||
|
|
||||||
|
[77]
|
||||||
|
Luca Kaya = Hof 2, Tisch 77, Nummer 1
|
||||||
|
Christina Kaya = Hof 2, Tisch 77, Nummer 2
|
||||||
|
Nicole Kaya = Hof 2, Tisch 77, Nummer 3
|
||||||
|
|
||||||
|
[78]
|
||||||
|
Deniz Hartmann = Hof 2, Tisch 78, Nummer 1
|
||||||
|
Nadine Hartmann = Hof 2, Tisch 78, Nummer 2
|
||||||
|
Michael Franke = Hof 2, Tisch 78, Nummer 3
|
||||||
|
Julia Franke = Hof 2, Tisch 78, Nummer 4
|
||||||
|
|
||||||
|
[79]
|
||||||
|
Kathrin Horn = Hof 2, Tisch 79, Nummer 1
|
||||||
|
Michael Horn = Hof 2, Tisch 79, Nummer 2
|
||||||
|
Layla Horn = Hof 2, Tisch 79, Nummer 3
|
||||||
|
Leon Horn = Hof 2, Tisch 79, Nummer 4
|
||||||
|
|
||||||
|
[80]
|
||||||
|
Stefanie Polat = Hof 2, Tisch 80, Nummer 1
|
||||||
|
Stefan Polat = Hof 2, Tisch 80, Nummer 2
|
||||||
|
Melanie Ott = Hof 2, Tisch 80, Nummer 3
|
||||||
|
Daniel Ott = Hof 2, Tisch 80, Nummer 4
|
||||||
|
|
||||||
|
[81]
|
||||||
|
Sarah Polat = Hof 2, Tisch 81, Nummer 1
|
||||||
|
Markus Polat = Hof 2, Tisch 81, Nummer 2
|
||||||
|
Katrin Polat = Hof 2, Tisch 81, Nummer 3
|
||||||
|
|
||||||
|
[82]
|
||||||
|
Olga Roth = Hof 2, Tisch 82, Nummer 1
|
||||||
|
Prof. Dr. Emre Albrecht = Hof 2, Tisch 82, Nummer 2
|
||||||
|
Thomas Bianchi = Hof 2, Tisch 82, Nummer 3
|
||||||
|
|
||||||
|
[83]
|
||||||
|
Emma Wolf = Hof 2, Tisch 83, Nummer 1
|
||||||
|
Ben Wolf = Hof 2, Tisch 83, Nummer 2
|
||||||
|
Julia Wolf = Hof 2, Tisch 83, Nummer 3
|
||||||
|
Thomas Wolf = Hof 2, Tisch 83, Nummer 4
|
||||||
|
|
||||||
|
[84]
|
||||||
|
Marija Hartmann = Hof 2, Tisch 84, Nummer 1
|
||||||
|
Thomas Hartmann = Hof 2, Tisch 84, Nummer 2
|
||||||
|
Olga Hartmann = Hof 2, Tisch 84, Nummer 3
|
||||||
|
|
||||||
|
[85]
|
||||||
|
Matthias Schmidt = Hof 2, Tisch 85, Nummer 1
|
||||||
|
Marie Schmidt = Hof 2, Tisch 85, Nummer 2
|
||||||
|
Giovanna Schmidt = Hof 2, Tisch 85, Nummer 3
|
||||||
|
|
||||||
|
[86]
|
||||||
|
Thomas Stein = Hof 2, Tisch 86, Nummer 1
|
||||||
|
Emilia Stein = Hof 2, Tisch 86, Nummer 2
|
||||||
|
Ben Stein = Hof 2, Tisch 86, Nummer 3
|
||||||
|
Giovanna Stein = Hof 2, Tisch 86, Nummer 4
|
||||||
|
|
||||||
|
[87]
|
||||||
|
Lena Frank = Hof 2, Tisch 87, Nummer 1
|
||||||
|
Marie Frank = Hof 2, Tisch 87, Nummer 2
|
||||||
|
Finn Frank = Hof 2, Tisch 87, Nummer 3
|
||||||
|
|
||||||
|
[88]
|
||||||
|
Dr. Olga Klein = Hof 2, Tisch 88, Nummer 1
|
||||||
|
Dr. Jennifer Arnold = Hof 2, Tisch 88, Nummer 2
|
||||||
|
Nadine Frank = Hof 2, Tisch 88, Nummer 3
|
||||||
|
Dennis Frank = Hof 2, Tisch 88, Nummer 4
|
||||||
|
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="1240" height="420" viewBox="0 0 1240 420" font-family="sans-serif">
|
||||||
|
<rect width="100%" height="100%" fill="white"/>
|
||||||
|
<text x="620" y="26" text-anchor="middle" font-size="18" fill="#333">Sommerfest - Umfeld/Grundriss: zwei trapezfoermige Innenhoefe (88 Vierertische, 300 Gaeste)</text>
|
||||||
|
<polygon points="48,96 512,96 432,320 128,320" fill="#f5f0e6" stroke="#7a6a50" stroke-width="2"/>
|
||||||
|
<text x="280" y="342" text-anchor="middle" font-size="14" fill="#7a6a50">Hof 1 (Tische 1-45)</text>
|
||||||
|
<polygon points="688,96 1152,96 1032,320 808,320" fill="#f5f0e6" stroke="#7a6a50" stroke-width="2"/>
|
||||||
|
<text x="920" y="342" text-anchor="middle" font-size="14" fill="#7a6a50">Hof 2 (Tische 46-88)</text>
|
||||||
|
<rect x="536" y="24" width="168" height="48" fill="#d9c9e8" stroke="#6b4d8a" stroke-width="2"/>
|
||||||
|
<text x="620" y="50" text-anchor="middle" font-size="13" fill="#4a3465">Buehne - Band</text>
|
||||||
|
<rect x="536" y="92" width="168" height="176" fill="#cfe3f0" stroke="#4a7ba0" stroke-width="2" stroke-dasharray="8 4"/>
|
||||||
|
<text x="620" y="180" text-anchor="middle" font-size="13" fill="#2d566f">Tanzflaeche</text>
|
||||||
|
<text x="16" y="208" text-anchor="start" font-size="12" fill="#a03030">Eingang West</text>
|
||||||
|
<text x="1184" y="208" text-anchor="end" font-size="12" fill="#a03030">Eingang Ost</text>
|
||||||
|
<text x="620" y="328" text-anchor="middle" font-size="12" fill="#a03030">Eingang Sued</text>
|
||||||
|
<polygon points="42,192 42,224 66,208" fill="#a03030"/>
|
||||||
|
<polygon points="1158,192 1158,224 1134,208" fill="#a03030"/>
|
||||||
|
<polygon points="604,318 636,318 620,294" fill="#a03030"/>
|
||||||
|
<circle cx="80" cy="128" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="120" cy="128" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="160" cy="128" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="200" cy="128" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="240" cy="128" r="12" fill="white" stroke="#c0392b" stroke-width="2.5"/>
|
||||||
|
<text x="240" y="131" text-anchor="middle" font-size="9" fill="#c0392b">VIP</text>
|
||||||
|
<circle cx="280" cy="128" r="12" fill="white" stroke="#c0392b" stroke-width="2.5"/>
|
||||||
|
<text x="280" y="131" text-anchor="middle" font-size="9" fill="#c0392b">VIP</text>
|
||||||
|
<circle cx="320" cy="128" r="12" fill="white" stroke="#c0392b" stroke-width="2.5"/>
|
||||||
|
<text x="320" y="131" text-anchor="middle" font-size="9" fill="#c0392b">VIP</text>
|
||||||
|
<circle cx="360" cy="128" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="400" cy="128" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="440" cy="128" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="480" cy="128" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="100" cy="168" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="140" cy="168" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="180" cy="168" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="220" cy="168" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="260" cy="168" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="300" cy="168" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="340" cy="168" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="380" cy="168" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="420" cy="168" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="460" cy="168" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="120" cy="208" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="160" cy="208" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="200" cy="208" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="240" cy="208" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="280" cy="208" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="320" cy="208" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="360" cy="208" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="400" cy="208" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="440" cy="208" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="140" cy="248" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="180" cy="248" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="220" cy="248" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="260" cy="248" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="300" cy="248" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="340" cy="248" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="380" cy="248" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="420" cy="248" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="160" cy="288" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="200" cy="288" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="240" cy="288" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="280" cy="288" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="320" cy="288" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="360" cy="288" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="400" cy="288" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="720" cy="128" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="760" cy="128" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="800" cy="128" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="840" cy="128" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="880" cy="128" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="920" cy="128" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="960" cy="128" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="1000" cy="128" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="1040" cy="128" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="1080" cy="128" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="1120" cy="128" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="740" cy="168" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="780" cy="168" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="820" cy="168" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="860" cy="168" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="900" cy="168" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="940" cy="168" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="980" cy="168" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="1020" cy="168" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="1060" cy="168" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="1100" cy="168" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="760" cy="208" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="800" cy="208" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="840" cy="208" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="880" cy="208" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="920" cy="208" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="960" cy="208" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="1000" cy="208" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="1040" cy="208" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="1080" cy="208" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="780" cy="248" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="820" cy="248" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="860" cy="248" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="900" cy="248" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="940" cy="248" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="980" cy="248" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="1020" cy="248" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="1060" cy="248" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="840" cy="288" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="880" cy="288" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="920" cy="288" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="960" cy="288" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<circle cx="1000" cy="288" r="12" fill="white" stroke="#999999" stroke-width="1"/>
|
||||||
|
<text x="620" y="408" text-anchor="middle" font-size="11" fill="#888">Umfeld.svg - Grundriss-Elemente (Buehne, Band, Tanzflaeche, Eingaenge) werden nicht mitoptimiert; VIP-Tische 5/6/7 vor der Buehne</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 9.1 KiB |
@@ -0,0 +1,301 @@
|
|||||||
|
Vorname;Nachname;Titel;Gruppe;Tisch;Anzahl
|
||||||
|
Alexander;Grothe;Dr. h.c.;VIP Industrie: Vorstand Automobilkonzern (fest an Tisch 5, vor der Buehne);5;
|
||||||
|
Beate;Grothe;;VIP Industrie: Vorstand Automobilkonzern (fest an Tisch 5, vor der Buehne);5;
|
||||||
|
Ferdinand;Kessler;Dr.;VIP Industrie: Vorstand Automobilkonzern (fest an Tisch 5, vor der Buehne);5;
|
||||||
|
Viktoria;Kessler;;VIP Industrie: Vorstand Automobilkonzern (fest an Tisch 5, vor der Buehne);5;
|
||||||
|
Konstantin;Freiherr von Waldeck;Dr.;VIP Wirtschaft: Bankvorstand (fest an Tisch 6);6;
|
||||||
|
Antonia;Freifrau von Waldeck;;VIP Wirtschaft: Bankvorstand (fest an Tisch 6);6;
|
||||||
|
Georg;Steinbach;;VIP Wirtschaft: Bankvorstand (fest an Tisch 6);6;
|
||||||
|
Elisabeth;Steinbach;;VIP Wirtschaft: Bankvorstand (fest an Tisch 6);6;
|
||||||
|
Heinrich;Dallmann;;VIP Industrie: Unternehmerfamilie (fest an Tisch 7);7;
|
||||||
|
Margarete;Dallmann;;VIP Industrie: Unternehmerfamilie (fest an Tisch 7);7;
|
||||||
|
Maximilian;Dallmann;;VIP Industrie: Unternehmerfamilie (fest an Tisch 7);7;
|
||||||
|
Charlotte;Dallmann;;VIP Industrie: Unternehmerfamilie (fest an Tisch 7);7;
|
||||||
|
Sandra;Bianchi;;Familie Bianchi (Studierenden-Familie 1);;
|
||||||
|
Thomas;Bianchi;;Familie Bianchi (Studierenden-Familie 1);;
|
||||||
|
Mia;Bianchi;;Familie Bianchi (Studierenden-Familie 1);;
|
||||||
|
Jennifer;Arnold;;Familie Arnold (Studierenden-Familie 2);;
|
||||||
|
Patrick;Arnold;;Familie Arnold (Studierenden-Familie 2);;
|
||||||
|
Leni;Arnold;;Familie Arnold (Studierenden-Familie 2);;
|
||||||
|
Christian;Arnold;;Familie Arnold (Studierenden-Familie 2);;
|
||||||
|
Mila;Arnold;;Familie Arnold (Studierenden-Familie 2);;
|
||||||
|
Nicole;Seifert;;Familie Seifert (Studierenden-Familie 3);;
|
||||||
|
Yusuf;Seifert;;Familie Seifert (Studierenden-Familie 3);;
|
||||||
|
Leni;Seifert;;Familie Seifert (Studierenden-Familie 3);;
|
||||||
|
Timo;Seifert;;Familie Seifert (Studierenden-Familie 3);;
|
||||||
|
Elif;Seifert;;Familie Seifert (Studierenden-Familie 3);;
|
||||||
|
Sarah;Albrecht;;Familie Albrecht (Studierenden-Familie 4);;
|
||||||
|
Andreas;Albrecht;;Familie Albrecht (Studierenden-Familie 4);;
|
||||||
|
Yusuf;Esposito;Prof. Dr.;Institut fuer Maschinenwesen;;
|
||||||
|
Marija;Becker;;Institut fuer Maschinenwesen;;
|
||||||
|
Matthias;Kovac;;Institut fuer Maschinenwesen;;
|
||||||
|
Nicole;Kaya;;Familie Kaya (Studierenden-Familie 5);;
|
||||||
|
Luca;Kaya;;Familie Kaya (Studierenden-Familie 5);;
|
||||||
|
Christina;Kaya;;Familie Kaya (Studierenden-Familie 5);;
|
||||||
|
Julia;Richter;Prof. Dr.;Lehrstuhl Thermodynamik;;
|
||||||
|
Jennifer;Haas;Dr.;Lehrstuhl Thermodynamik;;
|
||||||
|
Markus;Barth;;Lehrstuhl Thermodynamik;;
|
||||||
|
Matthias;Petrov;;Lehrstuhl Thermodynamik;;
|
||||||
|
Andreas;Weber;;Lehrstuhl Thermodynamik;;
|
||||||
|
Giovanna;Schmidt;;Familie Schmidt (Studierenden-Familie 6);;
|
||||||
|
Matthias;Schmidt;;Familie Schmidt (Studierenden-Familie 6);;
|
||||||
|
Marie;Schmidt;;Familie Schmidt (Studierenden-Familie 6);;
|
||||||
|
Anja;Richter;;Familie Richter (Studierenden-Familie 7);;
|
||||||
|
Matthias;Richter;;Familie Richter (Studierenden-Familie 7);;
|
||||||
|
Greta;Richter;;Familie Richter (Studierenden-Familie 7);;
|
||||||
|
Anton;Richter;;Familie Richter (Studierenden-Familie 7);;
|
||||||
|
Emre;Albrecht;Prof. Dr.;Institut fuer Informatik;;
|
||||||
|
Thomas;Bianchi;;Institut fuer Informatik;;
|
||||||
|
Olga;Roth;;Institut fuer Informatik;;
|
||||||
|
Olga;Klein;Dr.;Institut fuer Informatik;;
|
||||||
|
Jennifer;Arnold;Dr.;Institut fuer Informatik;;
|
||||||
|
Dennis;Werner;Prof. Dr.;Lehrstuhl Regelungstechnik;;
|
||||||
|
Thomas;Hoffmann;Dr.;Lehrstuhl Regelungstechnik;;
|
||||||
|
Olga;Tran;;Lehrstuhl Regelungstechnik;;
|
||||||
|
Anja;Seidel;Dr.;Lehrstuhl Regelungstechnik;;
|
||||||
|
Markus;Stein;Prof. Dr.;Institut fuer Werkstoffkunde;;
|
||||||
|
Matthias;Popescu;;Institut fuer Werkstoffkunde;;
|
||||||
|
Yusuf;Albrecht;Prof. Dr.;Lehrstuhl Stroemungsmechanik;;
|
||||||
|
Svenja;Simon;;Lehrstuhl Stroemungsmechanik;;
|
||||||
|
Julia;Roth;Prof. Dr.;Institut fuer Elektrotechnik;;
|
||||||
|
Thomas;Hansen;;Institut fuer Elektrotechnik;;
|
||||||
|
Nicole;Schmidt;;Institut fuer Elektrotechnik;;
|
||||||
|
Julia;Nguyen;;Institut fuer Elektrotechnik;;
|
||||||
|
Stefanie;Seifert;Dr.;Institut fuer Elektrotechnik;;
|
||||||
|
Thomas;Winkler;;Institut fuer Elektrotechnik;;
|
||||||
|
Jan;Esposito;Dr.;Institut fuer Elektrotechnik;;
|
||||||
|
Nicole;Becker;;Familie Becker (Studierenden-Familie 8);;
|
||||||
|
Jan;Becker;;Familie Becker (Studierenden-Familie 8);;
|
||||||
|
Sandra;Becker;;Familie Becker (Studierenden-Familie 8);;
|
||||||
|
Kathrin;Petrov;Prof. Dr.;Lehrstuhl Mathematik;;
|
||||||
|
Markus;Seidel;Dr.;Lehrstuhl Mathematik;;
|
||||||
|
Markus;Kraus;;Lehrstuhl Mathematik;;
|
||||||
|
Giovanna;Petrov;;Lehrstuhl Mathematik;;
|
||||||
|
Nadine;Stein;Dr.;Lehrstuhl Mathematik;;
|
||||||
|
Markus;Schmitt;;Lehrstuhl Mathematik;;
|
||||||
|
Christian;Peters;;Lehrstuhl Mathematik;;
|
||||||
|
Anja;Nguyen;;Familie Nguyen (Studierenden-Familie 9);;
|
||||||
|
Daniel;Nguyen;;Familie Nguyen (Studierenden-Familie 9);;
|
||||||
|
Sofia;Nguyen;;Familie Nguyen (Studierenden-Familie 9);;
|
||||||
|
Elif;Celik;;Familie Celik (Studierenden-Familie 10);;
|
||||||
|
Patrick;Celik;;Familie Celik (Studierenden-Familie 10);;
|
||||||
|
Stefanie;Klein;;Familie Klein (Studierenden-Familie 11);;
|
||||||
|
Milan;Klein;;Familie Klein (Studierenden-Familie 11);;
|
||||||
|
Lina;Klein;;Familie Klein (Studierenden-Familie 11);;
|
||||||
|
Olga;Busch;;Familie Busch (Studierenden-Familie 12);;
|
||||||
|
Emre;Busch;;Familie Busch (Studierenden-Familie 12);;
|
||||||
|
Marie;Busch;;Familie Busch (Studierenden-Familie 12);;
|
||||||
|
Michael;Busch;;Familie Busch (Studierenden-Familie 12);;
|
||||||
|
Stefan;Schmitt;Prof. Dr.;Institut fuer Physik;;
|
||||||
|
Marija;Tran;;Institut fuer Physik;;
|
||||||
|
Kathrin;Koch;Dr.;Institut fuer Physik;;
|
||||||
|
Julia;Kuhn;Dr.;Institut fuer Physik;;
|
||||||
|
Katrin;Weber;;Institut fuer Physik;;
|
||||||
|
Luca;Werner;;Institut fuer Physik;;
|
||||||
|
Anja;Engel;;Familie Engel (Studierenden-Familie 13);;
|
||||||
|
Yusuf;Engel;;Familie Engel (Studierenden-Familie 13);;
|
||||||
|
Julia;Engel;;Familie Engel (Studierenden-Familie 13);;
|
||||||
|
Anton;Engel;;Familie Engel (Studierenden-Familie 13);;
|
||||||
|
Nicole;Engel;;Familie Engel (Studierenden-Familie 13);;
|
||||||
|
Emre;Ludwig;Prof. Dr.;Lehrstuhl Produktionstechnik;;
|
||||||
|
Daniel;Krause;;Lehrstuhl Produktionstechnik;;
|
||||||
|
Nicole;Aksoy;;Lehrstuhl Produktionstechnik;;
|
||||||
|
Markus;Klein;;Lehrstuhl Produktionstechnik;;
|
||||||
|
Dennis;Schmitt;Prof. Dr.;Institut fuer Chemie;;
|
||||||
|
Luca;Kovac;;Institut fuer Chemie;;
|
||||||
|
Dragana;Krause;Dr.;Institut fuer Chemie;;
|
||||||
|
Luca;Ott;;Institut fuer Chemie;;
|
||||||
|
Patrick;Zimmermann;;Institut fuer Chemie;;
|
||||||
|
Stefan;Richter;;Institut fuer Chemie;;
|
||||||
|
Yusuf;Seidel;Prof. Dr.;Lehrstuhl Fahrzeugtechnik;;
|
||||||
|
Yusuf;Bauer;;Lehrstuhl Fahrzeugtechnik;;
|
||||||
|
Jan;Bianchi;Dr.;Lehrstuhl Fahrzeugtechnik;;
|
||||||
|
Marco;Winkler;;Lehrstuhl Fahrzeugtechnik;;
|
||||||
|
Emre;Klein;;Lehrstuhl Fahrzeugtechnik;;
|
||||||
|
Patrick;Kaya;Dr.;Lehrstuhl Fahrzeugtechnik;;
|
||||||
|
Christina;Krause;Dr.;Lehrstuhl Fahrzeugtechnik;;
|
||||||
|
Nadine;Frank;;Familie Frank (Studierenden-Familie 14);;
|
||||||
|
Dennis;Frank;;Familie Frank (Studierenden-Familie 14);;
|
||||||
|
Marie;Frank;;Familie Frank (Studierenden-Familie 14);;
|
||||||
|
Finn;Frank;;Familie Frank (Studierenden-Familie 14);;
|
||||||
|
Lena;Frank;;Familie Frank (Studierenden-Familie 14);;
|
||||||
|
Sandra;Werner;;Familie Werner (Studierenden-Familie 15);;
|
||||||
|
Andreas;Werner;;Familie Werner (Studierenden-Familie 15);;
|
||||||
|
Nadine;Werner;;Familie Werner (Studierenden-Familie 15);;
|
||||||
|
Marco;Werner;;Familie Werner (Studierenden-Familie 15);;
|
||||||
|
Sarah;Roth;;Familie Roth (Studierenden-Familie 16);;
|
||||||
|
Christian;Roth;;Familie Roth (Studierenden-Familie 16);;
|
||||||
|
Sofia;Roth;;Familie Roth (Studierenden-Familie 16);;
|
||||||
|
Marco;Seifert;Prof. Dr.;Institut fuer Bauingenieurwesen;;
|
||||||
|
Matthias;Krause;;Institut fuer Bauingenieurwesen;;
|
||||||
|
Giovanna;Schwarz;;Institut fuer Bauingenieurwesen;;
|
||||||
|
Yusuf;Weber;;Institut fuer Bauingenieurwesen;;
|
||||||
|
Patrick;Kraus;Dr.;Institut fuer Bauingenieurwesen;;
|
||||||
|
Aylin;Ludwig;Dr.;Institut fuer Bauingenieurwesen;;
|
||||||
|
Patrick;Hoffmann;Prof. Dr.;Lehrstuhl Messtechnik;;
|
||||||
|
Marija;Polat;;Lehrstuhl Messtechnik;;
|
||||||
|
Nadine;Arnold;;Lehrstuhl Messtechnik;;
|
||||||
|
Marco;Richter;;Lehrstuhl Messtechnik;;
|
||||||
|
Dragana;Dietrich;Prof. Dr.;Doktorandenrunde Energietechnik;;
|
||||||
|
Michael;Aksoy;Dr.;Doktorandenrunde Energietechnik;;
|
||||||
|
Katrin;Werner;;Doktorandenrunde Energietechnik;;
|
||||||
|
Patrick;Busch;;Doktorandenrunde Energietechnik;;
|
||||||
|
Emre;Hoffmann;;Doktorandenrunde Energietechnik;;
|
||||||
|
Sergej;Lange;;Doktorandenrunde Energietechnik;;
|
||||||
|
Anja;Richter;Prof. Dr.;Doktorandenrunde Robotik;;
|
||||||
|
Jan;Thiel;Dr.;Doktorandenrunde Robotik;;
|
||||||
|
Thomas;Sahin;;Doktorandenrunde Robotik;;
|
||||||
|
Sarah;Koch;;Familie Koch (Studierenden-Familie 17);;
|
||||||
|
Jan;Koch;;Familie Koch (Studierenden-Familie 17);;
|
||||||
|
Marie;Koch;;Familie Koch (Studierenden-Familie 17);;
|
||||||
|
Emil;Koch;;Familie Koch (Studierenden-Familie 17);;
|
||||||
|
Olga;Koch;;Familie Koch (Studierenden-Familie 17);;
|
||||||
|
Michael;Koch;;Familie Koch (Studierenden-Familie 17);;
|
||||||
|
Thomas;Tran;Prof. Dr.;Emeriti-Stammtisch;;
|
||||||
|
Sergej;Petrov;;Emeriti-Stammtisch;;
|
||||||
|
Kathrin;Polat;;Emeriti-Stammtisch;;
|
||||||
|
Marija;Aksoy;;Emeriti-Stammtisch;;
|
||||||
|
Sergej;Ott;Prof. Dr.;Institut fuer Verfahrenstechnik;;
|
||||||
|
Dragana;Bauer;;Institut fuer Verfahrenstechnik;;
|
||||||
|
Nicole;Peters;;Institut fuer Verfahrenstechnik;;
|
||||||
|
Nicole;Hansen;Dr.;Institut fuer Verfahrenstechnik;;
|
||||||
|
Thomas;Krause;;Institut fuer Verfahrenstechnik;;
|
||||||
|
Patrick;Haas;;Institut fuer Verfahrenstechnik;;
|
||||||
|
Timo;Kaya;Prof. Dr.;Lehrstuhl Mechatronik;;
|
||||||
|
Sandra;Demir;Dr.;Lehrstuhl Mechatronik;;
|
||||||
|
Yusuf;Ott;Prof. Dr.;Institut fuer Luftfahrttechnik;;
|
||||||
|
Nadine;Berger;Dr.;Institut fuer Luftfahrttechnik;;
|
||||||
|
Patrick;Lehmann;;Institut fuer Luftfahrttechnik;;
|
||||||
|
Nicole;Wagner;;Familie Wagner (Studierenden-Familie 18);;
|
||||||
|
Marco;Wagner;;Familie Wagner (Studierenden-Familie 18);;
|
||||||
|
Sarah;Wagner;;Familie Wagner (Studierenden-Familie 18);;
|
||||||
|
Henry;Wagner;;Familie Wagner (Studierenden-Familie 18);;
|
||||||
|
Jennifer;Dietrich;;Familie Dietrich (Studierenden-Familie 19);;
|
||||||
|
Marco;Dietrich;;Familie Dietrich (Studierenden-Familie 19);;
|
||||||
|
Sofia;Dietrich;;Familie Dietrich (Studierenden-Familie 19);;
|
||||||
|
Julia;Thiel;;Familie Thiel (Studierenden-Familie 20);;
|
||||||
|
Yusuf;Thiel;;Familie Thiel (Studierenden-Familie 20);;
|
||||||
|
Christina;Thiel;;Familie Thiel (Studierenden-Familie 20);;
|
||||||
|
Sarah;Schmitt;;Familie Schmitt (Studierenden-Familie 21);;
|
||||||
|
Markus;Schmitt;;Familie Schmitt (Studierenden-Familie 21);;
|
||||||
|
Sofia;Schmitt;;Familie Schmitt (Studierenden-Familie 21);;
|
||||||
|
Marija;Hartmann;;Familie Hartmann (Studierenden-Familie 22);;
|
||||||
|
Thomas;Hartmann;;Familie Hartmann (Studierenden-Familie 22);;
|
||||||
|
Olga;Hartmann;;Familie Hartmann (Studierenden-Familie 22);;
|
||||||
|
Deniz;Hartmann;;Familie Hartmann (Studierenden-Familie 22);;
|
||||||
|
Nadine;Hartmann;;Familie Hartmann (Studierenden-Familie 22);;
|
||||||
|
Melanie;Rossi;;Familie Rossi (Studierenden-Familie 23);;
|
||||||
|
Luca;Rossi;;Familie Rossi (Studierenden-Familie 23);;
|
||||||
|
Emilia;Rossi;;Familie Rossi (Studierenden-Familie 23);;
|
||||||
|
Julia;Braun;;Familie Braun (Studierenden-Familie 24);;
|
||||||
|
Milan;Braun;;Familie Braun (Studierenden-Familie 24);;
|
||||||
|
Nadine;Braun;;Familie Braun (Studierenden-Familie 24);;
|
||||||
|
Jan;Braun;;Familie Braun (Studierenden-Familie 24);;
|
||||||
|
Dragana;Braun;;Familie Braun (Studierenden-Familie 24);;
|
||||||
|
Christian;Braun;;Familie Braun (Studierenden-Familie 24);;
|
||||||
|
Svenja;Zimmermann;;Familie Zimmermann (Studierenden-Familie 25);;
|
||||||
|
Jan;Zimmermann;;Familie Zimmermann (Studierenden-Familie 25);;
|
||||||
|
Mia;Zimmermann;;Familie Zimmermann (Studierenden-Familie 25);;
|
||||||
|
Markus;Zimmermann;;Familie Zimmermann (Studierenden-Familie 25);;
|
||||||
|
Julia;Krause;;Familie Krause (Studierenden-Familie 26);;
|
||||||
|
Andreas;Krause;;Familie Krause (Studierenden-Familie 26);;
|
||||||
|
Emma;Krause;;Familie Krause (Studierenden-Familie 26);;
|
||||||
|
Arda;Krause;;Familie Krause (Studierenden-Familie 26);;
|
||||||
|
Aylin;Nowak;;Familie Nowak (Studierenden-Familie 27);;
|
||||||
|
Markus;Nowak;;Familie Nowak (Studierenden-Familie 27);;
|
||||||
|
Lina;Nowak;;Familie Nowak (Studierenden-Familie 27);;
|
||||||
|
Noah;Nowak;;Familie Nowak (Studierenden-Familie 27);;
|
||||||
|
Kathrin;Nowak;;Familie Nowak (Studierenden-Familie 27);;
|
||||||
|
Felix;Nowak;;Familie Nowak (Studierenden-Familie 27);;
|
||||||
|
Kathrin;Horn;;Familie Horn (Studierenden-Familie 28);;
|
||||||
|
Michael;Horn;;Familie Horn (Studierenden-Familie 28);;
|
||||||
|
Layla;Horn;;Familie Horn (Studierenden-Familie 28);;
|
||||||
|
Leon;Horn;;Familie Horn (Studierenden-Familie 28);;
|
||||||
|
Melanie;Ott;;Familie Ott (Studierenden-Familie 29);;
|
||||||
|
Daniel;Ott;;Familie Ott (Studierenden-Familie 29);;
|
||||||
|
Olga;Ott;;Familie Ott (Studierenden-Familie 29);;
|
||||||
|
Matthias;Ott;;Familie Ott (Studierenden-Familie 29);;
|
||||||
|
Hannah;Ott;;Familie Ott (Studierenden-Familie 29);;
|
||||||
|
Jennifer;Neumann;;Familie Neumann (Studierenden-Familie 30);;
|
||||||
|
Thomas;Neumann;;Familie Neumann (Studierenden-Familie 30);;
|
||||||
|
Lina;Neumann;;Familie Neumann (Studierenden-Familie 30);;
|
||||||
|
Matteo;Neumann;;Familie Neumann (Studierenden-Familie 30);;
|
||||||
|
Julia;Wolf;;Familie Wolf (Studierenden-Familie 31);;
|
||||||
|
Thomas;Wolf;;Familie Wolf (Studierenden-Familie 31);;
|
||||||
|
Emma;Wolf;;Familie Wolf (Studierenden-Familie 31);;
|
||||||
|
Ben;Wolf;;Familie Wolf (Studierenden-Familie 31);;
|
||||||
|
Nadine;Aksoy;;Familie Aksoy (Studierenden-Familie 32);;
|
||||||
|
Thomas;Aksoy;;Familie Aksoy (Studierenden-Familie 32);;
|
||||||
|
Marie;Aksoy;;Familie Aksoy (Studierenden-Familie 32);;
|
||||||
|
Luca;Aksoy;;Familie Aksoy (Studierenden-Familie 32);;
|
||||||
|
Sofia;Aksoy;;Familie Aksoy (Studierenden-Familie 32);;
|
||||||
|
Sergej;Aksoy;;Familie Aksoy (Studierenden-Familie 32);;
|
||||||
|
Giovanna;Hansen;;Familie Hansen (Studierenden-Familie 33);;
|
||||||
|
Markus;Hansen;;Familie Hansen (Studierenden-Familie 33);;
|
||||||
|
Olga;Hansen;;Familie Hansen (Studierenden-Familie 33);;
|
||||||
|
Stefanie;Polat;;Familie Polat (Studierenden-Familie 34);;
|
||||||
|
Stefan;Polat;;Familie Polat (Studierenden-Familie 34);;
|
||||||
|
Sarah;Polat;;Familie Polat (Studierenden-Familie 34);;
|
||||||
|
Markus;Polat;;Familie Polat (Studierenden-Familie 34);;
|
||||||
|
Katrin;Polat;;Familie Polat (Studierenden-Familie 34);;
|
||||||
|
Olga;Franke;;Familie Franke (Studierenden-Familie 35);;
|
||||||
|
Marco;Franke;;Familie Franke (Studierenden-Familie 35);;
|
||||||
|
Amira;Franke;;Familie Franke (Studierenden-Familie 35);;
|
||||||
|
Michael;Franke;;Familie Franke (Studierenden-Familie 35);;
|
||||||
|
Julia;Franke;;Familie Franke (Studierenden-Familie 35);;
|
||||||
|
Lena;Kovac;;Familie Kovac (Studierenden-Familie 36);;
|
||||||
|
Tobias;Kovac;;Familie Kovac (Studierenden-Familie 36);;
|
||||||
|
Marija;Kovac;;Familie Kovac (Studierenden-Familie 36);;
|
||||||
|
Marco;Kovac;;Familie Kovac (Studierenden-Familie 36);;
|
||||||
|
Anja;Kovac;;Familie Kovac (Studierenden-Familie 36);;
|
||||||
|
Henry;Kovac;;Familie Kovac (Studierenden-Familie 36);;
|
||||||
|
Lena;Winkler;;Familie Winkler (Studierenden-Familie 37);;
|
||||||
|
Patrick;Winkler;;Familie Winkler (Studierenden-Familie 37);;
|
||||||
|
Kathrin;Petrov;;Familie Petrov (Studierenden-Familie 38);;
|
||||||
|
Milan;Petrov;;Familie Petrov (Studierenden-Familie 38);;
|
||||||
|
Giovanna;Stein;;Familie Stein (Studierenden-Familie 39);;
|
||||||
|
Thomas;Stein;;Familie Stein (Studierenden-Familie 39);;
|
||||||
|
Emilia;Stein;;Familie Stein (Studierenden-Familie 39);;
|
||||||
|
Ben;Stein;;Familie Stein (Studierenden-Familie 39);;
|
||||||
|
Dragana;Pohl;;Familie Pohl (Studierenden-Familie 40);;
|
||||||
|
Emre;Pohl;;Familie Pohl (Studierenden-Familie 40);;
|
||||||
|
Mia;Pohl;;Familie Pohl (Studierenden-Familie 40);;
|
||||||
|
Theo;Pohl;;Familie Pohl (Studierenden-Familie 40);;
|
||||||
|
Svenja;Berger;;Familie Berger (Studierenden-Familie 41);;
|
||||||
|
Andreas;Berger;;Familie Berger (Studierenden-Familie 41);;
|
||||||
|
Jennifer;Berger;;Familie Berger (Studierenden-Familie 41);;
|
||||||
|
Anton;Berger;;Familie Berger (Studierenden-Familie 41);;
|
||||||
|
Layla;Berger;;Familie Berger (Studierenden-Familie 41);;
|
||||||
|
Stefan;Berger;;Familie Berger (Studierenden-Familie 41);;
|
||||||
|
Nadine;Barth;;Familie Barth (Studierenden-Familie 42);;
|
||||||
|
Timo;Barth;;Familie Barth (Studierenden-Familie 42);;
|
||||||
|
Lina;Barth;;Familie Barth (Studierenden-Familie 42);;
|
||||||
|
Patrick;Barth;;Familie Barth (Studierenden-Familie 42);;
|
||||||
|
Lena;Simon;;Familie Simon (Studierenden-Familie 43);;
|
||||||
|
Markus;Simon;;Familie Simon (Studierenden-Familie 43);;
|
||||||
|
Emma;Simon;;Familie Simon (Studierenden-Familie 43);;
|
||||||
|
Andreas;Simon;;Familie Simon (Studierenden-Familie 43);;
|
||||||
|
Dragana;Lange;;Familie Lange (Studierenden-Familie 44);;
|
||||||
|
Michael;Lange;;Familie Lange (Studierenden-Familie 44);;
|
||||||
|
Sofia;Lange;;Familie Lange (Studierenden-Familie 44);;
|
||||||
|
Jan;Lange;;Familie Lange (Studierenden-Familie 44);;
|
||||||
|
Svenja;Lange;;Familie Lange (Studierenden-Familie 44);;
|
||||||
|
Giovanna;Lehmann;;Familie Lehmann (Studierenden-Familie 45);;
|
||||||
|
Milan;Lehmann;;Familie Lehmann (Studierenden-Familie 45);;
|
||||||
|
Layla;Lehmann;;Familie Lehmann (Studierenden-Familie 45);;
|
||||||
|
Thomas;Lehmann;;Familie Lehmann (Studierenden-Familie 45);;
|
||||||
|
Nicole;Lehmann;;Familie Lehmann (Studierenden-Familie 45);;
|
||||||
|
Markus;Lehmann;;Familie Lehmann (Studierenden-Familie 45);;
|
||||||
|
Sarah;Maier;;Familie Maier (Studierenden-Familie 46);;
|
||||||
|
Christian;Maier;;Familie Maier (Studierenden-Familie 46);;
|
||||||
|
Olga;Maier;;Familie Maier (Studierenden-Familie 46);;
|
||||||
|
Arda;Maier;;Familie Maier (Studierenden-Familie 46);;
|
||||||
|
Nicole;Sahin;;Familie Sahin (Studierenden-Familie 47);;
|
||||||
|
Markus;Sahin;;Familie Sahin (Studierenden-Familie 47);;
|
||||||
|
Kathrin;Sahin;;Familie Sahin (Studierenden-Familie 47);;
|
||||||
|
Patrick;Sahin;;Familie Sahin (Studierenden-Familie 47);;
|
||||||
|
Giovanna;Ludwig;;Familie Ludwig (Studierenden-Familie 48);;
|
||||||
|
Emre;Ludwig;;Familie Ludwig (Studierenden-Familie 48);;
|
||||||
|
Elif;Ludwig;;Familie Ludwig (Studierenden-Familie 48);;
|
||||||
|
Elias;Ludwig;;Familie Ludwig (Studierenden-Familie 48);;
|
||||||
|
Julia;Weber;;Familie Weber (Studierenden-Familie 49);;
|
||||||
|
@@ -0,0 +1,615 @@
|
|||||||
|
[1]
|
||||||
|
Nummer=1
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[2, 12]
|
||||||
|
Koordinaten=(0,0)
|
||||||
|
|
||||||
|
[2]
|
||||||
|
Nummer=2
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[1, 3, 12, 13]
|
||||||
|
Koordinaten=(1,0)
|
||||||
|
|
||||||
|
[3]
|
||||||
|
Nummer=3
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[2, 4, 13, 14]
|
||||||
|
Koordinaten=(2,0)
|
||||||
|
|
||||||
|
[4]
|
||||||
|
Nummer=4
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[3, 5, 14, 15]
|
||||||
|
Koordinaten=(3,0)
|
||||||
|
|
||||||
|
[5]
|
||||||
|
Nummer=5
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[4, 6, 15, 16]
|
||||||
|
Koordinaten=(4,0)
|
||||||
|
|
||||||
|
[6]
|
||||||
|
Nummer=6
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[5, 7, 16, 17]
|
||||||
|
Koordinaten=(5,0)
|
||||||
|
|
||||||
|
[7]
|
||||||
|
Nummer=7
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[6, 8, 17, 18]
|
||||||
|
Koordinaten=(6,0)
|
||||||
|
|
||||||
|
[8]
|
||||||
|
Nummer=8
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[7, 9, 18, 19]
|
||||||
|
Koordinaten=(7,0)
|
||||||
|
|
||||||
|
[9]
|
||||||
|
Nummer=9
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[8, 10, 19, 20]
|
||||||
|
Koordinaten=(8,0)
|
||||||
|
|
||||||
|
[10]
|
||||||
|
Nummer=10
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[9, 11, 20, 21]
|
||||||
|
Koordinaten=(9,0)
|
||||||
|
|
||||||
|
[11]
|
||||||
|
Nummer=11
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[10, 21]
|
||||||
|
Koordinaten=(10,0)
|
||||||
|
|
||||||
|
[12]
|
||||||
|
Nummer=12
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[1, 2, 13, 22]
|
||||||
|
Koordinaten=(0.5,1)
|
||||||
|
|
||||||
|
[13]
|
||||||
|
Nummer=13
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[2, 3, 12, 14, 22, 23]
|
||||||
|
Koordinaten=(1.5,1)
|
||||||
|
|
||||||
|
[14]
|
||||||
|
Nummer=14
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[3, 4, 13, 15, 23, 24]
|
||||||
|
Koordinaten=(2.5,1)
|
||||||
|
|
||||||
|
[15]
|
||||||
|
Nummer=15
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[4, 5, 14, 16, 24, 25]
|
||||||
|
Koordinaten=(3.5,1)
|
||||||
|
|
||||||
|
[16]
|
||||||
|
Nummer=16
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[5, 6, 15, 17, 25, 26]
|
||||||
|
Koordinaten=(4.5,1)
|
||||||
|
|
||||||
|
[17]
|
||||||
|
Nummer=17
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[6, 7, 16, 18, 26, 27]
|
||||||
|
Koordinaten=(5.5,1)
|
||||||
|
|
||||||
|
[18]
|
||||||
|
Nummer=18
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[7, 8, 17, 19, 27, 28]
|
||||||
|
Koordinaten=(6.5,1)
|
||||||
|
|
||||||
|
[19]
|
||||||
|
Nummer=19
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[8, 9, 18, 20, 28, 29]
|
||||||
|
Koordinaten=(7.5,1)
|
||||||
|
|
||||||
|
[20]
|
||||||
|
Nummer=20
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[9, 10, 19, 21, 29, 30]
|
||||||
|
Koordinaten=(8.5,1)
|
||||||
|
|
||||||
|
[21]
|
||||||
|
Nummer=21
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[10, 11, 20, 30]
|
||||||
|
Koordinaten=(9.5,1)
|
||||||
|
|
||||||
|
[22]
|
||||||
|
Nummer=22
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[12, 13, 23, 31]
|
||||||
|
Koordinaten=(1,2)
|
||||||
|
|
||||||
|
[23]
|
||||||
|
Nummer=23
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[13, 14, 22, 24, 31, 32]
|
||||||
|
Koordinaten=(2,2)
|
||||||
|
|
||||||
|
[24]
|
||||||
|
Nummer=24
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[14, 15, 23, 25, 32, 33]
|
||||||
|
Koordinaten=(3,2)
|
||||||
|
|
||||||
|
[25]
|
||||||
|
Nummer=25
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[15, 16, 24, 26, 33, 34]
|
||||||
|
Koordinaten=(4,2)
|
||||||
|
|
||||||
|
[26]
|
||||||
|
Nummer=26
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[16, 17, 25, 27, 34, 35]
|
||||||
|
Koordinaten=(5,2)
|
||||||
|
|
||||||
|
[27]
|
||||||
|
Nummer=27
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[17, 18, 26, 28, 35, 36]
|
||||||
|
Koordinaten=(6,2)
|
||||||
|
|
||||||
|
[28]
|
||||||
|
Nummer=28
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[18, 19, 27, 29, 36, 37]
|
||||||
|
Koordinaten=(7,2)
|
||||||
|
|
||||||
|
[29]
|
||||||
|
Nummer=29
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[19, 20, 28, 30, 37, 38]
|
||||||
|
Koordinaten=(8,2)
|
||||||
|
|
||||||
|
[30]
|
||||||
|
Nummer=30
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[20, 21, 29, 38]
|
||||||
|
Koordinaten=(9,2)
|
||||||
|
|
||||||
|
[31]
|
||||||
|
Nummer=31
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[22, 23, 32, 39]
|
||||||
|
Koordinaten=(1.5,3)
|
||||||
|
|
||||||
|
[32]
|
||||||
|
Nummer=32
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[23, 24, 31, 33, 39, 40]
|
||||||
|
Koordinaten=(2.5,3)
|
||||||
|
|
||||||
|
[33]
|
||||||
|
Nummer=33
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[24, 25, 32, 34, 40, 41]
|
||||||
|
Koordinaten=(3.5,3)
|
||||||
|
|
||||||
|
[34]
|
||||||
|
Nummer=34
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[25, 26, 33, 35, 41, 42]
|
||||||
|
Koordinaten=(4.5,3)
|
||||||
|
|
||||||
|
[35]
|
||||||
|
Nummer=35
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[26, 27, 34, 36, 42, 43]
|
||||||
|
Koordinaten=(5.5,3)
|
||||||
|
|
||||||
|
[36]
|
||||||
|
Nummer=36
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[27, 28, 35, 37, 43, 44]
|
||||||
|
Koordinaten=(6.5,3)
|
||||||
|
|
||||||
|
[37]
|
||||||
|
Nummer=37
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[28, 29, 36, 38, 44, 45]
|
||||||
|
Koordinaten=(7.5,3)
|
||||||
|
|
||||||
|
[38]
|
||||||
|
Nummer=38
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[29, 30, 37, 45]
|
||||||
|
Koordinaten=(8.5,3)
|
||||||
|
|
||||||
|
[39]
|
||||||
|
Nummer=39
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[31, 32, 40]
|
||||||
|
Koordinaten=(2,4)
|
||||||
|
|
||||||
|
[40]
|
||||||
|
Nummer=40
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[32, 33, 39, 41]
|
||||||
|
Koordinaten=(3,4)
|
||||||
|
|
||||||
|
[41]
|
||||||
|
Nummer=41
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[33, 34, 40, 42]
|
||||||
|
Koordinaten=(4,4)
|
||||||
|
|
||||||
|
[42]
|
||||||
|
Nummer=42
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[34, 35, 41, 43]
|
||||||
|
Koordinaten=(5,4)
|
||||||
|
|
||||||
|
[43]
|
||||||
|
Nummer=43
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[35, 36, 42, 44]
|
||||||
|
Koordinaten=(6,4)
|
||||||
|
|
||||||
|
[44]
|
||||||
|
Nummer=44
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[36, 37, 43, 45]
|
||||||
|
Koordinaten=(7,4)
|
||||||
|
|
||||||
|
[45]
|
||||||
|
Nummer=45
|
||||||
|
Hof=1
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[37, 38, 44]
|
||||||
|
Koordinaten=(8,4)
|
||||||
|
|
||||||
|
[46]
|
||||||
|
Nummer=46
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[47, 57]
|
||||||
|
Koordinaten=(16,0)
|
||||||
|
|
||||||
|
[47]
|
||||||
|
Nummer=47
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[46, 48, 57, 58]
|
||||||
|
Koordinaten=(17,0)
|
||||||
|
|
||||||
|
[48]
|
||||||
|
Nummer=48
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[47, 49, 58, 59]
|
||||||
|
Koordinaten=(18,0)
|
||||||
|
|
||||||
|
[49]
|
||||||
|
Nummer=49
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[48, 50, 59, 60]
|
||||||
|
Koordinaten=(19,0)
|
||||||
|
|
||||||
|
[50]
|
||||||
|
Nummer=50
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[49, 51, 60, 61]
|
||||||
|
Koordinaten=(20,0)
|
||||||
|
|
||||||
|
[51]
|
||||||
|
Nummer=51
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[50, 52, 61, 62]
|
||||||
|
Koordinaten=(21,0)
|
||||||
|
|
||||||
|
[52]
|
||||||
|
Nummer=52
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[51, 53, 62, 63]
|
||||||
|
Koordinaten=(22,0)
|
||||||
|
|
||||||
|
[53]
|
||||||
|
Nummer=53
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[52, 54, 63, 64]
|
||||||
|
Koordinaten=(23,0)
|
||||||
|
|
||||||
|
[54]
|
||||||
|
Nummer=54
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[53, 55, 64, 65]
|
||||||
|
Koordinaten=(24,0)
|
||||||
|
|
||||||
|
[55]
|
||||||
|
Nummer=55
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[54, 56, 65, 66]
|
||||||
|
Koordinaten=(25,0)
|
||||||
|
|
||||||
|
[56]
|
||||||
|
Nummer=56
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[55, 66]
|
||||||
|
Koordinaten=(26,0)
|
||||||
|
|
||||||
|
[57]
|
||||||
|
Nummer=57
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[46, 47, 58, 67]
|
||||||
|
Koordinaten=(16.5,1)
|
||||||
|
|
||||||
|
[58]
|
||||||
|
Nummer=58
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[47, 48, 57, 59, 67, 68]
|
||||||
|
Koordinaten=(17.5,1)
|
||||||
|
|
||||||
|
[59]
|
||||||
|
Nummer=59
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[48, 49, 58, 60, 68, 69]
|
||||||
|
Koordinaten=(18.5,1)
|
||||||
|
|
||||||
|
[60]
|
||||||
|
Nummer=60
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[49, 50, 59, 61, 69, 70]
|
||||||
|
Koordinaten=(19.5,1)
|
||||||
|
|
||||||
|
[61]
|
||||||
|
Nummer=61
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[50, 51, 60, 62, 70, 71]
|
||||||
|
Koordinaten=(20.5,1)
|
||||||
|
|
||||||
|
[62]
|
||||||
|
Nummer=62
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[51, 52, 61, 63, 71, 72]
|
||||||
|
Koordinaten=(21.5,1)
|
||||||
|
|
||||||
|
[63]
|
||||||
|
Nummer=63
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[52, 53, 62, 64, 72, 73]
|
||||||
|
Koordinaten=(22.5,1)
|
||||||
|
|
||||||
|
[64]
|
||||||
|
Nummer=64
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[53, 54, 63, 65, 73, 74]
|
||||||
|
Koordinaten=(23.5,1)
|
||||||
|
|
||||||
|
[65]
|
||||||
|
Nummer=65
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[54, 55, 64, 66, 74, 75]
|
||||||
|
Koordinaten=(24.5,1)
|
||||||
|
|
||||||
|
[66]
|
||||||
|
Nummer=66
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[55, 56, 65, 75]
|
||||||
|
Koordinaten=(25.5,1)
|
||||||
|
|
||||||
|
[67]
|
||||||
|
Nummer=67
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[57, 58, 68, 76]
|
||||||
|
Koordinaten=(17,2)
|
||||||
|
|
||||||
|
[68]
|
||||||
|
Nummer=68
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[58, 59, 67, 69, 76, 77]
|
||||||
|
Koordinaten=(18,2)
|
||||||
|
|
||||||
|
[69]
|
||||||
|
Nummer=69
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[59, 60, 68, 70, 77, 78]
|
||||||
|
Koordinaten=(19,2)
|
||||||
|
|
||||||
|
[70]
|
||||||
|
Nummer=70
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[60, 61, 69, 71, 78, 79]
|
||||||
|
Koordinaten=(20,2)
|
||||||
|
|
||||||
|
[71]
|
||||||
|
Nummer=71
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[61, 62, 70, 72, 79, 80]
|
||||||
|
Koordinaten=(21,2)
|
||||||
|
|
||||||
|
[72]
|
||||||
|
Nummer=72
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[62, 63, 71, 73, 80, 81]
|
||||||
|
Koordinaten=(22,2)
|
||||||
|
|
||||||
|
[73]
|
||||||
|
Nummer=73
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[63, 64, 72, 74, 81, 82]
|
||||||
|
Koordinaten=(23,2)
|
||||||
|
|
||||||
|
[74]
|
||||||
|
Nummer=74
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[64, 65, 73, 75, 82, 83]
|
||||||
|
Koordinaten=(24,2)
|
||||||
|
|
||||||
|
[75]
|
||||||
|
Nummer=75
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[65, 66, 74, 83]
|
||||||
|
Koordinaten=(25,2)
|
||||||
|
|
||||||
|
[76]
|
||||||
|
Nummer=76
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[67, 68, 77]
|
||||||
|
Koordinaten=(17.5,3)
|
||||||
|
|
||||||
|
[77]
|
||||||
|
Nummer=77
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[68, 69, 76, 78, 84]
|
||||||
|
Koordinaten=(18.5,3)
|
||||||
|
|
||||||
|
[78]
|
||||||
|
Nummer=78
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[69, 70, 77, 79, 84, 85]
|
||||||
|
Koordinaten=(19.5,3)
|
||||||
|
|
||||||
|
[79]
|
||||||
|
Nummer=79
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[70, 71, 78, 80, 85, 86]
|
||||||
|
Koordinaten=(20.5,3)
|
||||||
|
|
||||||
|
[80]
|
||||||
|
Nummer=80
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[71, 72, 79, 81, 86, 87]
|
||||||
|
Koordinaten=(21.5,3)
|
||||||
|
|
||||||
|
[81]
|
||||||
|
Nummer=81
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[72, 73, 80, 82, 87, 88]
|
||||||
|
Koordinaten=(22.5,3)
|
||||||
|
|
||||||
|
[82]
|
||||||
|
Nummer=82
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[73, 74, 81, 83, 88]
|
||||||
|
Koordinaten=(23.5,3)
|
||||||
|
|
||||||
|
[83]
|
||||||
|
Nummer=83
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[74, 75, 82]
|
||||||
|
Koordinaten=(24.5,3)
|
||||||
|
|
||||||
|
[84]
|
||||||
|
Nummer=84
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[77, 78, 85]
|
||||||
|
Koordinaten=(19,4)
|
||||||
|
|
||||||
|
[85]
|
||||||
|
Nummer=85
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[78, 79, 84, 86]
|
||||||
|
Koordinaten=(20,4)
|
||||||
|
|
||||||
|
[86]
|
||||||
|
Nummer=86
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[79, 80, 85, 87]
|
||||||
|
Koordinaten=(21,4)
|
||||||
|
|
||||||
|
[87]
|
||||||
|
Nummer=87
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[80, 81, 86, 88]
|
||||||
|
Koordinaten=(22,4)
|
||||||
|
|
||||||
|
[88]
|
||||||
|
Nummer=88
|
||||||
|
Hof=2
|
||||||
|
Plaetze=4
|
||||||
|
Nachbarliste=[81, 82, 87]
|
||||||
|
Koordinaten=(23,4)
|
||||||
@@ -0,0 +1,458 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="2200" height="430" viewBox="0 0 2200 430" font-family="sans-serif">
|
||||||
|
<rect width="100%" height="100%" fill="white"/>
|
||||||
|
<text x="1100" y="30" text-anchor="middle" font-size="16" fill="#333">Abstammung der Loesungen (Mutationsbaum)</text>
|
||||||
|
<line x1="60.0" y1="60.0" x2="60.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="113.3" y1="60.0" x2="86.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="166.7" y1="60.0" x2="112.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="220.0" y1="60.0" x2="139.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="273.3" y1="60.0" x2="165.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="326.7" y1="60.0" x2="191.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="380.0" y1="60.0" x2="218.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="433.3" y1="60.0" x2="244.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="486.7" y1="60.0" x2="270.6" y2="150.0" stroke="#c04040" stroke-width="2.5"/>
|
||||||
|
<line x1="540.0" y1="60.0" x2="297.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="593.3" y1="60.0" x2="323.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="646.7" y1="60.0" x2="349.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="700.0" y1="60.0" x2="375.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="753.3" y1="60.0" x2="402.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="806.7" y1="60.0" x2="428.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="860.0" y1="60.0" x2="454.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="913.3" y1="60.0" x2="481.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="966.7" y1="60.0" x2="507.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1020.0" y1="60.0" x2="533.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1073.3" y1="60.0" x2="560.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1126.7" y1="60.0" x2="586.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1180.0" y1="60.0" x2="612.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1233.3" y1="60.0" x2="639.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1286.7" y1="60.0" x2="665.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1340.0" y1="60.0" x2="691.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1393.3" y1="60.0" x2="718.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1446.7" y1="60.0" x2="744.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1500.0" y1="60.0" x2="770.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1553.3" y1="60.0" x2="797.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1606.7" y1="60.0" x2="823.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1660.0" y1="60.0" x2="849.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1713.3" y1="60.0" x2="876.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1766.7" y1="60.0" x2="902.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1820.0" y1="60.0" x2="928.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1873.3" y1="60.0" x2="955.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1926.7" y1="60.0" x2="981.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1980.0" y1="60.0" x2="1007.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2033.3" y1="60.0" x2="1034.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2086.7" y1="60.0" x2="1060.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2140.0" y1="60.0" x2="1086.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="60.0" y1="60.0" x2="1113.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="113.3" y1="60.0" x2="1139.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="166.7" y1="60.0" x2="1165.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="220.0" y1="60.0" x2="1192.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="273.3" y1="60.0" x2="1218.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="326.7" y1="60.0" x2="1244.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="380.0" y1="60.0" x2="1271.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="433.3" y1="60.0" x2="1297.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="486.7" y1="60.0" x2="1323.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="540.0" y1="60.0" x2="1350.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="593.3" y1="60.0" x2="1376.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="646.7" y1="60.0" x2="1402.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="700.0" y1="60.0" x2="1429.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="753.3" y1="60.0" x2="1455.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="806.7" y1="60.0" x2="1481.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="860.0" y1="60.0" x2="1508.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="913.3" y1="60.0" x2="1534.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="966.7" y1="60.0" x2="1560.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1020.0" y1="60.0" x2="1587.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1073.3" y1="60.0" x2="1613.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1126.7" y1="60.0" x2="1639.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1180.0" y1="60.0" x2="1666.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1233.3" y1="60.0" x2="1692.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1286.7" y1="60.0" x2="1718.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1340.0" y1="60.0" x2="1745.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1393.3" y1="60.0" x2="1771.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1446.7" y1="60.0" x2="1797.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1500.0" y1="60.0" x2="1824.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1553.3" y1="60.0" x2="1850.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1606.7" y1="60.0" x2="1876.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1660.0" y1="60.0" x2="1903.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1713.3" y1="60.0" x2="1929.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1766.7" y1="60.0" x2="1955.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1820.0" y1="60.0" x2="1982.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1873.3" y1="60.0" x2="2008.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1926.7" y1="60.0" x2="2034.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1980.0" y1="60.0" x2="2061.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2033.3" y1="60.0" x2="2087.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2086.7" y1="60.0" x2="2113.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2140.0" y1="60.0" x2="2140.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="112.7" y1="150.0" x2="60.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="139.0" y1="150.0" x2="91.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="191.6" y1="150.0" x2="122.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="244.3" y1="150.0" x2="153.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="270.6" y1="150.0" x2="184.2" y2="240.0" stroke="#c04040" stroke-width="2.5"/>
|
||||||
|
<line x1="323.3" y1="150.0" x2="215.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="428.6" y1="150.0" x2="246.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="507.6" y1="150.0" x2="277.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="744.6" y1="150.0" x2="308.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="770.9" y1="150.0" x2="339.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="849.9" y1="150.0" x2="370.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1007.8" y1="150.0" x2="401.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1086.8" y1="150.0" x2="432.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1192.2" y1="150.0" x2="463.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1244.8" y1="150.0" x2="494.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1323.8" y1="150.0" x2="525.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1376.5" y1="150.0" x2="556.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1481.8" y1="150.0" x2="587.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1508.1" y1="150.0" x2="618.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1560.8" y1="150.0" x2="649.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1639.7" y1="150.0" x2="680.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1771.4" y1="150.0" x2="711.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1850.4" y1="150.0" x2="743.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1982.0" y1="150.0" x2="774.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2087.3" y1="150.0" x2="805.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2140.0" y1="150.0" x2="836.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="220.0" y1="60.0" x2="867.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="273.3" y1="60.0" x2="898.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="326.7" y1="60.0" x2="929.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="486.7" y1="60.0" x2="960.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="593.3" y1="60.0" x2="991.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="806.7" y1="60.0" x2="1022.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="860.0" y1="60.0" x2="1053.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="966.7" y1="60.0" x2="1084.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="112.7" y1="150.0" x2="1115.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="139.0" y1="150.0" x2="1146.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="191.6" y1="150.0" x2="1177.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="244.3" y1="150.0" x2="1208.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="270.6" y1="150.0" x2="1239.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="323.3" y1="150.0" x2="1270.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="428.6" y1="150.0" x2="1301.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="507.6" y1="150.0" x2="1332.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="744.6" y1="150.0" x2="1363.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="770.9" y1="150.0" x2="1394.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="849.9" y1="150.0" x2="1426.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1007.8" y1="150.0" x2="1457.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1086.8" y1="150.0" x2="1488.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1192.2" y1="150.0" x2="1519.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1244.8" y1="150.0" x2="1550.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1323.8" y1="150.0" x2="1581.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1376.5" y1="150.0" x2="1612.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1481.8" y1="150.0" x2="1643.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1508.1" y1="150.0" x2="1674.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1560.8" y1="150.0" x2="1705.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1639.7" y1="150.0" x2="1736.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1771.4" y1="150.0" x2="1767.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1850.4" y1="150.0" x2="1798.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1982.0" y1="150.0" x2="1829.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2087.3" y1="150.0" x2="1860.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2140.0" y1="150.0" x2="1891.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="220.0" y1="60.0" x2="1922.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="273.3" y1="60.0" x2="1953.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="326.7" y1="60.0" x2="1984.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="486.7" y1="60.0" x2="2015.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="593.3" y1="60.0" x2="2046.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="806.7" y1="60.0" x2="2077.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="860.0" y1="60.0" x2="2109.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="966.7" y1="60.0" x2="2140.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="153.1" y1="240.0" x2="60.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="184.2" y1="240.0" x2="97.8" y2="330.0" stroke="#c04040" stroke-width="2.5"/>
|
||||||
|
<line x1="215.2" y1="240.0" x2="135.6" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="277.3" y1="240.0" x2="173.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="339.4" y1="240.0" x2="211.3" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="370.4" y1="240.0" x2="249.1" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="401.5" y1="240.0" x2="286.9" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="432.5" y1="240.0" x2="324.7" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="494.6" y1="240.0" x2="362.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="525.7" y1="240.0" x2="400.4" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="587.8" y1="240.0" x2="438.2" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="836.1" y1="240.0" x2="476.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="867.2" y1="240.0" x2="513.8" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="898.2" y1="240.0" x2="551.6" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1115.5" y1="240.0" x2="589.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1146.6" y1="240.0" x2="627.3" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1208.7" y1="240.0" x2="665.1" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1426.0" y1="240.0" x2="702.9" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1488.1" y1="240.0" x2="740.7" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1643.3" y1="240.0" x2="778.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1674.3" y1="240.0" x2="816.4" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1705.4" y1="240.0" x2="854.2" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1798.5" y1="240.0" x2="892.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1984.8" y1="240.0" x2="929.8" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2046.9" y1="240.0" x2="967.6" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2077.9" y1="240.0" x2="1005.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="112.7" y1="150.0" x2="1043.3" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="139.0" y1="150.0" x2="1081.1" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="153.1" y1="240.0" x2="1118.9" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="184.2" y1="240.0" x2="1156.7" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="215.2" y1="240.0" x2="1194.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="277.3" y1="240.0" x2="1232.4" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="339.4" y1="240.0" x2="1270.2" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="370.4" y1="240.0" x2="1308.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="401.5" y1="240.0" x2="1345.8" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="432.5" y1="240.0" x2="1383.6" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="494.6" y1="240.0" x2="1421.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="525.7" y1="240.0" x2="1459.3" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="587.8" y1="240.0" x2="1497.1" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="836.1" y1="240.0" x2="1534.9" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="867.2" y1="240.0" x2="1572.7" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="898.2" y1="240.0" x2="1610.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1115.5" y1="240.0" x2="1648.4" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1146.6" y1="240.0" x2="1686.2" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1208.7" y1="240.0" x2="1724.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1426.0" y1="240.0" x2="1761.8" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1488.1" y1="240.0" x2="1799.6" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1643.3" y1="240.0" x2="1837.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1674.3" y1="240.0" x2="1875.3" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1705.4" y1="240.0" x2="1913.1" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1798.5" y1="240.0" x2="1950.9" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1984.8" y1="240.0" x2="1988.7" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2046.9" y1="240.0" x2="2026.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2077.9" y1="240.0" x2="2064.4" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="112.7" y1="150.0" x2="2102.2" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="139.0" y1="150.0" x2="2140.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<circle cx="60.0" cy="60.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 1, Wert -133.7</title></circle>
|
||||||
|
<circle cx="113.3" cy="60.0" r="5" fill="#736141" stroke="#333" stroke-width="0.5"><title>Id 2, Wert -103.7</title></circle>
|
||||||
|
<circle cx="166.7" cy="60.0" r="5" fill="#527347" stroke="#333" stroke-width="0.5"><title>Id 3, Wert -67.0</title></circle>
|
||||||
|
<circle cx="220.0" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 4, Wert -19.7</title></circle>
|
||||||
|
<circle cx="273.3" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 5, Wert -19.7</title></circle>
|
||||||
|
<circle cx="326.7" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 6, Wert -19.7</title></circle>
|
||||||
|
<circle cx="380.0" cy="60.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 7, Wert -133.7</title></circle>
|
||||||
|
<circle cx="433.3" cy="60.0" r="5" fill="#527347" stroke="#333" stroke-width="0.5"><title>Id 8, Wert -67.0</title></circle>
|
||||||
|
<circle cx="486.7" cy="60.0" r="7" fill="#288c50" stroke="#c04040" stroke-width="2"><title>Id 9, Wert -19.7</title></circle>
|
||||||
|
<circle cx="540.0" cy="60.0" r="5" fill="#527347" stroke="#333" stroke-width="0.5"><title>Id 10, Wert -67.0</title></circle>
|
||||||
|
<circle cx="593.3" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 11, Wert -19.7</title></circle>
|
||||||
|
<circle cx="646.7" cy="60.0" r="5" fill="#944e3b" stroke="#333" stroke-width="0.5"><title>Id 12, Wert -140.3</title></circle>
|
||||||
|
<circle cx="700.0" cy="60.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 13, Wert -133.7</title></circle>
|
||||||
|
<circle cx="753.3" cy="60.0" r="5" fill="#527347" stroke="#333" stroke-width="0.5"><title>Id 14, Wert -67.0</title></circle>
|
||||||
|
<circle cx="806.7" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 15, Wert -19.7</title></circle>
|
||||||
|
<circle cx="860.0" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 16, Wert -19.7</title></circle>
|
||||||
|
<circle cx="913.3" cy="60.0" r="5" fill="#686743" stroke="#333" stroke-width="0.5"><title>Id 17, Wert -91.7</title></circle>
|
||||||
|
<circle cx="966.7" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 18, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1020.0" cy="60.0" r="5" fill="#736141" stroke="#333" stroke-width="0.5"><title>Id 19, Wert -103.7</title></circle>
|
||||||
|
<circle cx="1073.3" cy="60.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 20, Wert -133.7</title></circle>
|
||||||
|
<circle cx="1126.7" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 21, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1180.0" cy="60.0" r="5" fill="#c13533" stroke="#333" stroke-width="0.5"><title>Id 22, Wert -190.3</title></circle>
|
||||||
|
<circle cx="1233.3" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 23, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1286.7" cy="60.0" r="5" fill="#736141" stroke="#333" stroke-width="0.5"><title>Id 24, Wert -103.7</title></circle>
|
||||||
|
<circle cx="1340.0" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 25, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1393.3" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 26, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1446.7" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 27, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1500.0" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 28, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1553.3" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 29, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1606.7" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 30, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1660.0" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 31, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1713.3" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 32, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1766.7" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 33, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1820.0" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 34, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1873.3" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 35, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1926.7" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 36, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1980.0" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 37, Wert -19.7</title></circle>
|
||||||
|
<circle cx="2033.3" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 38, Wert -19.7</title></circle>
|
||||||
|
<circle cx="2086.7" cy="60.0" r="5" fill="#c13533" stroke="#333" stroke-width="0.5"><title>Id 39, Wert -190.3</title></circle>
|
||||||
|
<circle cx="2140.0" cy="60.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 40, Wert -60.3</title></circle>
|
||||||
|
<circle cx="60.0" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 41, Wert -133.7</title></circle>
|
||||||
|
<circle cx="86.3" cy="150.0" r="5" fill="#477a4a" stroke="#333" stroke-width="0.5"><title>Id 42, Wert -55.0</title></circle>
|
||||||
|
<circle cx="112.7" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 43, Wert -19.7</title></circle>
|
||||||
|
<circle cx="139.0" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 44, Wert -19.7</title></circle>
|
||||||
|
<circle cx="165.3" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 45, Wert -133.7</title></circle>
|
||||||
|
<circle cx="191.6" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 46, Wert -19.7</title></circle>
|
||||||
|
<circle cx="218.0" cy="150.0" r="5" fill="#626a44" stroke="#333" stroke-width="0.5"><title>Id 47, Wert -85.0</title></circle>
|
||||||
|
<circle cx="244.3" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 48, Wert -19.7</title></circle>
|
||||||
|
<circle cx="270.6" cy="150.0" r="7" fill="#288c50" stroke="#c04040" stroke-width="2"><title>Id 49, Wert -19.7</title></circle>
|
||||||
|
<circle cx="297.0" cy="150.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 50, Wert -60.3</title></circle>
|
||||||
|
<circle cx="323.3" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 51, Wert -19.7</title></circle>
|
||||||
|
<circle cx="349.6" cy="150.0" r="5" fill="#626a44" stroke="#333" stroke-width="0.5"><title>Id 52, Wert -85.0</title></circle>
|
||||||
|
<circle cx="375.9" cy="150.0" r="5" fill="#626a44" stroke="#333" stroke-width="0.5"><title>Id 53, Wert -85.0</title></circle>
|
||||||
|
<circle cx="402.3" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 54, Wert -133.7</title></circle>
|
||||||
|
<circle cx="428.6" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 55, Wert -19.7</title></circle>
|
||||||
|
<circle cx="454.9" cy="150.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 56, Wert -60.3</title></circle>
|
||||||
|
<circle cx="481.3" cy="150.0" r="5" fill="#686743" stroke="#333" stroke-width="0.5"><title>Id 57, Wert -91.7</title></circle>
|
||||||
|
<circle cx="507.6" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 58, Wert -19.7</title></circle>
|
||||||
|
<circle cx="533.9" cy="150.0" r="5" fill="#477a4a" stroke="#333" stroke-width="0.5"><title>Id 59, Wert -55.0</title></circle>
|
||||||
|
<circle cx="560.3" cy="150.0" r="5" fill="#477a4a" stroke="#333" stroke-width="0.5"><title>Id 60, Wert -55.0</title></circle>
|
||||||
|
<circle cx="586.6" cy="150.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 61, Wert -60.3</title></circle>
|
||||||
|
<circle cx="612.9" cy="150.0" r="5" fill="#626a44" stroke="#333" stroke-width="0.5"><title>Id 62, Wert -85.0</title></circle>
|
||||||
|
<circle cx="639.2" cy="150.0" r="5" fill="#944e3b" stroke="#333" stroke-width="0.5"><title>Id 63, Wert -140.3</title></circle>
|
||||||
|
<circle cx="665.6" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 64, Wert -133.7</title></circle>
|
||||||
|
<circle cx="691.9" cy="150.0" r="5" fill="#736141" stroke="#333" stroke-width="0.5"><title>Id 65, Wert -103.7</title></circle>
|
||||||
|
<circle cx="718.2" cy="150.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 66, Wert -60.3</title></circle>
|
||||||
|
<circle cx="744.6" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 67, Wert -19.7</title></circle>
|
||||||
|
<circle cx="770.9" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 68, Wert -19.7</title></circle>
|
||||||
|
<circle cx="797.2" cy="150.0" r="5" fill="#b53c35" stroke="#333" stroke-width="0.5"><title>Id 69, Wert -176.3</title></circle>
|
||||||
|
<circle cx="823.5" cy="150.0" r="5" fill="#b53c35" stroke="#333" stroke-width="0.5"><title>Id 70, Wert -176.3</title></circle>
|
||||||
|
<circle cx="849.9" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 71, Wert -19.7</title></circle>
|
||||||
|
<circle cx="876.2" cy="150.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 72, Wert -60.3</title></circle>
|
||||||
|
<circle cx="902.5" cy="150.0" r="5" fill="#736141" stroke="#333" stroke-width="0.5"><title>Id 73, Wert -103.7</title></circle>
|
||||||
|
<circle cx="928.9" cy="150.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 74, Wert -60.3</title></circle>
|
||||||
|
<circle cx="955.2" cy="150.0" r="5" fill="#c13533" stroke="#333" stroke-width="0.5"><title>Id 75, Wert -190.3</title></circle>
|
||||||
|
<circle cx="981.5" cy="150.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 76, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1007.8" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 77, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1034.2" cy="150.0" r="5" fill="#9a4b3a" stroke="#333" stroke-width="0.5"><title>Id 78, Wert -147.0</title></circle>
|
||||||
|
<circle cx="1060.5" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 79, Wert -133.7</title></circle>
|
||||||
|
<circle cx="1086.8" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 80, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1113.2" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 81, Wert -133.7</title></circle>
|
||||||
|
<circle cx="1139.5" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 82, Wert -133.7</title></circle>
|
||||||
|
<circle cx="1165.8" cy="150.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 83, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1192.2" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 84, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1218.5" cy="150.0" r="5" fill="#736141" stroke="#333" stroke-width="0.5"><title>Id 85, Wert -103.7</title></circle>
|
||||||
|
<circle cx="1244.8" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 86, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1271.1" cy="150.0" r="5" fill="#626a44" stroke="#333" stroke-width="0.5"><title>Id 87, Wert -85.0</title></circle>
|
||||||
|
<circle cx="1297.5" cy="150.0" r="5" fill="#c13533" stroke="#333" stroke-width="0.5"><title>Id 88, Wert -190.3</title></circle>
|
||||||
|
<circle cx="1323.8" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 89, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1350.1" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 90, Wert -133.7</title></circle>
|
||||||
|
<circle cx="1376.5" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 91, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1402.8" cy="150.0" r="5" fill="#626a44" stroke="#333" stroke-width="0.5"><title>Id 92, Wert -85.0</title></circle>
|
||||||
|
<circle cx="1429.1" cy="150.0" r="5" fill="#626a44" stroke="#333" stroke-width="0.5"><title>Id 93, Wert -85.0</title></circle>
|
||||||
|
<circle cx="1455.4" cy="150.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 94, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1481.8" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 95, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1508.1" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 96, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1534.4" cy="150.0" r="5" fill="#686743" stroke="#333" stroke-width="0.5"><title>Id 97, Wert -91.7</title></circle>
|
||||||
|
<circle cx="1560.8" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 98, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1587.1" cy="150.0" r="5" fill="#477a4a" stroke="#333" stroke-width="0.5"><title>Id 99, Wert -55.0</title></circle>
|
||||||
|
<circle cx="1613.4" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 100, Wert -133.7</title></circle>
|
||||||
|
<circle cx="1639.7" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 101, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1666.1" cy="150.0" r="5" fill="#626a44" stroke="#333" stroke-width="0.5"><title>Id 102, Wert -85.0</title></circle>
|
||||||
|
<circle cx="1692.4" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 103, Wert -133.7</title></circle>
|
||||||
|
<circle cx="1718.7" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 104, Wert -133.7</title></circle>
|
||||||
|
<circle cx="1745.1" cy="150.0" r="5" fill="#736141" stroke="#333" stroke-width="0.5"><title>Id 105, Wert -103.7</title></circle>
|
||||||
|
<circle cx="1771.4" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 106, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1797.7" cy="150.0" r="5" fill="#bb3934" stroke="#333" stroke-width="0.5"><title>Id 107, Wert -183.0</title></circle>
|
||||||
|
<circle cx="1824.1" cy="150.0" r="5" fill="#795d40" stroke="#333" stroke-width="0.5"><title>Id 108, Wert -110.3</title></circle>
|
||||||
|
<circle cx="1850.4" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 109, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1876.7" cy="150.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 110, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1903.0" cy="150.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 111, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1929.4" cy="150.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 112, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1955.7" cy="150.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 113, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1982.0" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 114, Wert -19.7</title></circle>
|
||||||
|
<circle cx="2008.4" cy="150.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 115, Wert -60.3</title></circle>
|
||||||
|
<circle cx="2034.7" cy="150.0" r="5" fill="#7e5b3f" stroke="#333" stroke-width="0.5"><title>Id 116, Wert -115.0</title></circle>
|
||||||
|
<circle cx="2061.0" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 117, Wert -133.7</title></circle>
|
||||||
|
<circle cx="2087.3" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 118, Wert -19.7</title></circle>
|
||||||
|
<circle cx="2113.7" cy="150.0" r="5" fill="#626a44" stroke="#333" stroke-width="0.5"><title>Id 119, Wert -85.0</title></circle>
|
||||||
|
<circle cx="2140.0" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 120, Wert -19.7</title></circle>
|
||||||
|
<circle cx="60.0" cy="240.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 121, Wert -133.7</title></circle>
|
||||||
|
<circle cx="91.0" cy="240.0" r="5" fill="#7f5a3f" stroke="#333" stroke-width="0.5"><title>Id 122, Wert -117.0</title></circle>
|
||||||
|
<circle cx="122.1" cy="240.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 123, Wert -60.3</title></circle>
|
||||||
|
<circle cx="153.1" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 124, Wert -19.7</title></circle>
|
||||||
|
<circle cx="184.2" cy="240.0" r="7" fill="#288c50" stroke="#c04040" stroke-width="2"><title>Id 125, Wert -19.7</title></circle>
|
||||||
|
<circle cx="215.2" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 126, Wert -19.7</title></circle>
|
||||||
|
<circle cx="246.3" cy="240.0" r="5" fill="#736141" stroke="#333" stroke-width="0.5"><title>Id 127, Wert -103.7</title></circle>
|
||||||
|
<circle cx="277.3" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 128, Wert -19.7</title></circle>
|
||||||
|
<circle cx="308.4" cy="240.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 129, Wert -60.3</title></circle>
|
||||||
|
<circle cx="339.4" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 130, Wert -19.7</title></circle>
|
||||||
|
<circle cx="370.4" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 131, Wert -19.7</title></circle>
|
||||||
|
<circle cx="401.5" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 132, Wert -19.7</title></circle>
|
||||||
|
<circle cx="432.5" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 133, Wert -19.7</title></circle>
|
||||||
|
<circle cx="463.6" cy="240.0" r="5" fill="#9a4b3a" stroke="#333" stroke-width="0.5"><title>Id 134, Wert -147.0</title></circle>
|
||||||
|
<circle cx="494.6" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 135, Wert -19.7</title></circle>
|
||||||
|
<circle cx="525.7" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 136, Wert -19.7</title></circle>
|
||||||
|
<circle cx="556.7" cy="240.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 137, Wert -60.3</title></circle>
|
||||||
|
<circle cx="587.8" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 138, Wert -19.7</title></circle>
|
||||||
|
<circle cx="618.8" cy="240.0" r="5" fill="#795d40" stroke="#333" stroke-width="0.5"><title>Id 139, Wert -110.3</title></circle>
|
||||||
|
<circle cx="649.9" cy="240.0" r="5" fill="#bf3633" stroke="#333" stroke-width="0.5"><title>Id 140, Wert -187.7</title></circle>
|
||||||
|
<circle cx="680.9" cy="240.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 141, Wert -60.3</title></circle>
|
||||||
|
<circle cx="711.9" cy="240.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 142, Wert -60.3</title></circle>
|
||||||
|
<circle cx="743.0" cy="240.0" r="5" fill="#795d40" stroke="#333" stroke-width="0.5"><title>Id 143, Wert -110.3</title></circle>
|
||||||
|
<circle cx="774.0" cy="240.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 144, Wert -60.3</title></circle>
|
||||||
|
<circle cx="805.1" cy="240.0" r="5" fill="#944e3b" stroke="#333" stroke-width="0.5"><title>Id 145, Wert -140.3</title></circle>
|
||||||
|
<circle cx="836.1" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 146, Wert -19.7</title></circle>
|
||||||
|
<circle cx="867.2" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 147, Wert -19.7</title></circle>
|
||||||
|
<circle cx="898.2" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 148, Wert -19.7</title></circle>
|
||||||
|
<circle cx="929.3" cy="240.0" r="5" fill="#7f5a3f" stroke="#333" stroke-width="0.5"><title>Id 149, Wert -117.0</title></circle>
|
||||||
|
<circle cx="960.3" cy="240.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 150, Wert -60.3</title></circle>
|
||||||
|
<circle cx="991.3" cy="240.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 151, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1022.4" cy="240.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 152, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1053.4" cy="240.0" r="5" fill="#a94237" stroke="#333" stroke-width="0.5"><title>Id 153, Wert -163.7</title></circle>
|
||||||
|
<circle cx="1084.5" cy="240.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 154, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1115.5" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 155, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1146.6" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 156, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1177.6" cy="240.0" r="5" fill="#bb3934" stroke="#333" stroke-width="0.5"><title>Id 157, Wert -183.0</title></circle>
|
||||||
|
<circle cx="1208.7" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 158, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1239.7" cy="240.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 159, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1270.7" cy="240.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 160, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1301.8" cy="240.0" r="5" fill="#a44538" stroke="#333" stroke-width="0.5"><title>Id 161, Wert -157.7</title></circle>
|
||||||
|
<circle cx="1332.8" cy="240.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 162, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1363.9" cy="240.0" r="5" fill="#9a4b3a" stroke="#333" stroke-width="0.5"><title>Id 163, Wert -147.0</title></circle>
|
||||||
|
<circle cx="1394.9" cy="240.0" r="5" fill="#736141" stroke="#333" stroke-width="0.5"><title>Id 164, Wert -103.7</title></circle>
|
||||||
|
<circle cx="1426.0" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 165, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1457.0" cy="240.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 166, Wert -133.7</title></circle>
|
||||||
|
<circle cx="1488.1" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 167, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1519.1" cy="240.0" r="5" fill="#bb3934" stroke="#333" stroke-width="0.5"><title>Id 168, Wert -183.0</title></circle>
|
||||||
|
<circle cx="1550.1" cy="240.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 169, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1581.2" cy="240.0" r="5" fill="#bf3633" stroke="#333" stroke-width="0.5"><title>Id 170, Wert -187.7</title></circle>
|
||||||
|
<circle cx="1612.2" cy="240.0" r="5" fill="#c13533" stroke="#333" stroke-width="0.5"><title>Id 171, Wert -190.3</title></circle>
|
||||||
|
<circle cx="1643.3" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 172, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1674.3" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 173, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1705.4" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 174, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1736.4" cy="240.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 175, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1767.5" cy="240.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 176, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1798.5" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 177, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1829.6" cy="240.0" r="5" fill="#b53c35" stroke="#333" stroke-width="0.5"><title>Id 178, Wert -176.3</title></circle>
|
||||||
|
<circle cx="1860.6" cy="240.0" r="5" fill="#c83232" stroke="#333" stroke-width="0.5"><title>Id 179, Wert -197.0</title></circle>
|
||||||
|
<circle cx="1891.6" cy="240.0" r="5" fill="#736141" stroke="#333" stroke-width="0.5"><title>Id 180, Wert -103.7</title></circle>
|
||||||
|
<circle cx="1922.7" cy="240.0" r="5" fill="#9a4b3a" stroke="#333" stroke-width="0.5"><title>Id 181, Wert -147.0</title></circle>
|
||||||
|
<circle cx="1953.7" cy="240.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 182, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1984.8" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 183, Wert -19.7</title></circle>
|
||||||
|
<circle cx="2015.8" cy="240.0" r="5" fill="#736141" stroke="#333" stroke-width="0.5"><title>Id 184, Wert -103.7</title></circle>
|
||||||
|
<circle cx="2046.9" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 185, Wert -19.7</title></circle>
|
||||||
|
<circle cx="2077.9" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 186, Wert -19.7</title></circle>
|
||||||
|
<circle cx="2109.0" cy="240.0" r="5" fill="#795d40" stroke="#333" stroke-width="0.5"><title>Id 187, Wert -110.3</title></circle>
|
||||||
|
<circle cx="2140.0" cy="240.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 188, Wert -60.3</title></circle>
|
||||||
|
<circle cx="60.0" cy="330.0" r="5" fill="#944e3b" stroke="#333" stroke-width="0.5"><title>Id 189, Wert -140.3</title></circle>
|
||||||
|
<circle cx="97.8" cy="330.0" r="7" fill="#288c50" stroke="#c04040" stroke-width="2"><title>Id 190, Wert -19.7</title></circle>
|
||||||
|
<circle cx="135.6" cy="330.0" r="5" fill="#736141" stroke="#333" stroke-width="0.5"><title>Id 191, Wert -103.7</title></circle>
|
||||||
|
<circle cx="173.5" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 192, Wert -19.7</title></circle>
|
||||||
|
<circle cx="211.3" cy="330.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 193, Wert -133.7</title></circle>
|
||||||
|
<circle cx="249.1" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 194, Wert -19.7</title></circle>
|
||||||
|
<circle cx="286.9" cy="330.0" r="5" fill="#736141" stroke="#333" stroke-width="0.5"><title>Id 195, Wert -103.7</title></circle>
|
||||||
|
<circle cx="324.7" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 196, Wert -19.7</title></circle>
|
||||||
|
<circle cx="362.5" cy="330.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 197, Wert -60.3</title></circle>
|
||||||
|
<circle cx="400.4" cy="330.0" r="5" fill="#736141" stroke="#333" stroke-width="0.5"><title>Id 198, Wert -103.7</title></circle>
|
||||||
|
<circle cx="438.2" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 199, Wert -19.7</title></circle>
|
||||||
|
<circle cx="476.0" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 200, Wert -19.7</title></circle>
|
||||||
|
<circle cx="513.8" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 201, Wert -19.7</title></circle>
|
||||||
|
<circle cx="551.6" cy="330.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 202, Wert -60.3</title></circle>
|
||||||
|
<circle cx="589.5" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 203, Wert -19.7</title></circle>
|
||||||
|
<circle cx="627.3" cy="330.0" r="5" fill="#9a4b3a" stroke="#333" stroke-width="0.5"><title>Id 204, Wert -147.0</title></circle>
|
||||||
|
<circle cx="665.1" cy="330.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 205, Wert -60.3</title></circle>
|
||||||
|
<circle cx="702.9" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 206, Wert -19.7</title></circle>
|
||||||
|
<circle cx="740.7" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 207, Wert -19.7</title></circle>
|
||||||
|
<circle cx="778.5" cy="330.0" r="5" fill="#944e3b" stroke="#333" stroke-width="0.5"><title>Id 208, Wert -140.3</title></circle>
|
||||||
|
<circle cx="816.4" cy="330.0" r="5" fill="#795d40" stroke="#333" stroke-width="0.5"><title>Id 209, Wert -110.3</title></circle>
|
||||||
|
<circle cx="854.2" cy="330.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 210, Wert -60.3</title></circle>
|
||||||
|
<circle cx="892.0" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 211, Wert -19.7</title></circle>
|
||||||
|
<circle cx="929.8" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 212, Wert -19.7</title></circle>
|
||||||
|
<circle cx="967.6" cy="330.0" r="5" fill="#944e3b" stroke="#333" stroke-width="0.5"><title>Id 213, Wert -140.3</title></circle>
|
||||||
|
<circle cx="1005.5" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 214, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1043.3" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 215, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1081.1" cy="330.0" r="5" fill="#7f5a3f" stroke="#333" stroke-width="0.5"><title>Id 216, Wert -117.0</title></circle>
|
||||||
|
<circle cx="1118.9" cy="330.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 217, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1156.7" cy="330.0" r="5" fill="#c13533" stroke="#333" stroke-width="0.5"><title>Id 218, Wert -190.3</title></circle>
|
||||||
|
<circle cx="1194.5" cy="330.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 219, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1232.4" cy="330.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 220, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1270.2" cy="330.0" r="5" fill="#c13533" stroke="#333" stroke-width="0.5"><title>Id 221, Wert -190.3</title></circle>
|
||||||
|
<circle cx="1308.0" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 222, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1345.8" cy="330.0" r="5" fill="#c13533" stroke="#333" stroke-width="0.5"><title>Id 223, Wert -190.3</title></circle>
|
||||||
|
<circle cx="1383.6" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 224, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1421.5" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 225, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1459.3" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 226, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1497.1" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 227, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1534.9" cy="330.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 228, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1572.7" cy="330.0" r="5" fill="#bb3934" stroke="#333" stroke-width="0.5"><title>Id 229, Wert -183.0</title></circle>
|
||||||
|
<circle cx="1610.5" cy="330.0" r="5" fill="#b53c35" stroke="#333" stroke-width="0.5"><title>Id 230, Wert -176.3</title></circle>
|
||||||
|
<circle cx="1648.4" cy="330.0" r="5" fill="#736141" stroke="#333" stroke-width="0.5"><title>Id 231, Wert -103.7</title></circle>
|
||||||
|
<circle cx="1686.2" cy="330.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 232, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1724.0" cy="330.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 233, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1761.8" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 234, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1799.6" cy="330.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 235, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1837.5" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 236, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1875.3" cy="330.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 237, Wert -60.3</title></circle>
|
||||||
|
<circle cx="1913.1" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 238, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1950.9" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 239, Wert -19.7</title></circle>
|
||||||
|
<circle cx="1988.7" cy="330.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 240, Wert -60.3</title></circle>
|
||||||
|
<circle cx="2026.5" cy="330.0" r="5" fill="#4c7749" stroke="#333" stroke-width="0.5"><title>Id 241, Wert -60.3</title></circle>
|
||||||
|
<circle cx="2064.4" cy="330.0" r="5" fill="#736141" stroke="#333" stroke-width="0.5"><title>Id 242, Wert -103.7</title></circle>
|
||||||
|
<circle cx="2102.2" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 243, Wert -19.7</title></circle>
|
||||||
|
<circle cx="2140.0" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 244, Wert -19.7</title></circle>
|
||||||
|
<text x="97.8" y="352.0" text-anchor="middle" font-size="12" font-weight="bold" fill="#c04040">190</text>
|
||||||
|
<text x="48" y="64.0" text-anchor="end" font-size="11" fill="#666">Gen 0</text>
|
||||||
|
<text x="48" y="154.0" text-anchor="end" font-size="11" fill="#666">Gen 1</text>
|
||||||
|
<text x="48" y="244.0" text-anchor="end" font-size="11" fill="#666">Gen 2</text>
|
||||||
|
<text x="48" y="334.0" text-anchor="end" font-size="11" fill="#666">Gen 3</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 48 KiB |
@@ -0,0 +1,50 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="650" viewBox="0 0 900 650" font-family="sans-serif">
|
||||||
|
<rect width="100%" height="100%" fill="white"/>
|
||||||
|
<text x="450" y="30" text-anchor="middle" font-size="16" fill="#333">Entwicklung der Loesungsfindung</text>
|
||||||
|
<line x1="60" y1="60" x2="60" y2="390.0" stroke="#333" stroke-width="1.5"/>
|
||||||
|
<line x1="60" y1="390.0" x2="840" y2="390.0" stroke="#333" stroke-width="1.5"/>
|
||||||
|
<line x1="60" y1="390.0" x2="840" y2="390.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="394.0" text-anchor="end" font-size="11" fill="#666">-197</text>
|
||||||
|
<line x1="60" y1="324.0" x2="840" y2="324.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="328.0" text-anchor="end" font-size="11" fill="#666">-162</text>
|
||||||
|
<line x1="60" y1="258.0" x2="840" y2="258.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="262.0" text-anchor="end" font-size="11" fill="#666">-126</text>
|
||||||
|
<line x1="60" y1="192.0" x2="840" y2="192.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="196.0" text-anchor="end" font-size="11" fill="#666">-91</text>
|
||||||
|
<line x1="60" y1="126.0" x2="840" y2="126.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="130.0" text-anchor="end" font-size="11" fill="#666">-55</text>
|
||||||
|
<line x1="60" y1="60.0" x2="840" y2="60.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="64.0" text-anchor="end" font-size="11" fill="#666">-20</text>
|
||||||
|
<text x="18" y="225.0" text-anchor="middle" font-size="12" fill="#333" transform="rotate(-90 18 225.0)">Wertigkeit (hoeher = besser)</text>
|
||||||
|
<polyline points="60.0,60.0 146.7,60.0 233.3,60.0 320.0,60.0 406.7,60.0 493.3,60.0 580.0,60.0 666.7,60.0 753.3,60.0 840.0,60.0" fill="none" stroke="#2f6f4f" stroke-width="2"/>
|
||||||
|
<polyline points="60.0,128.5 146.7,162.3 233.3,151.0 320.0,60.0 406.7,161.7 493.3,127.8 580.0,60.0 666.7,146.8 753.3,117.9 840.0,60.0" fill="none" stroke="#c08a2d" stroke-width="2"/>
|
||||||
|
<polyline points="60.0,377.6 146.7,377.6 233.3,377.6 320.0,60.0 406.7,390.0 493.3,390.0 580.0,60.0 666.7,377.6 753.3,377.6 840.0,60.0" fill="none" stroke="#a03030" stroke-width="2"/>
|
||||||
|
<line x1="680" y1="70" x2="704" y2="70" stroke="#2f6f4f" stroke-width="2"/>
|
||||||
|
<text x="710" y="74" font-size="11" fill="#333">beste Loesung</text>
|
||||||
|
<line x1="680" y1="88" x2="704" y2="88" stroke="#c08a2d" stroke-width="2"/>
|
||||||
|
<text x="710" y="92" font-size="11" fill="#333">Durchschnitt</text>
|
||||||
|
<line x1="680" y1="106" x2="704" y2="106" stroke="#a03030" stroke-width="2"/>
|
||||||
|
<text x="710" y="110" font-size="11" fill="#333">schlechteste Loesung</text>
|
||||||
|
<text x="450" y="428.0" text-anchor="middle" font-size="13" fill="#333">Anzahl erzeugter Verteilungen im Pool</text>
|
||||||
|
<line x1="60" y1="440.0" x2="60" y2="590.0" stroke="#333" stroke-width="1.5"/>
|
||||||
|
<line x1="60" y1="590.0" x2="840" y2="590.0" stroke="#333" stroke-width="1.5"/>
|
||||||
|
<line x1="60" y1="590.0" x2="840" y2="590.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="594.0" text-anchor="end" font-size="11" fill="#666">0</text>
|
||||||
|
<line x1="60" y1="515.0" x2="840" y2="515.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="519.0" text-anchor="end" font-size="11" fill="#666">60</text>
|
||||||
|
<line x1="60" y1="440.0" x2="840" y2="440.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="444.0" text-anchor="end" font-size="11" fill="#666">120</text>
|
||||||
|
<polyline points="60.0,540.0 146.7,490.0 233.3,440.0 320.0,547.5 406.7,505.0 493.3,462.5 580.0,555.0 666.7,520.0 753.3,485.0 840.0,561.2" fill="none" stroke="#4060a0" stroke-width="2"/>
|
||||||
|
<text x="60.0" y="606.0" text-anchor="middle" font-size="10" fill="#999">e</text>
|
||||||
|
<text x="146.7" y="606.0" text-anchor="middle" font-size="10" fill="#999">m</text>
|
||||||
|
<text x="233.3" y="606.0" text-anchor="middle" font-size="10" fill="#999">j</text>
|
||||||
|
<text x="320.0" y="606.0" text-anchor="middle" font-size="10" fill="#999">s</text>
|
||||||
|
<text x="406.7" y="606.0" text-anchor="middle" font-size="10" fill="#999">m</text>
|
||||||
|
<text x="493.3" y="606.0" text-anchor="middle" font-size="10" fill="#999">j</text>
|
||||||
|
<text x="580.0" y="606.0" text-anchor="middle" font-size="10" fill="#999">s</text>
|
||||||
|
<text x="666.7" y="606.0" text-anchor="middle" font-size="10" fill="#999">m</text>
|
||||||
|
<text x="753.3" y="606.0" text-anchor="middle" font-size="10" fill="#999">j</text>
|
||||||
|
<text x="840.0" y="606.0" text-anchor="middle" font-size="10" fill="#999">s</text>
|
||||||
|
<text x="450" y="638" text-anchor="middle" font-size="12" fill="#333">Zyklus-Aktion (Zeit)</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.3 KiB |
@@ -0,0 +1,36 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="405.657" height="108.914" viewBox="0 0 405.657 108.914">
|
||||||
|
<rect width="100%" height="100%" fill="white"/>
|
||||||
|
<polyline points="54.4572,54.4572 153.372,54.4572" fill="none" stroke="#3cb44b" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<circle cx="252.286" cy="54.4572" r="44.4572" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle cx="252.286" cy="32" r="12" fill="#e6194b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="274.743" cy="54.4572" r="12" fill="#e6194b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="252.286" cy="76.9144" r="12" fill="#e6194b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="229.829" cy="54.4572" r="12" fill="#e6194b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="252.286" cy="54.4572" r="12" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="252.286" y="54.4572" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">3</text>
|
||||||
|
<circle cx="54.4572" cy="54.4572" r="44.4572" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle cx="54.4572" cy="32" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="75.8152" cy="47.5175" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="67.6572" cy="72.6254" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="41.2572" cy="72.6254" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="33.0991" cy="47.5175" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="54.4572" cy="54.4572" r="12" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="54.4572" y="54.4572" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">1</text>
|
||||||
|
<circle cx="153.372" cy="54.4572" r="44.4572" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle cx="153.372" cy="32" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="174.73" cy="47.5175" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="166.572" cy="72.6254" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="140.172" cy="72.6254" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="132.013" cy="47.5175" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="153.372" cy="54.4572" r="12" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="153.372" y="54.4572" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">2</text>
|
||||||
|
<circle cx="351.2" cy="54.4572" r="44.4572" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle cx="351.2" cy="32" r="12" fill="#4363d8" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="372.558" cy="47.5175" r="12" fill="#4363d8" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="364.4" cy="72.6254" r="12" fill="#4363d8" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="338" cy="72.6254" r="12" fill="#4363d8" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="329.842" cy="47.5175" r="12" fill="#4363d8" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="351.2" cy="54.4572" r="12" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="351.2" y="54.4572" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">4</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.2 KiB |
@@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"gruppen": [
|
||||||
|
{
|
||||||
|
"anzahl": 10,
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "A",
|
||||||
|
"nachname": "AA",
|
||||||
|
"titel": "Dipl. Ing."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"anzahl": 4,
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "B",
|
||||||
|
"nachname": "BB",
|
||||||
|
"titel": "Prof."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"anzahl": 5,
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "C",
|
||||||
|
"nachname": "CC",
|
||||||
|
"titel": "Dr."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
<Bestellung>
|
|
||||||
|
|
||||||
<Gruppe>
|
|
||||||
<Person>
|
|
||||||
<Vorname>A</Vorname>
|
|
||||||
<Nachname>AA</Nachname>
|
|
||||||
<Titel>Dipl. Ing.</Titel>
|
|
||||||
</Person>
|
|
||||||
<Anzahl>10</Anzahl>
|
|
||||||
</Gruppe>
|
|
||||||
|
|
||||||
<Gruppe>
|
|
||||||
<Person>
|
|
||||||
<Vorname>B</Vorname>
|
|
||||||
<Nachname>BB</Nachname>
|
|
||||||
<Titel>Prof.</Titel>
|
|
||||||
</Person>
|
|
||||||
<Anzahl>4</Anzahl>
|
|
||||||
</Gruppe>
|
|
||||||
|
|
||||||
<Gruppe>
|
|
||||||
<Person>
|
|
||||||
<Vorname>C</Vorname>
|
|
||||||
<Nachname>CC</Nachname>
|
|
||||||
<Titel>Dr.</Titel>
|
|
||||||
</Person>
|
|
||||||
<Anzahl>5</Anzahl>
|
|
||||||
</Gruppe>
|
|
||||||
|
|
||||||
</Bestellung>
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,458 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="2200" height="430" viewBox="0 0 2200 430" font-family="sans-serif">
|
||||||
|
<rect width="100%" height="100%" fill="white"/>
|
||||||
|
<text x="1100" y="30" text-anchor="middle" font-size="16" fill="#333">Abstammung der Loesungen (Mutationsbaum)</text>
|
||||||
|
<line x1="60.0" y1="60.0" x2="60.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="113.3" y1="60.0" x2="86.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="166.7" y1="60.0" x2="112.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="220.0" y1="60.0" x2="139.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="273.3" y1="60.0" x2="165.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="326.7" y1="60.0" x2="191.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="380.0" y1="60.0" x2="218.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="433.3" y1="60.0" x2="244.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="486.7" y1="60.0" x2="270.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="540.0" y1="60.0" x2="297.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="593.3" y1="60.0" x2="323.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="646.7" y1="60.0" x2="349.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="700.0" y1="60.0" x2="375.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="753.3" y1="60.0" x2="402.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="806.7" y1="60.0" x2="428.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="860.0" y1="60.0" x2="454.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="913.3" y1="60.0" x2="481.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="966.7" y1="60.0" x2="507.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1020.0" y1="60.0" x2="533.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1073.3" y1="60.0" x2="560.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1126.7" y1="60.0" x2="586.6" y2="150.0" stroke="#c04040" stroke-width="2.5"/>
|
||||||
|
<line x1="1180.0" y1="60.0" x2="612.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1233.3" y1="60.0" x2="639.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1286.7" y1="60.0" x2="665.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1340.0" y1="60.0" x2="691.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1393.3" y1="60.0" x2="718.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1446.7" y1="60.0" x2="744.6" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1500.0" y1="60.0" x2="770.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1553.3" y1="60.0" x2="797.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1606.7" y1="60.0" x2="823.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1660.0" y1="60.0" x2="849.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1713.3" y1="60.0" x2="876.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1766.7" y1="60.0" x2="902.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1820.0" y1="60.0" x2="928.9" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1873.3" y1="60.0" x2="955.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1926.7" y1="60.0" x2="981.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1980.0" y1="60.0" x2="1007.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2033.3" y1="60.0" x2="1034.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2086.7" y1="60.0" x2="1060.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2140.0" y1="60.0" x2="1086.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="60.0" y1="60.0" x2="1113.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="113.3" y1="60.0" x2="1139.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="166.7" y1="60.0" x2="1165.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="220.0" y1="60.0" x2="1192.2" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="273.3" y1="60.0" x2="1218.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="326.7" y1="60.0" x2="1244.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="380.0" y1="60.0" x2="1271.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="433.3" y1="60.0" x2="1297.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="486.7" y1="60.0" x2="1323.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="540.0" y1="60.0" x2="1350.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="593.3" y1="60.0" x2="1376.5" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="646.7" y1="60.0" x2="1402.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="700.0" y1="60.0" x2="1429.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="753.3" y1="60.0" x2="1455.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="806.7" y1="60.0" x2="1481.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="860.0" y1="60.0" x2="1508.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="913.3" y1="60.0" x2="1534.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="966.7" y1="60.0" x2="1560.8" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1020.0" y1="60.0" x2="1587.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1073.3" y1="60.0" x2="1613.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1126.7" y1="60.0" x2="1639.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1180.0" y1="60.0" x2="1666.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1233.3" y1="60.0" x2="1692.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1286.7" y1="60.0" x2="1718.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1340.0" y1="60.0" x2="1745.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1393.3" y1="60.0" x2="1771.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1446.7" y1="60.0" x2="1797.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1500.0" y1="60.0" x2="1824.1" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1553.3" y1="60.0" x2="1850.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1606.7" y1="60.0" x2="1876.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1660.0" y1="60.0" x2="1903.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1713.3" y1="60.0" x2="1929.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1766.7" y1="60.0" x2="1955.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1820.0" y1="60.0" x2="1982.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1873.3" y1="60.0" x2="2008.4" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1926.7" y1="60.0" x2="2034.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1980.0" y1="60.0" x2="2061.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2033.3" y1="60.0" x2="2087.3" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2086.7" y1="60.0" x2="2113.7" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2140.0" y1="60.0" x2="2140.0" y2="150.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="139.0" y1="150.0" x2="60.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="270.6" y1="150.0" x2="91.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="349.6" y1="150.0" x2="122.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="428.6" y1="150.0" x2="153.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="586.6" y1="150.0" x2="184.2" y2="240.0" stroke="#c04040" stroke-width="2.5"/>
|
||||||
|
<line x1="770.9" y1="150.0" x2="215.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="902.5" y1="150.0" x2="246.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1007.8" y1="150.0" x2="277.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1192.2" y1="150.0" x2="308.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1402.8" y1="150.0" x2="339.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1481.8" y1="150.0" x2="370.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1534.4" y1="150.0" x2="401.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1639.7" y1="150.0" x2="432.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1824.1" y1="150.0" x2="463.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1955.7" y1="150.0" x2="494.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2087.3" y1="150.0" x2="525.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="220.0" y1="60.0" x2="556.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="486.7" y1="60.0" x2="587.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="646.7" y1="60.0" x2="618.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="913.3" y1="60.0" x2="649.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1126.7" y1="60.0" x2="680.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1286.7" y1="60.0" x2="711.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1446.7" y1="60.0" x2="743.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1500.0" y1="60.0" x2="774.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2033.3" y1="60.0" x2="805.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="112.7" y1="150.0" x2="836.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="191.6" y1="150.0" x2="867.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="297.0" y1="150.0" x2="898.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="612.9" y1="150.0" x2="929.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="691.9" y1="150.0" x2="960.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="718.2" y1="150.0" x2="991.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="823.5" y1="150.0" x2="1022.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="849.9" y1="150.0" x2="1053.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="876.2" y1="150.0" x2="1084.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="139.0" y1="150.0" x2="1115.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="270.6" y1="150.0" x2="1146.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="349.6" y1="150.0" x2="1177.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="428.6" y1="150.0" x2="1208.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="586.6" y1="150.0" x2="1239.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="770.9" y1="150.0" x2="1270.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="902.5" y1="150.0" x2="1301.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1007.8" y1="150.0" x2="1332.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1192.2" y1="150.0" x2="1363.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1402.8" y1="150.0" x2="1394.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1481.8" y1="150.0" x2="1426.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1534.4" y1="150.0" x2="1457.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1639.7" y1="150.0" x2="1488.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1824.1" y1="150.0" x2="1519.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1955.7" y1="150.0" x2="1550.1" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2087.3" y1="150.0" x2="1581.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="220.0" y1="60.0" x2="1612.2" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="486.7" y1="60.0" x2="1643.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="646.7" y1="60.0" x2="1674.3" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="913.3" y1="60.0" x2="1705.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1126.7" y1="60.0" x2="1736.4" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1286.7" y1="60.0" x2="1767.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1446.7" y1="60.0" x2="1798.5" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1500.0" y1="60.0" x2="1829.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="2033.3" y1="60.0" x2="1860.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="112.7" y1="150.0" x2="1891.6" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="191.6" y1="150.0" x2="1922.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="297.0" y1="150.0" x2="1953.7" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="612.9" y1="150.0" x2="1984.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="691.9" y1="150.0" x2="2015.8" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="718.2" y1="150.0" x2="2046.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="823.5" y1="150.0" x2="2077.9" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="849.9" y1="150.0" x2="2109.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="876.2" y1="150.0" x2="2140.0" y2="240.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="91.0" y1="240.0" x2="60.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="184.2" y1="240.0" x2="97.8" y2="330.0" stroke="#c04040" stroke-width="2.5"/>
|
||||||
|
<line x1="215.2" y1="240.0" x2="135.6" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="277.3" y1="240.0" x2="173.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="370.4" y1="240.0" x2="211.3" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="401.5" y1="240.0" x2="249.1" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="432.5" y1="240.0" x2="286.9" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="463.6" y1="240.0" x2="324.7" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="494.6" y1="240.0" x2="362.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="525.7" y1="240.0" x2="400.4" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="556.7" y1="240.0" x2="438.2" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="774.0" y1="240.0" x2="476.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1115.5" y1="240.0" x2="513.8" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1146.6" y1="240.0" x2="551.6" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1177.6" y1="240.0" x2="589.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1363.9" y1="240.0" x2="627.3" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1426.0" y1="240.0" x2="665.1" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1457.0" y1="240.0" x2="702.9" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1519.1" y1="240.0" x2="740.7" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1550.1" y1="240.0" x2="778.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1612.2" y1="240.0" x2="816.4" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1798.5" y1="240.0" x2="854.2" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1829.6" y1="240.0" x2="892.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="139.0" y1="150.0" x2="929.8" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="270.6" y1="150.0" x2="967.6" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="349.6" y1="150.0" x2="1005.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="428.6" y1="150.0" x2="1043.3" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="586.6" y1="150.0" x2="1081.1" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="91.0" y1="240.0" x2="1118.9" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="184.2" y1="240.0" x2="1156.7" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="215.2" y1="240.0" x2="1194.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="277.3" y1="240.0" x2="1232.4" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="370.4" y1="240.0" x2="1270.2" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="401.5" y1="240.0" x2="1308.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="432.5" y1="240.0" x2="1345.8" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="463.6" y1="240.0" x2="1383.6" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="494.6" y1="240.0" x2="1421.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="525.7" y1="240.0" x2="1459.3" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="556.7" y1="240.0" x2="1497.1" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="774.0" y1="240.0" x2="1534.9" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1115.5" y1="240.0" x2="1572.7" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1146.6" y1="240.0" x2="1610.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1177.6" y1="240.0" x2="1648.4" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1363.9" y1="240.0" x2="1686.2" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1426.0" y1="240.0" x2="1724.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1457.0" y1="240.0" x2="1761.8" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1519.1" y1="240.0" x2="1799.6" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1550.1" y1="240.0" x2="1837.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1612.2" y1="240.0" x2="1875.3" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1798.5" y1="240.0" x2="1913.1" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="1829.6" y1="240.0" x2="1950.9" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="139.0" y1="150.0" x2="1988.7" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="270.6" y1="150.0" x2="2026.5" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="349.6" y1="150.0" x2="2064.4" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="428.6" y1="150.0" x2="2102.2" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<line x1="586.6" y1="150.0" x2="2140.0" y2="330.0" stroke="#bbb" stroke-width="1"/>
|
||||||
|
<circle cx="60.0" cy="60.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 1, Wert -30.0</title></circle>
|
||||||
|
<circle cx="113.3" cy="60.0" r="5" fill="#c83232" stroke="#333" stroke-width="0.5"><title>Id 2, Wert -127.0</title></circle>
|
||||||
|
<circle cx="166.7" cy="60.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 3, Wert -25.0</title></circle>
|
||||||
|
<circle cx="220.0" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 4, Wert -22.0</title></circle>
|
||||||
|
<circle cx="273.3" cy="60.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 5, Wert -25.0</title></circle>
|
||||||
|
<circle cx="326.7" cy="60.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 6, Wert -25.0</title></circle>
|
||||||
|
<circle cx="380.0" cy="60.0" r="5" fill="#9b4a3a" stroke="#333" stroke-width="0.5"><title>Id 7, Wert -98.0</title></circle>
|
||||||
|
<circle cx="433.3" cy="60.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 8, Wert -25.0</title></circle>
|
||||||
|
<circle cx="486.7" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 9, Wert -22.0</title></circle>
|
||||||
|
<circle cx="540.0" cy="60.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 10, Wert -25.0</title></circle>
|
||||||
|
<circle cx="593.3" cy="60.0" r="5" fill="#696743" stroke="#333" stroke-width="0.5"><title>Id 11, Wert -65.0</title></circle>
|
||||||
|
<circle cx="646.7" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 12, Wert -22.0</title></circle>
|
||||||
|
<circle cx="700.0" cy="60.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 13, Wert -30.0</title></circle>
|
||||||
|
<circle cx="753.3" cy="60.0" r="5" fill="#3b804c" stroke="#333" stroke-width="0.5"><title>Id 14, Wert -35.0</title></circle>
|
||||||
|
<circle cx="806.7" cy="60.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 15, Wert -25.0</title></circle>
|
||||||
|
<circle cx="860.0" cy="60.0" r="5" fill="#6e6442" stroke="#333" stroke-width="0.5"><title>Id 16, Wert -68.0</title></circle>
|
||||||
|
<circle cx="913.3" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 17, Wert -22.0</title></circle>
|
||||||
|
<circle cx="966.7" cy="60.0" r="5" fill="#9b4a3a" stroke="#333" stroke-width="0.5"><title>Id 18, Wert -98.0</title></circle>
|
||||||
|
<circle cx="1020.0" cy="60.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 19, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1073.3" cy="60.0" r="5" fill="#9e4939" stroke="#333" stroke-width="0.5"><title>Id 20, Wert -100.0</title></circle>
|
||||||
|
<circle cx="1126.7" cy="60.0" r="7" fill="#288c50" stroke="#c04040" stroke-width="2"><title>Id 21, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1180.0" cy="60.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 22, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1233.3" cy="60.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 23, Wert -30.0</title></circle>
|
||||||
|
<circle cx="1286.7" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 24, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1340.0" cy="60.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 25, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1393.3" cy="60.0" r="5" fill="#6e6442" stroke="#333" stroke-width="0.5"><title>Id 26, Wert -68.0</title></circle>
|
||||||
|
<circle cx="1446.7" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 27, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1500.0" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 28, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1553.3" cy="60.0" r="5" fill="#3b804c" stroke="#333" stroke-width="0.5"><title>Id 29, Wert -35.0</title></circle>
|
||||||
|
<circle cx="1606.7" cy="60.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 30, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1660.0" cy="60.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 31, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1713.3" cy="60.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 32, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1766.7" cy="60.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 33, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1820.0" cy="60.0" r="5" fill="#6e6442" stroke="#333" stroke-width="0.5"><title>Id 34, Wert -68.0</title></circle>
|
||||||
|
<circle cx="1873.3" cy="60.0" r="5" fill="#c83232" stroke="#333" stroke-width="0.5"><title>Id 35, Wert -127.0</title></circle>
|
||||||
|
<circle cx="1926.7" cy="60.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 36, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1980.0" cy="60.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 37, Wert -25.0</title></circle>
|
||||||
|
<circle cx="2033.3" cy="60.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 38, Wert -22.0</title></circle>
|
||||||
|
<circle cx="2086.7" cy="60.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 39, Wert -25.0</title></circle>
|
||||||
|
<circle cx="2140.0" cy="60.0" r="5" fill="#6e6442" stroke="#333" stroke-width="0.5"><title>Id 40, Wert -68.0</title></circle>
|
||||||
|
<circle cx="60.0" cy="150.0" r="5" fill="#92503c" stroke="#333" stroke-width="0.5"><title>Id 41, Wert -92.0</title></circle>
|
||||||
|
<circle cx="86.3" cy="150.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 42, Wert -30.0</title></circle>
|
||||||
|
<circle cx="112.7" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 43, Wert -25.0</title></circle>
|
||||||
|
<circle cx="139.0" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 44, Wert -22.0</title></circle>
|
||||||
|
<circle cx="165.3" cy="150.0" r="5" fill="#6e6442" stroke="#333" stroke-width="0.5"><title>Id 45, Wert -68.0</title></circle>
|
||||||
|
<circle cx="191.6" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 46, Wert -25.0</title></circle>
|
||||||
|
<circle cx="218.0" cy="150.0" r="5" fill="#c83232" stroke="#333" stroke-width="0.5"><title>Id 47, Wert -127.0</title></circle>
|
||||||
|
<circle cx="244.3" cy="150.0" r="5" fill="#6e6442" stroke="#333" stroke-width="0.5"><title>Id 48, Wert -68.0</title></circle>
|
||||||
|
<circle cx="270.6" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 49, Wert -22.0</title></circle>
|
||||||
|
<circle cx="297.0" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 50, Wert -25.0</title></circle>
|
||||||
|
<circle cx="323.3" cy="150.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 51, Wert -30.0</title></circle>
|
||||||
|
<circle cx="349.6" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 52, Wert -22.0</title></circle>
|
||||||
|
<circle cx="375.9" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 53, Wert -89.0</title></circle>
|
||||||
|
<circle cx="402.3" cy="150.0" r="5" fill="#86563e" stroke="#333" stroke-width="0.5"><title>Id 54, Wert -84.0</title></circle>
|
||||||
|
<circle cx="428.6" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 55, Wert -22.0</title></circle>
|
||||||
|
<circle cx="454.9" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 56, Wert -89.0</title></circle>
|
||||||
|
<circle cx="481.3" cy="150.0" r="5" fill="#487a4a" stroke="#333" stroke-width="0.5"><title>Id 57, Wert -43.0</title></circle>
|
||||||
|
<circle cx="507.6" cy="150.0" r="5" fill="#9b4a3a" stroke="#333" stroke-width="0.5"><title>Id 58, Wert -98.0</title></circle>
|
||||||
|
<circle cx="533.9" cy="150.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 59, Wert -30.0</title></circle>
|
||||||
|
<circle cx="560.3" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 60, Wert -89.0</title></circle>
|
||||||
|
<circle cx="586.6" cy="150.0" r="7" fill="#288c50" stroke="#c04040" stroke-width="2"><title>Id 61, Wert -22.0</title></circle>
|
||||||
|
<circle cx="612.9" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 62, Wert -25.0</title></circle>
|
||||||
|
<circle cx="639.2" cy="150.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 63, Wert -30.0</title></circle>
|
||||||
|
<circle cx="665.6" cy="150.0" r="5" fill="#696743" stroke="#333" stroke-width="0.5"><title>Id 64, Wert -65.0</title></circle>
|
||||||
|
<circle cx="691.9" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 65, Wert -25.0</title></circle>
|
||||||
|
<circle cx="718.2" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 66, Wert -25.0</title></circle>
|
||||||
|
<circle cx="744.6" cy="150.0" r="5" fill="#487a4a" stroke="#333" stroke-width="0.5"><title>Id 67, Wert -43.0</title></circle>
|
||||||
|
<circle cx="770.9" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 68, Wert -22.0</title></circle>
|
||||||
|
<circle cx="797.2" cy="150.0" r="5" fill="#c03633" stroke="#333" stroke-width="0.5"><title>Id 69, Wert -122.0</title></circle>
|
||||||
|
<circle cx="823.5" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 70, Wert -25.0</title></circle>
|
||||||
|
<circle cx="849.9" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 71, Wert -25.0</title></circle>
|
||||||
|
<circle cx="876.2" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 72, Wert -25.0</title></circle>
|
||||||
|
<circle cx="902.5" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 73, Wert -22.0</title></circle>
|
||||||
|
<circle cx="928.9" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 74, Wert -89.0</title></circle>
|
||||||
|
<circle cx="955.2" cy="150.0" r="5" fill="#92503c" stroke="#333" stroke-width="0.5"><title>Id 75, Wert -92.0</title></circle>
|
||||||
|
<circle cx="981.5" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 76, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1007.8" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 77, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1034.2" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 78, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1060.5" cy="150.0" r="5" fill="#6e6442" stroke="#333" stroke-width="0.5"><title>Id 79, Wert -68.0</title></circle>
|
||||||
|
<circle cx="1086.8" cy="150.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 80, Wert -30.0</title></circle>
|
||||||
|
<circle cx="1113.2" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 81, Wert -89.0</title></circle>
|
||||||
|
<circle cx="1139.5" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 82, Wert -89.0</title></circle>
|
||||||
|
<circle cx="1165.8" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 83, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1192.2" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 84, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1218.5" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 85, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1244.8" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 86, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1271.1" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 87, Wert -89.0</title></circle>
|
||||||
|
<circle cx="1297.5" cy="150.0" r="5" fill="#6e6442" stroke="#333" stroke-width="0.5"><title>Id 88, Wert -68.0</title></circle>
|
||||||
|
<circle cx="1323.8" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 89, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1350.1" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 90, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1376.5" cy="150.0" r="5" fill="#92503c" stroke="#333" stroke-width="0.5"><title>Id 91, Wert -92.0</title></circle>
|
||||||
|
<circle cx="1402.8" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 92, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1429.1" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 93, Wert -89.0</title></circle>
|
||||||
|
<circle cx="1455.4" cy="150.0" r="5" fill="#3b804c" stroke="#333" stroke-width="0.5"><title>Id 94, Wert -35.0</title></circle>
|
||||||
|
<circle cx="1481.8" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 95, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1508.1" cy="150.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 96, Wert -30.0</title></circle>
|
||||||
|
<circle cx="1534.4" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 97, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1560.8" cy="150.0" r="5" fill="#92503c" stroke="#333" stroke-width="0.5"><title>Id 98, Wert -92.0</title></circle>
|
||||||
|
<circle cx="1587.1" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 99, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1613.4" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 100, Wert -89.0</title></circle>
|
||||||
|
<circle cx="1639.7" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 101, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1666.1" cy="150.0" r="5" fill="#974d3b" stroke="#333" stroke-width="0.5"><title>Id 102, Wert -95.0</title></circle>
|
||||||
|
<circle cx="1692.4" cy="150.0" r="5" fill="#8e523c" stroke="#333" stroke-width="0.5"><title>Id 103, Wert -89.0</title></circle>
|
||||||
|
<circle cx="1718.7" cy="150.0" r="5" fill="#6e6442" stroke="#333" stroke-width="0.5"><title>Id 104, Wert -68.0</title></circle>
|
||||||
|
<circle cx="1745.1" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 105, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1771.4" cy="150.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 106, Wert -30.0</title></circle>
|
||||||
|
<circle cx="1797.7" cy="150.0" r="5" fill="#407e4b" stroke="#333" stroke-width="0.5"><title>Id 107, Wert -38.0</title></circle>
|
||||||
|
<circle cx="1824.1" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 108, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1850.4" cy="150.0" r="5" fill="#a34638" stroke="#333" stroke-width="0.5"><title>Id 109, Wert -103.0</title></circle>
|
||||||
|
<circle cx="1876.7" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 110, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1903.0" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 111, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1929.4" cy="150.0" r="5" fill="#6e6442" stroke="#333" stroke-width="0.5"><title>Id 112, Wert -68.0</title></circle>
|
||||||
|
<circle cx="1955.7" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 113, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1982.0" cy="150.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 114, Wert -30.0</title></circle>
|
||||||
|
<circle cx="2008.4" cy="150.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 115, Wert -30.0</title></circle>
|
||||||
|
<circle cx="2034.7" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 116, Wert -25.0</title></circle>
|
||||||
|
<circle cx="2061.0" cy="150.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 117, Wert -25.0</title></circle>
|
||||||
|
<circle cx="2087.3" cy="150.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 118, Wert -22.0</title></circle>
|
||||||
|
<circle cx="2113.7" cy="150.0" r="5" fill="#974d3b" stroke="#333" stroke-width="0.5"><title>Id 119, Wert -95.0</title></circle>
|
||||||
|
<circle cx="2140.0" cy="150.0" r="5" fill="#34854d" stroke="#333" stroke-width="0.5"><title>Id 120, Wert -30.0</title></circle>
|
||||||
|
<circle cx="60.0" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 121, Wert -25.0</title></circle>
|
||||||
|
<circle cx="91.0" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 122, Wert -22.0</title></circle>
|
||||||
|
<circle cx="122.1" cy="240.0" r="5" fill="#6e6442" stroke="#333" stroke-width="0.5"><title>Id 123, Wert -68.0</title></circle>
|
||||||
|
<circle cx="153.1" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 124, Wert -25.0</title></circle>
|
||||||
|
<circle cx="184.2" cy="240.0" r="7" fill="#288c50" stroke="#c04040" stroke-width="2"><title>Id 125, Wert -22.0</title></circle>
|
||||||
|
<circle cx="215.2" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 126, Wert -22.0</title></circle>
|
||||||
|
<circle cx="246.3" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 127, Wert -25.0</title></circle>
|
||||||
|
<circle cx="277.3" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 128, Wert -22.0</title></circle>
|
||||||
|
<circle cx="308.4" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 129, Wert -25.0</title></circle>
|
||||||
|
<circle cx="339.4" cy="240.0" r="5" fill="#696743" stroke="#333" stroke-width="0.5"><title>Id 130, Wert -65.0</title></circle>
|
||||||
|
<circle cx="370.4" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 131, Wert -22.0</title></circle>
|
||||||
|
<circle cx="401.5" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 132, Wert -22.0</title></circle>
|
||||||
|
<circle cx="432.5" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 133, Wert -22.0</title></circle>
|
||||||
|
<circle cx="463.6" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 134, Wert -22.0</title></circle>
|
||||||
|
<circle cx="494.6" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 135, Wert -22.0</title></circle>
|
||||||
|
<circle cx="525.7" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 136, Wert -22.0</title></circle>
|
||||||
|
<circle cx="556.7" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 137, Wert -22.0</title></circle>
|
||||||
|
<circle cx="587.8" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 138, Wert -25.0</title></circle>
|
||||||
|
<circle cx="618.8" cy="240.0" r="5" fill="#756041" stroke="#333" stroke-width="0.5"><title>Id 139, Wert -73.0</title></circle>
|
||||||
|
<circle cx="649.9" cy="240.0" r="5" fill="#756041" stroke="#333" stroke-width="0.5"><title>Id 140, Wert -73.0</title></circle>
|
||||||
|
<circle cx="680.9" cy="240.0" r="5" fill="#c03633" stroke="#333" stroke-width="0.5"><title>Id 141, Wert -122.0</title></circle>
|
||||||
|
<circle cx="711.9" cy="240.0" r="5" fill="#756041" stroke="#333" stroke-width="0.5"><title>Id 142, Wert -73.0</title></circle>
|
||||||
|
<circle cx="743.0" cy="240.0" r="5" fill="#756041" stroke="#333" stroke-width="0.5"><title>Id 143, Wert -73.0</title></circle>
|
||||||
|
<circle cx="774.0" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 144, Wert -22.0</title></circle>
|
||||||
|
<circle cx="805.1" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 145, Wert -25.0</title></circle>
|
||||||
|
<circle cx="836.1" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 146, Wert -25.0</title></circle>
|
||||||
|
<circle cx="867.2" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 147, Wert -25.0</title></circle>
|
||||||
|
<circle cx="898.2" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 148, Wert -25.0</title></circle>
|
||||||
|
<circle cx="929.3" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 149, Wert -25.0</title></circle>
|
||||||
|
<circle cx="960.3" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 150, Wert -25.0</title></circle>
|
||||||
|
<circle cx="991.3" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 151, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1022.4" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 152, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1053.4" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 153, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1084.5" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 154, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1115.5" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 155, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1146.6" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 156, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1177.6" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 157, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1208.7" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 158, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1239.7" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 159, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1270.7" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 160, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1301.8" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 161, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1332.8" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 162, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1363.9" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 163, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1394.9" cy="240.0" r="5" fill="#716242" stroke="#333" stroke-width="0.5"><title>Id 164, Wert -70.0</title></circle>
|
||||||
|
<circle cx="1426.0" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 165, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1457.0" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 166, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1488.1" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 167, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1519.1" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 168, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1550.1" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 169, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1581.2" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 170, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1612.2" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 171, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1643.3" cy="240.0" r="5" fill="#c03633" stroke="#333" stroke-width="0.5"><title>Id 172, Wert -122.0</title></circle>
|
||||||
|
<circle cx="1674.3" cy="240.0" r="5" fill="#487a4a" stroke="#333" stroke-width="0.5"><title>Id 173, Wert -43.0</title></circle>
|
||||||
|
<circle cx="1705.4" cy="240.0" r="5" fill="#756041" stroke="#333" stroke-width="0.5"><title>Id 174, Wert -73.0</title></circle>
|
||||||
|
<circle cx="1736.4" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 175, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1767.5" cy="240.0" r="5" fill="#487a4a" stroke="#333" stroke-width="0.5"><title>Id 176, Wert -43.0</title></circle>
|
||||||
|
<circle cx="1798.5" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 177, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1829.6" cy="240.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 178, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1860.6" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 179, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1891.6" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 180, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1922.7" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 181, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1953.7" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 182, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1984.8" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 183, Wert -25.0</title></circle>
|
||||||
|
<circle cx="2015.8" cy="240.0" r="5" fill="#6e6442" stroke="#333" stroke-width="0.5"><title>Id 184, Wert -68.0</title></circle>
|
||||||
|
<circle cx="2046.9" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 185, Wert -25.0</title></circle>
|
||||||
|
<circle cx="2077.9" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 186, Wert -25.0</title></circle>
|
||||||
|
<circle cx="2109.0" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 187, Wert -25.0</title></circle>
|
||||||
|
<circle cx="2140.0" cy="240.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 188, Wert -25.0</title></circle>
|
||||||
|
<circle cx="60.0" cy="330.0" r="5" fill="#c03633" stroke="#333" stroke-width="0.5"><title>Id 189, Wert -122.0</title></circle>
|
||||||
|
<circle cx="97.8" cy="330.0" r="7" fill="#288c50" stroke="#c04040" stroke-width="2"><title>Id 190, Wert -22.0</title></circle>
|
||||||
|
<circle cx="135.6" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 191, Wert -22.0</title></circle>
|
||||||
|
<circle cx="173.5" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 192, Wert -25.0</title></circle>
|
||||||
|
<circle cx="211.3" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 193, Wert -22.0</title></circle>
|
||||||
|
<circle cx="249.1" cy="330.0" r="5" fill="#716242" stroke="#333" stroke-width="0.5"><title>Id 194, Wert -70.0</title></circle>
|
||||||
|
<circle cx="286.9" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 195, Wert -25.0</title></circle>
|
||||||
|
<circle cx="324.7" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 196, Wert -25.0</title></circle>
|
||||||
|
<circle cx="362.5" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 197, Wert -22.0</title></circle>
|
||||||
|
<circle cx="400.4" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 198, Wert -25.0</title></circle>
|
||||||
|
<circle cx="438.2" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 199, Wert -22.0</title></circle>
|
||||||
|
<circle cx="476.0" cy="330.0" r="5" fill="#c03633" stroke="#333" stroke-width="0.5"><title>Id 200, Wert -122.0</title></circle>
|
||||||
|
<circle cx="513.8" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 201, Wert -22.0</title></circle>
|
||||||
|
<circle cx="551.6" cy="330.0" r="5" fill="#c03633" stroke="#333" stroke-width="0.5"><title>Id 202, Wert -122.0</title></circle>
|
||||||
|
<circle cx="589.5" cy="330.0" r="5" fill="#696743" stroke="#333" stroke-width="0.5"><title>Id 203, Wert -65.0</title></circle>
|
||||||
|
<circle cx="627.3" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 204, Wert -22.0</title></circle>
|
||||||
|
<circle cx="665.1" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 205, Wert -25.0</title></circle>
|
||||||
|
<circle cx="702.9" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 206, Wert -22.0</title></circle>
|
||||||
|
<circle cx="740.7" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 207, Wert -25.0</title></circle>
|
||||||
|
<circle cx="778.5" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 208, Wert -25.0</title></circle>
|
||||||
|
<circle cx="816.4" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 209, Wert -22.0</title></circle>
|
||||||
|
<circle cx="854.2" cy="330.0" r="5" fill="#696743" stroke="#333" stroke-width="0.5"><title>Id 210, Wert -65.0</title></circle>
|
||||||
|
<circle cx="892.0" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 211, Wert -22.0</title></circle>
|
||||||
|
<circle cx="929.8" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 212, Wert -22.0</title></circle>
|
||||||
|
<circle cx="967.6" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 213, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1005.5" cy="330.0" r="5" fill="#487a4a" stroke="#333" stroke-width="0.5"><title>Id 214, Wert -43.0</title></circle>
|
||||||
|
<circle cx="1043.3" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 215, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1081.1" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 216, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1118.9" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 217, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1156.7" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 218, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1194.5" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 219, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1232.4" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 220, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1270.2" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 221, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1308.0" cy="330.0" r="5" fill="#407e4b" stroke="#333" stroke-width="0.5"><title>Id 222, Wert -38.0</title></circle>
|
||||||
|
<circle cx="1345.8" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 223, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1383.6" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 224, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1421.5" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 225, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1459.3" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 226, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1497.1" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 227, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1534.9" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 228, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1572.7" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 229, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1610.5" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 230, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1648.4" cy="330.0" r="5" fill="#716242" stroke="#333" stroke-width="0.5"><title>Id 231, Wert -70.0</title></circle>
|
||||||
|
<circle cx="1686.2" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 232, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1724.0" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 233, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1761.8" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 234, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1799.6" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 235, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1837.5" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 236, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1875.3" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 237, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1913.1" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 238, Wert -22.0</title></circle>
|
||||||
|
<circle cx="1950.9" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 239, Wert -25.0</title></circle>
|
||||||
|
<circle cx="1988.7" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 240, Wert -25.0</title></circle>
|
||||||
|
<circle cx="2026.5" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 241, Wert -22.0</title></circle>
|
||||||
|
<circle cx="2064.4" cy="330.0" r="5" fill="#487a4a" stroke="#333" stroke-width="0.5"><title>Id 242, Wert -43.0</title></circle>
|
||||||
|
<circle cx="2102.2" cy="330.0" r="5" fill="#2c894f" stroke="#333" stroke-width="0.5"><title>Id 243, Wert -25.0</title></circle>
|
||||||
|
<circle cx="2140.0" cy="330.0" r="5" fill="#288c50" stroke="#333" stroke-width="0.5"><title>Id 244, Wert -22.0</title></circle>
|
||||||
|
<text x="97.8" y="352.0" text-anchor="middle" font-size="12" font-weight="bold" fill="#c04040">190</text>
|
||||||
|
<text x="48" y="64.0" text-anchor="end" font-size="11" fill="#666">Gen 0</text>
|
||||||
|
<text x="48" y="154.0" text-anchor="end" font-size="11" fill="#666">Gen 1</text>
|
||||||
|
<text x="48" y="244.0" text-anchor="end" font-size="11" fill="#666">Gen 2</text>
|
||||||
|
<text x="48" y="334.0" text-anchor="end" font-size="11" fill="#666">Gen 3</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 48 KiB |
@@ -0,0 +1,50 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="650" viewBox="0 0 900 650" font-family="sans-serif">
|
||||||
|
<rect width="100%" height="100%" fill="white"/>
|
||||||
|
<text x="450" y="30" text-anchor="middle" font-size="16" fill="#333">Entwicklung der Loesungsfindung</text>
|
||||||
|
<line x1="60" y1="60" x2="60" y2="390.0" stroke="#333" stroke-width="1.5"/>
|
||||||
|
<line x1="60" y1="390.0" x2="840" y2="390.0" stroke="#333" stroke-width="1.5"/>
|
||||||
|
<line x1="60" y1="390.0" x2="840" y2="390.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="394.0" text-anchor="end" font-size="11" fill="#666">-127</text>
|
||||||
|
<line x1="60" y1="324.0" x2="840" y2="324.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="328.0" text-anchor="end" font-size="11" fill="#666">-106</text>
|
||||||
|
<line x1="60" y1="258.0" x2="840" y2="258.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="262.0" text-anchor="end" font-size="11" fill="#666">-85</text>
|
||||||
|
<line x1="60" y1="192.0" x2="840" y2="192.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="196.0" text-anchor="end" font-size="11" fill="#666">-64</text>
|
||||||
|
<line x1="60" y1="126.0" x2="840" y2="126.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="130.0" text-anchor="end" font-size="11" fill="#666">-43</text>
|
||||||
|
<line x1="60" y1="60.0" x2="840" y2="60.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="64.0" text-anchor="end" font-size="11" fill="#666">-22</text>
|
||||||
|
<text x="18" y="225.0" text-anchor="middle" font-size="12" fill="#333" transform="rotate(-90 18 225.0)">Wertigkeit (hoeher = besser)</text>
|
||||||
|
<polyline points="60.0,60.0 146.7,60.0 233.3,60.0 320.0,60.0 406.7,60.0 493.3,60.0 580.0,60.0 666.7,60.0 753.3,60.0 840.0,60.0" fill="none" stroke="#2f6f4f" stroke-width="2"/>
|
||||||
|
<polyline points="60.0,120.1 146.7,140.8 233.3,133.9 320.0,62.5 406.7,95.9 493.3,84.7 580.0,60.0 666.7,92.8 753.3,81.9 840.0,60.0" fill="none" stroke="#c08a2d" stroke-width="2"/>
|
||||||
|
<polyline points="60.0,390.0 146.7,390.0 233.3,390.0 320.0,69.4 406.7,374.3 493.3,374.3 580.0,60.0 666.7,374.3 753.3,374.3 840.0,60.0" fill="none" stroke="#a03030" stroke-width="2"/>
|
||||||
|
<line x1="680" y1="70" x2="704" y2="70" stroke="#2f6f4f" stroke-width="2"/>
|
||||||
|
<text x="710" y="74" font-size="11" fill="#333">beste Loesung</text>
|
||||||
|
<line x1="680" y1="88" x2="704" y2="88" stroke="#c08a2d" stroke-width="2"/>
|
||||||
|
<text x="710" y="92" font-size="11" fill="#333">Durchschnitt</text>
|
||||||
|
<line x1="680" y1="106" x2="704" y2="106" stroke="#a03030" stroke-width="2"/>
|
||||||
|
<text x="710" y="110" font-size="11" fill="#333">schlechteste Loesung</text>
|
||||||
|
<text x="450" y="428.0" text-anchor="middle" font-size="13" fill="#333">Anzahl erzeugter Verteilungen im Pool</text>
|
||||||
|
<line x1="60" y1="440.0" x2="60" y2="590.0" stroke="#333" stroke-width="1.5"/>
|
||||||
|
<line x1="60" y1="590.0" x2="840" y2="590.0" stroke="#333" stroke-width="1.5"/>
|
||||||
|
<line x1="60" y1="590.0" x2="840" y2="590.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="594.0" text-anchor="end" font-size="11" fill="#666">0</text>
|
||||||
|
<line x1="60" y1="515.0" x2="840" y2="515.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="519.0" text-anchor="end" font-size="11" fill="#666">60</text>
|
||||||
|
<line x1="60" y1="440.0" x2="840" y2="440.0" stroke="#eee" stroke-width="1"/>
|
||||||
|
<text x="52" y="444.0" text-anchor="end" font-size="11" fill="#666">120</text>
|
||||||
|
<polyline points="60.0,540.0 146.7,490.0 233.3,440.0 320.0,547.5 406.7,505.0 493.3,462.5 580.0,555.0 666.7,520.0 753.3,485.0 840.0,561.2" fill="none" stroke="#4060a0" stroke-width="2"/>
|
||||||
|
<text x="60.0" y="606.0" text-anchor="middle" font-size="10" fill="#999">e</text>
|
||||||
|
<text x="146.7" y="606.0" text-anchor="middle" font-size="10" fill="#999">m</text>
|
||||||
|
<text x="233.3" y="606.0" text-anchor="middle" font-size="10" fill="#999">j</text>
|
||||||
|
<text x="320.0" y="606.0" text-anchor="middle" font-size="10" fill="#999">s</text>
|
||||||
|
<text x="406.7" y="606.0" text-anchor="middle" font-size="10" fill="#999">m</text>
|
||||||
|
<text x="493.3" y="606.0" text-anchor="middle" font-size="10" fill="#999">j</text>
|
||||||
|
<text x="580.0" y="606.0" text-anchor="middle" font-size="10" fill="#999">s</text>
|
||||||
|
<text x="666.7" y="606.0" text-anchor="middle" font-size="10" fill="#999">m</text>
|
||||||
|
<text x="753.3" y="606.0" text-anchor="middle" font-size="10" fill="#999">j</text>
|
||||||
|
<text x="840.0" y="606.0" text-anchor="middle" font-size="10" fill="#999">s</text>
|
||||||
|
<text x="450" y="638" text-anchor="middle" font-size="12" fill="#333">Zyklus-Aktion (Zeit)</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.3 KiB |
@@ -0,0 +1,17 @@
|
|||||||
|
Bloedkopf, Bestelli, = Hof 1, Tisch 2, Nummer 2
|
||||||
|
Bloedkopf, Bestelli, = Hof 1, Tisch 2, Nummer 3
|
||||||
|
Bloedkopf, Bestelli, = Hof 1, Tisch 2, Nummer 4
|
||||||
|
Brandt, Willi, Dr. = Hof 1, Tisch 4, Nummer 5
|
||||||
|
Bruegge, Heinz, = Hof 1, Tisch 5, Nummer 2
|
||||||
|
Dietrich, Marlene, = Hof 1, Tisch 5, Nummer 5
|
||||||
|
Emmerlich, Walter, = Hof 1, Tisch 4, Nummer 3
|
||||||
|
Frenzen, Heinz Harald, = Hof 1, Tisch 3, Nummer 4
|
||||||
|
Hoehn, Bernd Robert, Professor = Hof 1, Tisch 1, Nummer 4
|
||||||
|
Junke, Harald, = Hof 1, Tisch 4, Nummer 4
|
||||||
|
K, Hubert, = Hof 1, Tisch 5, Nummer 3
|
||||||
|
Leone, Sergio, = Hof 1, Tisch 4, Nummer 2
|
||||||
|
Mueller, Magnus, Professor = Hof 1, Tisch 1, Nummer 3
|
||||||
|
Ruehmann, Heinz, = Hof 1, Tisch 5, Nummer 4
|
||||||
|
Schumacher, Michael, = Hof 1, Tisch 3, Nummer 3
|
||||||
|
Schumacher, Ralf, = Hof 1, Tisch 3, Nummer 2
|
||||||
|
Stangl, Michael, Dipl. Ing. = Hof 1, Tisch 1, Nummer 2
|
||||||
|
@@ -0,0 +1,37 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="504.572" height="108.914" viewBox="0 0 504.572 108.914">
|
||||||
|
<rect width="100%" height="100%" fill="white"/>
|
||||||
|
<polyline points="252.286,54.4572 351.2,54.4572" fill="none" stroke="#3cb44b" stroke-width="12" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="0.5"/>
|
||||||
|
<circle cx="54.4572" cy="54.4572" r="37.242" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle cx="54.4572" cy="39.2151" r="12" fill="#888888" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="67.6572" cy="62.0782" r="12" fill="#888888" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="41.2572" cy="62.0782" r="12" fill="#888888" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="54.4572" cy="54.4572" r="12" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="54.4572" y="54.4572" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">1</text>
|
||||||
|
<circle cx="153.372" cy="54.4572" r="44.4572" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle cx="153.372" cy="32" r="12" fill="#e6194b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="172.82" cy="65.6858" r="12" fill="#e6194b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="133.923" cy="65.6858" r="12" fill="#e6194b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="153.372" cy="54.4572" r="12" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="153.372" y="54.4572" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">2</text>
|
||||||
|
<circle cx="252.286" cy="54.4572" r="37.242" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle cx="252.286" cy="39.2151" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="265.486" cy="62.0782" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="239.086" cy="62.0782" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="252.286" cy="54.4572" r="12" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="252.286" y="54.4572" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">3</text>
|
||||||
|
<circle cx="351.2" cy="54.4572" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle cx="351.2" cy="35.7896" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="369.868" cy="54.4572" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="351.2" cy="73.1248" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="332.533" cy="54.4572" r="12" fill="#3cb44b" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="351.2" cy="54.4572" r="12" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="351.2" y="54.4572" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">4</text>
|
||||||
|
<circle cx="450.115" cy="54.4572" r="40.6676" fill="white" stroke="black" stroke-width="1.5"/>
|
||||||
|
<circle cx="450.115" cy="35.7896" r="12" fill="#4363d8" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="468.782" cy="54.4572" r="12" fill="#4363d8" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="450.115" cy="73.1248" r="12" fill="#f58231" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="431.447" cy="54.4572" r="12" fill="#f58231" stroke="black" stroke-width="1"/>
|
||||||
|
<circle cx="450.115" cy="54.4572" r="12" fill="white" fill-opacity="0.75"/>
|
||||||
|
<text x="450.115" y="54.4572" text-anchor="middle" dominant-baseline="central" font-size="13.2" font-weight="bold" fill="black">5</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.3 KiB |
@@ -0,0 +1,27 @@
|
|||||||
|
[1]
|
||||||
|
Dipl. Ing. Michael Stangl = Hof 1, Tisch 1, Nummer 1
|
||||||
|
Professor Magnus Mueller = Hof 1, Tisch 1, Nummer 2
|
||||||
|
Professor Bernd Robert Hoehn = Hof 1, Tisch 1, Nummer 3
|
||||||
|
|
||||||
|
[2]
|
||||||
|
Bestelli Bloedkopf = Hof 1, Tisch 2, Nummer 1
|
||||||
|
Bestelli Bloedkopf = Hof 1, Tisch 2, Nummer 2
|
||||||
|
Bestelli Bloedkopf = Hof 1, Tisch 2, Nummer 3
|
||||||
|
|
||||||
|
[3]
|
||||||
|
Ralf Schumacher = Hof 1, Tisch 3, Nummer 1
|
||||||
|
Michael Schumacher = Hof 1, Tisch 3, Nummer 2
|
||||||
|
Heinz Harald Frenzen = Hof 1, Tisch 3, Nummer 3
|
||||||
|
|
||||||
|
[4]
|
||||||
|
Sergio Leone = Hof 1, Tisch 4, Nummer 1
|
||||||
|
Walter Emmerlich = Hof 1, Tisch 4, Nummer 2
|
||||||
|
Harald Junke = Hof 1, Tisch 4, Nummer 3
|
||||||
|
Dr. Willi Brandt = Hof 1, Tisch 4, Nummer 4
|
||||||
|
|
||||||
|
[5]
|
||||||
|
Heinz Bruegge = Hof 1, Tisch 5, Nummer 1
|
||||||
|
Hubert K = Hof 1, Tisch 5, Nummer 2
|
||||||
|
Heinz Ruehmann = Hof 1, Tisch 5, Nummer 3
|
||||||
|
Marlene Dietrich = Hof 1, Tisch 5, Nummer 4
|
||||||
|
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
{
|
||||||
|
"gruppen": [
|
||||||
|
{
|
||||||
|
"name": "einfache Gruppe aus drei Personen\n\t mit festem Wunsch fuer einen Tisch",
|
||||||
|
"tisch": 1,
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Michael",
|
||||||
|
"nachname": "Stangl",
|
||||||
|
"titel": "Dipl. Ing."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Magnus",
|
||||||
|
"nachname": "Mueller",
|
||||||
|
"titel": "Professor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Bernd Robert",
|
||||||
|
"nachname": "Hoehn",
|
||||||
|
"titel": "Professor"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "einfache Gruppe aus zwei Personen",
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Heinz",
|
||||||
|
"nachname": "Bruegge"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Hubert",
|
||||||
|
"nachname": "K"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Heinz",
|
||||||
|
"nachname": "Ruehmann"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Marlene",
|
||||||
|
"nachname": "Dietrich"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Sergio",
|
||||||
|
"nachname": "Leone"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Walter",
|
||||||
|
"nachname": "Emmerlich"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Harald",
|
||||||
|
"nachname": "Junke"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Willi",
|
||||||
|
"nachname": "Brandt",
|
||||||
|
"titel": "Dr."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Michael",
|
||||||
|
"nachname": "Schumacher"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Ralf",
|
||||||
|
"nachname": "Schumacher"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"vorname": "Heinz Harald",
|
||||||
|
"nachname": "Frenzen"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Gruppe aus drei anonymen Personen",
|
||||||
|
"anzahl": 3,
|
||||||
|
"personen": [
|
||||||
|
{
|
||||||
|
"vorname": "Bestelli",
|
||||||
|
"nachname": "Bloedkopf"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
<Bestellung>
|
|
||||||
|
|
||||||
<!-- einfache Gruppe aus drei Personen
|
|
||||||
mit festem Wunsch fuer einen Tisch-->
|
|
||||||
<Gruppe>
|
|
||||||
<Person>
|
|
||||||
<Vorname>Michael</Vorname>
|
|
||||||
<Nachname>Stangl</Nachname>
|
|
||||||
<Titel>Dipl. Ing.</Titel>
|
|
||||||
</Person>
|
|
||||||
<Person>
|
|
||||||
<Vorname>Magnus</Vorname>
|
|
||||||
<Nachname>Mueller</Nachname>
|
|
||||||
<Titel>Professor</Titel>
|
|
||||||
</Person>
|
|
||||||
<Person>
|
|
||||||
<Vorname>Bernd Robert</Vorname>
|
|
||||||
<Nachname>Hoehn</Nachname>
|
|
||||||
<Titel>Professor</Titel>
|
|
||||||
</Person>
|
|
||||||
<Tisch>1</Tisch>
|
|
||||||
</Gruppe>
|
|
||||||
|
|
||||||
<!-- einfache Gruppe aus zwei Personen -->
|
|
||||||
<Gruppe>
|
|
||||||
<Person>
|
|
||||||
<Vorname>Heinz</Vorname>
|
|
||||||
<Nachname>Bruegge</Nachname>
|
|
||||||
</Person>
|
|
||||||
<Person>
|
|
||||||
<Vorname>Hubert</Vorname>
|
|
||||||
<Nachname>K</Nachname>
|
|
||||||
</Person>
|
|
||||||
</Gruppe>
|
|
||||||
|
|
||||||
<Gruppe>
|
|
||||||
<Person>
|
|
||||||
<Vorname>Heinz</Vorname>
|
|
||||||
<Nachname>Ruehmann</Nachname>
|
|
||||||
</Person>
|
|
||||||
<Person>
|
|
||||||
<Vorname>Marlene</Vorname>
|
|
||||||
<Nachname>Dietrich</Nachname>
|
|
||||||
</Person>
|
|
||||||
</Gruppe>
|
|
||||||
|
|
||||||
<Gruppe>
|
|
||||||
<Person>
|
|
||||||
<Vorname>Sergio</Vorname>
|
|
||||||
<Nachname>Leone</Nachname>
|
|
||||||
</Person>
|
|
||||||
<Person>
|
|
||||||
<Vorname>Walter</Vorname>
|
|
||||||
<Nachname>Emmerlich</Nachname>
|
|
||||||
</Person>
|
|
||||||
<Person>
|
|
||||||
<Vorname>Harald</Vorname>
|
|
||||||
<Nachname>Junke</Nachname>
|
|
||||||
</Person>
|
|
||||||
<Person>
|
|
||||||
<Vorname>Willi</Vorname>
|
|
||||||
<Nachname>Brandt</Nachname>
|
|
||||||
<Titel>Dr.</Titel>
|
|
||||||
</Person>
|
|
||||||
<Person>
|
|
||||||
<Vorname>Michael</Vorname>
|
|
||||||
<Nachname>Schumacher</Nachname>
|
|
||||||
</Person>
|
|
||||||
<Person>
|
|
||||||
<Vorname>Ralf</Vorname>
|
|
||||||
<Nachname>Schumacher</Nachname>
|
|
||||||
</Person>
|
|
||||||
<Person>
|
|
||||||
<Vorname>Heinz Harald</Vorname>
|
|
||||||
<Nachname>Frenzen</Nachname>
|
|
||||||
</Person>
|
|
||||||
</Gruppe>
|
|
||||||
|
|
||||||
<!--Gruppe aus drei anonymen Personen-->
|
|
||||||
<Gruppe>
|
|
||||||
<Person>
|
|
||||||
<Vorname>Bestelli</Vorname>
|
|
||||||
<Nachname>Bloedkopf</Nachname>
|
|
||||||
</Person>
|
|
||||||
<Anzahl>3</Anzahl>
|
|
||||||
</Gruppe>
|
|
||||||
|
|
||||||
</Bestellung>
|
|
||||||
|
|
||||||
|
|
||||||