feat: F4.8c the documentation mode's image export, as Java's

ExportRun measures Java's print panel (GUIContainer.prepareExportPanel) and
image on four projects and an empty one: 10 to spare around, a light grey
footer 20 below the lowest element, 20 below it, a transparent background,
the documentation painted as in the design. The sidebar gains Java's
"Exportieren": the surface painted with Canvas 2D (an SVG with a
foreignObject taints the canvas in WebKit) and saved under the project's
name; Java's message when saving fails. Not adopted: Java's empty image of
an empty project (its footer overflows). The editor takes a projectName;
the capture export shares the download helper.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-04 11:54:09 +00:00
co-authored by Claude Opus 5.5
parent de03f6bb96
commit 7e68414bb2
20 changed files with 1803 additions and 25 deletions
+803
View File
@@ -0,0 +1,803 @@
{
"projects": {
"nat_with_mapped_port.fls": {
"nodes": [
{
"name": "Switch",
"bounds": [
300,
131,
91,
72
]
},
{
"name": "Switch",
"bounds": [
676,
161,
91,
72
]
},
{
"name": "Vermittlungsrechner",
"bounds": [
551,
90,
167,
78
]
},
{
"name": "Vermittlungsrechner",
"bounds": [
559,
263,
167,
78
]
},
{
"name": "Vermittlungsrechner",
"bounds": [
562,
426,
167,
78
]
},
{
"name": "DNS-Server",
"bounds": [
837,
119,
101,
114
]
},
{
"name": "192.168.0.100",
"bounds": [
152,
54,
116,
100
]
},
{
"name": "192.168.0.101",
"bounds": [
157,
202,
116,
100
]
},
{
"name": "Webserver www.jupiter.de",
"bounds": [
804,
307,
213,
114
]
},
{
"name": "Webserver - 192.168.0.10",
"bounds": [
99,
363,
198,
114
]
},
{
"name": "Switch",
"bounds": [
313,
444,
91,
72
]
},
{
"name": "192.168.0.100",
"bounds": [
260,
538,
116,
100
]
},
{
"name": "Heimrouter Vincent",
"bounds": [
384,
438,
158,
78
]
},
{
"name": "Heimrouter Paul",
"bounds": [
375,
122,
136,
78
]
},
{
"name": "Switch",
"bounds": [
694,
342,
91,
72
]
}
],
"cables": [
[
208,
102,
139,
67
],
[
213,
165,
134,
89
],
[
632,
127,
91,
72
],
[
719,
174,
170,
25
],
[
640,
195,
83,
109
],
[
196,
418,
164,
64
],
[
316,
478,
44,
112
],
[
343,
159,
102,
10
],
[
441,
127,
195,
36
],
[
356,
475,
109,
7
],
[
461,
463,
186,
16
],
[
640,
300,
101,
80
],
[
643,
376,
98,
91
],
[
737,
362,
175,
18
]
],
"docs": [
{
"type": 1,
"bounds": [
94,
34,
428,
292
],
"color": "204,204,204,255"
},
{
"type": 2,
"bounds": [
316,
42,
142,
26
],
"color": "0,0,0,255"
},
{
"type": 1,
"bounds": [
95,
349,
428,
296
],
"color": "204,204,204,255"
},
{
"type": 2,
"bounds": [
322,
358,
169,
27
],
"color": "0,0,0,255"
},
{
"type": 2,
"bounds": [
388,
523,
129,
73
],
"color": "0,0,0,255"
},
{
"type": 2,
"bounds": [
113,
483,
167,
108
],
"color": "0,0,0,255"
},
{
"type": 1,
"bounds": [
792,
52,
224,
489
],
"color": "204,204,204,255"
},
{
"type": 2,
"bounds": [
828,
430,
148,
50
],
"color": "0,0,0,255"
},
{
"type": 2,
"bounds": [
802,
57,
187,
50
],
"color": "0,0,0,255"
}
],
"path": "nat_with_mapped_port.fls",
"panelSize": [
2020,
1620
],
"network": {
"minX": 99.0,
"maxX": 1017.0,
"minY": 54.0,
"maxY": 638.0
},
"documentation": {
"minX": 94.0,
"maxX": 1016.0,
"minY": 34.0,
"maxY": 645.0
},
"footerArea": {
"minX": 104.0,
"maxX": 814.0,
"minY": 675.0,
"maxY": 690.0
},
"footer": {
"text": "<path>",
"bounds": [
104,
675,
710,
15
],
"stringWidth": 690,
"fontHeight": 15,
"foreground": "192,192,192,255"
},
"clip": [
94,
34,
943,
676
],
"imageSize": [
943,
676
],
"cornerPixel": "0,0,0,0",
"footerColours": [
[
"0,0,0,0",
8267
],
[
"192,192,192,255",
2383
]
],
"rectangleCentre": [
[
"215,215,215,255",
1
]
],
"rectangleCentreColor": "204,204,204,255"
},
"zwei_rechnernetze_komplett.fls": {
"nodes": [
{
"name": "Switch 1",
"bounds": [
164,
178,
91,
72
]
},
{
"name": "Switch 2",
"bounds": [
612,
104,
91,
72
]
},
{
"name": "DNS-Server 2.10",
"bounds": [
694,
19,
134,
114
]
},
{
"name": "Notebook 1.10",
"bounds": [
53,
100,
123,
100
]
},
{
"name": "Notebook 1.11",
"bounds": [
70,
235,
123,
100
]
},
{
"name": "Vermittlungsrechner",
"bounds": [
373,
106,
167,
78
]
}
],
"cables": [
[
112,
148,
99,
68
],
[
129,
212,
82,
75
],
[
655,
74,
108,
68
],
[
207,
143,
251,
73
],
[
454,
138,
205,
9
]
],
"docs": [],
"path": "zwei_rechnernetze_komplett.fls",
"panelSize": [
2020,
1620
],
"network": {
"minX": 53.0,
"maxX": 828.0,
"minY": 19.0,
"maxY": 335.0
},
"documentation": {
"minX": 2.147483647E9,
"maxX": 0.0,
"minY": 2.147483647E9,
"maxY": 0.0
},
"footerArea": {
"minX": 63.0,
"maxX": 817.0,
"minY": 365.0,
"maxY": 380.0
},
"footer": {
"text": "<path>",
"bounds": [
63,
365,
754,
15
],
"stringWidth": 734,
"fontHeight": 15,
"foreground": "192,192,192,255"
},
"clip": [
53,
19,
795,
381
],
"imageSize": [
795,
381
],
"cornerPixel": "0,0,0,0",
"footerColours": [
[
"0,0,0,0",
8805
],
[
"192,192,192,255",
2505
]
]
},
"documentation.fls": {
"nodes": [],
"cables": [],
"docs": [
{
"type": 2,
"bounds": [
40,
40,
160,
60
],
"color": "79,130,189,255"
},
{
"type": 2,
"bounds": [
40,
140,
120,
50
],
"color": "0,0,0,255"
},
{
"type": 1,
"bounds": [
20,
20,
300,
200
],
"color": "255,201,201,255"
},
{
"type": 1,
"bounds": [
400,
20,
100,
50
],
"color": "204,204,204,255"
}
],
"path": "documentation.fls",
"panelSize": [
2020,
1620
],
"network": {
"minX": 2.147483647E9,
"maxX": 0.0,
"minY": 2.147483647E9,
"maxY": 0.0
},
"documentation": {
"minX": 20.0,
"maxX": 500.0,
"minY": 20.0,
"maxY": 220.0
},
"footerArea": {
"minX": 30.0,
"maxX": 399.0,
"minY": 250.0,
"maxY": 265.0
},
"footer": {
"text": "<path>",
"bounds": [
30,
250,
369,
15
],
"stringWidth": 349,
"fontHeight": 15,
"foreground": "192,192,192,255"
},
"clip": [
20,
20,
500,
265
],
"imageSize": [
500,
265
],
"cornerPixel": "0,0,0,0",
"footerColours": [
[
"0,0,0,0",
4393
],
[
"192,192,192,255",
1142
]
],
"rectangleCentre": [
[
"255,212,212,255",
1
]
],
"rectangleCentreColor": "255,201,201,255"
},
"modem_beispiel.fls": {
"nodes": [
{
"name": "Rechner 0.11",
"bounds": [
586,
46,
112,
114
]
},
{
"name": "Notebook 0.10",
"bounds": [
42,
182,
123,
100
]
},
{
"name": "Modem (Zugreifend)",
"bounds": [
237,
212,
165,
76
]
},
{
"name": "Modem (Zugangspunkt)",
"bounds": [
396,
79,
190,
76
]
}
],
"cables": [
[
101,
230,
220,
22
],
[
489,
101,
155,
18
]
],
"docs": [],
"path": "modem_beispiel.fls",
"panelSize": [
2020,
1620
],
"network": {
"minX": 42.0,
"maxX": 698.0,
"minY": 46.0,
"maxY": 288.0
},
"documentation": {
"minX": 2.147483647E9,
"maxX": 0.0,
"minY": 2.147483647E9,
"maxY": 0.0
},
"footerArea": {
"minX": 52.0,
"maxX": 715.0,
"minY": 318.0,
"maxY": 333.0
},
"footer": {
"text": "<path>",
"bounds": [
52,
318,
663,
15
],
"stringWidth": 643,
"fontHeight": 15,
"foreground": "192,192,192,255"
},
"clip": [
42,
46,
693,
307
],
"imageSize": [
693,
307
],
"cornerPixel": "0,0,0,0",
"footerColours": [
[
"0,0,0,0",
7708
],
[
"192,192,192,255",
2237
]
]
}
},
"empty": {
"nodes": [],
"cables": [],
"docs": [],
"path": null,
"panelSize": [
2020,
1620
],
"network": {
"minX": 2.147483647E9,
"maxX": 0.0,
"minY": 2.147483647E9,
"maxY": 0.0
},
"documentation": {
"minX": 2.147483647E9,
"maxX": 0.0,
"minY": 2.147483647E9,
"maxY": 0.0
},
"footerArea": {
"minX": 0.0,
"maxX": 0.0,
"minY": 30.0,
"maxY": 45.0
},
"footer": {
"text": "Filius",
"bounds": [
-2147483639,
30,
57,
15
],
"stringWidth": 37,
"fontHeight": 15,
"foreground": "192,192,192,255"
},
"clip": [
0,
30,
20,
35
],
"imageSize": [
20,
35
],
"cornerPixel": "0,0,0,0",
"footerColours": []
}
}