app foldee

This commit is contained in:
marcus.hinz
2026-06-14 12:13:49 +02:00
parent 6d29263392
commit b30e4a7d31
73 changed files with 994 additions and 175 deletions
+62 -47
View File
@@ -2,35 +2,32 @@
"""Folie 3 LIS mit Umsystemen (Adapter, links/rechts) und andockenden Modulen
(unten), unter einer Steuerungs-/Governance-Schicht; weitere LIS angedeutet."""
import os
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.enum.shapes import MSO_SHAPE
from adesso_style import (WHITE, INK, BLUE, TEAL, GREEN, CORAL, LIGHT, MUTE, RECF,
F, FC, paint_background, chrome)
INK = RGBColor(0x2A, 0x2F, 0x3A)
NAVY = RGBColor(0x1F, 0x3A, 0x5F)
ACCENT = RGBColor(0xC0, 0x49, 0x2F)
TEAL = RGBColor(0x2F, 0x8F, 0x83)
AMBER = RGBColor(0xA9, 0x73, 0x22)
MUTE = RGBColor(0x8A, 0x93, 0xA0)
LINEC = RGBColor(0xC3, 0xC9, 0xD1)
HINT = RGBColor(0xEE, 0xF1, 0xF4)
HINTL = RGBColor(0xCB, 0xD2, 0xDA)
TINT_T = RGBColor(0xDD, 0xEC, 0xEA)
TINT_A = RGBColor(0xF3, 0xE8, 0xD2)
UMS = RGBColor(0xEC, 0xEE, 0xF1)
BG = RGBColor(0xFF, 0xFF, 0xFF)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
F = "Calibri"
# Rollen-Mapping auf die adesso-Palette
NAVY = INK # dunkle Strukturelemente (Bar, LIS-Kern)
ACCENT = CORAL # Adapter-Linien
AMBER = GREEN # zweites Modul
LINEC = LIGHT # Verbinder / feine Linien
HINT = RGBColor(0xE6, 0xEF, 0xF8) # helle "weitere LIS"-Karten
HINTL = RGBColor(0xC4, 0xD6, 0xE8)
TINT_T = WHITE # Modul-Boxen weiß
TINT_A = WHITE
UMS = WHITE # Umsystem-Boxen weiß
BG = WHITE
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
s = prs.slides.add_slide(prs.slide_layouts[6])
bgr = s.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height)
bgr.fill.solid(); bgr.fill.fore_color.rgb = BG; bgr.line.fill.background()
bgr.shadow.inherit = False
paint_background(s, prs.slide_width, prs.slide_height)
def shp(kind, x, y, w, h, fill=None, line=None, lw=Pt(1), rot=0):
@@ -75,11 +72,7 @@ def vline(x, y, h, color=LINEC, weight=Pt(1.4)):
# ---- Kopf ------------------------------------------------------------------
txt(Inches(0.95), Inches(0.32), Inches(8), Inches(0.35), "ARCHITEKTUR",
size=12.5, color=ACCENT, bold=True, spc=240)
txt(Inches(0.95), Inches(0.62), Inches(11), Inches(0.85), "Offen und gesteuert",
size=31, color=NAVY, bold=True)
shp(MSO_SHAPE.RECTANGLE, Inches(0.95), Inches(1.34), Inches(0.6), Pt(4), fill=ACCENT)
chrome(s, "Offen und gesteuert", 3)
x0, x1 = Inches(0.95), Inches(12.38)
@@ -144,6 +137,14 @@ core_y, core_h = Inches(4.3), Inches(1.2)
core_cx = core_x + core_w / 2
core_by = core_y + core_h
# Adapter-Schicht: echte Schicht als Hülle um den Kern (Trennung)
lay_pad_x, lay_pad_t = Inches(0.24), Inches(0.30)
lay_x = core_x - lay_pad_x
lay_w = core_w + lay_pad_x * 2
lay_y = core_y - lay_pad_t
lay_h = core_h + lay_pad_t
lay_right = lay_x + lay_w
def adapter(xc, yc):
shp(MSO_SHAPE.ROUNDED_RECTANGLE, xc - Inches(0.10), yc - Inches(0.11),
@@ -185,8 +186,12 @@ def icon_dfu(ix, iy): # DFÜ
fill=ACCENT)
# Governance -> LIS
vline(core_cx, gov_y + Inches(0.07), core_y - (gov_y + Inches(0.07)), color=LINEC, weight=Pt(1))
g = Inches(0.10) # Abstand Adapter-Linie <-> LIS
th = Inches(0.08) # Dicke der roten Adapter-Linie
# Governance -> obere Adapter-Linie am Kern
vline(core_cx, gov_y + Inches(0.07), (core_y - g - th) - (gov_y + Inches(0.07)),
color=LINEC, weight=Pt(1))
uw, uh = Inches(1.55), Inches(0.6)
@@ -198,37 +203,50 @@ def ums_box(bx, yc, name, icon_fn):
size=12, color=INK, align=PP_ALIGN.LEFT)
# Umsysteme links
# Umsysteme links -> Adapter-Schichten am linken Kernrand
lx = Inches(0.8)
ums_box(lx, Inches(4.6), "Anlieferung", icon_truck)
ums_box(lx, Inches(5.2), "DFÜ", icon_dfu)
for yc in (Inches(4.6), Inches(5.2)):
hline(lx + uw, yc, core_x - (lx + uw))
adapter(core_x - Inches(0.16), yc)
hline(lx + uw, yc, (core_x - g - th) - (lx + uw))
# Umsystem rechts
# Umsystem rechts -> Adapter-Linie am rechten Kernrand
gx = Inches(6.65)
ums_box(gx, Inches(4.9), "Geräte", icon_device)
hline(core_x + core_w, Inches(4.9), gx - (core_x + core_w))
adapter(core_x + core_w + Inches(0.16), Inches(4.9))
hline(core_x + core_w + g + th, Inches(4.9), gx - (core_x + core_w + g + th))
# LIS (kompakt, solide)
# ---- LIS-Kern -------------------------------------------------------------
shp(MSO_SHAPE.ROUNDED_RECTANGLE, core_x, core_y, core_w, core_h, fill=NAVY)
sh = shp(MSO_SHAPE.ROUNDED_RECTANGLE, core_x, core_y, core_w, core_h, fill=NAVY)
boxtext(sh, "LIS", size=22, color=WHITE, bold=True)
# Module unten (andockend)
# ---- 5 Adapter-Linien je Schnittstelle eine, mit Abstand zum Kern -------
def rbar_v(outer_x, yc, h=Inches(0.55)): # vertikal, linker/rechter Rand
shp(MSO_SHAPE.RECTANGLE, outer_x, yc - h / 2, th, h, fill=ACCENT)
def rbar_h(xc, outer_y, w): # horizontal, oben/unten
shp(MSO_SHAPE.RECTANGLE, xc - w / 2, outer_y, w, th, fill=ACCENT)
rbar_v(core_x - g - th, Inches(4.6)) # 1) Anlieferung
rbar_v(core_x - g - th, Inches(5.2)) # 2) DFÜ
rbar_h(core_cx, core_y - g - th, Inches(1.15)) # 3) nach oben (Steuerung)
rbar_v(core_x + core_w + g, Inches(4.9)) # 4) Geräte
rbar_h(core_cx, core_by + g, core_w - Inches(0.2)) # 5) Fachliche Verarbeitung
# Fachliche Verarbeitung (unten): Module an der unteren Adapter-Linie
mw, mh = Inches(1.7), Inches(0.6)
my = Inches(6.05)
for nm, fill, tc, mcx in [("Hochdurchsatz", TINT_T, TEAL, Inches(3.85)),
("Spezial", TINT_A, AMBER, Inches(5.85))]:
vline(mcx, core_by, my - core_by, color=LINEC, weight=Pt(1))
dock(mcx, core_by + (my - core_by) / 2)
sh = shp(MSO_SHAPE.ROUNDED_RECTANGLE, mcx - mw / 2, my, mw, mh, fill=fill, line=tc, lw=Pt(1.25))
boxtext(sh, nm, size=12.5, color=tc, bold=True)
vline(mcx, core_by + g + th, my - (core_by + g + th), color=LINEC, weight=Pt(1))
sh = shp(MSO_SHAPE.ROUNDED_RECTANGLE, mcx - mw / 2, my, mw, mh, fill=fill, line=tc, lw=Pt(1.5))
boxtext(sh, nm, size=12.5, color=INK, bold=True)
txt(Inches(2.9), my + mh + Inches(0.12), Inches(4.0), Inches(0.3), "eigene Module",
size=12, color=MUTE, bold=True, align=PP_ALIGN.CENTER)
txt(Inches(2.9), my + mh + Inches(0.12), Inches(4.0), Inches(0.3), "Fachliche Verarbeitung",
size=12, color=LIGHT, bold=True, align=PP_ALIGN.CENTER)
# ===========================================================================
@@ -252,17 +270,14 @@ mini_lis(Inches(10.0), Inches(4.75), faded=False)
vline(Inches(10.0) + hw_ / 2, gov_y + Inches(0.07), Inches(4.75) - (gov_y + Inches(0.07)),
color=LINEC, weight=Pt(1))
txt(Inches(9.9), Inches(4.35) + hh_ + Inches(0.2), Inches(2.4), Inches(0.35), "weitere LIS",
size=13, color=MUTE, align=PP_ALIGN.CENTER)
size=13, color=LIGHT, align=PP_ALIGN.CENTER)
# ---- Mini-Legende ----------------------------------------------------------
ly = Inches(7.05)
adapter(Inches(7.35), ly)
txt(Inches(7.55), ly - Inches(0.16), Inches(2.1), Inches(0.32), "Adapter (Umsysteme)",
size=11.5, color=MUTE)
dock(Inches(9.65), ly)
txt(Inches(9.85), ly - Inches(0.16), Inches(2.1), Inches(0.32), "Andocken (Module)",
size=11.5, color=MUTE)
shp(MSO_SHAPE.RECTANGLE, Inches(7.55), ly - Inches(0.11), th, Inches(0.22), fill=ACCENT)
txt(Inches(7.8), ly - Inches(0.16), Inches(3.2), Inches(0.32),
"Adapter-Schicht je Schnittstelle eine", size=11.5, color=LIGHT)
out = "/home/marcuh/claude-projects/limbach/Folie3.pptx"
out = os.path.join(os.path.dirname(os.path.abspath(__file__)), "Folie3.pptx")
prs.save(out)
print("saved", out)