From 9be9f9420a18549afa3a2fe03432b26c771c3d9e Mon Sep 17 00:00:00 2001 From: forbes Date: Fri, 13 Feb 2026 14:05:31 -0600 Subject: [PATCH] cherry-pick #1: initial Kindred branding + assembly joint fix Cherry-picked 316d4f4b524 with conflict resolution: - CMakeLists.txt: merged Kindred version vars with upstream 1.2.0-dev base - src/Main/*.cpp: applied Kindred branding (banner, copyright, license) - Resolved add/add conflicts for files already copied in Phase 1 - Includes assembly joint flip overconstrain fix --- CMakeLists.txt | 30 +- kindred-logo.svg | 106 ++ resources/branding/generate-icons.sh | 98 ++ resources/branding/generate-splash.py | 214 +++ resources/branding/kindred-logo.svg | 106 ++ .../hicolor/128x128/apps/kindred-create.png | Bin 0 -> 3931 bytes .../hicolor/16x16/apps/kindred-create.png | Bin 0 -> 491 bytes .../hicolor/24x24/apps/kindred-create.png | Bin 0 -> 721 bytes .../hicolor/256x256/apps/kindred-create.png | Bin 0 -> 7865 bytes .../hicolor/32x32/apps/kindred-create.png | Bin 0 -> 982 bytes .../hicolor/48x48/apps/kindred-create.png | Bin 0 -> 1493 bytes .../hicolor/512x512/apps/kindred-create.png | Bin 0 -> 16341 bytes .../hicolor/64x64/apps/kindred-create.png | Bin 0 -> 1954 bytes .../hicolor/scalable/apps/kindred-create.svg | 106 ++ resources/icons/kindred-create.icns | Bin 0 -> 30648 bytes resources/icons/kindred-create.ico | Bin 0 -> 109906 bytes .../KindredCreate/KindredCreate.cfg | 109 ++ .../KindredCreate/KindredCreate.qss | 1229 +++++++++++++++++ resources/preferences/package.xml | 18 + src/Gui/Dialogs/DlgAbout.cpp | 9 +- src/Gui/Icons/resource.qrc | 4 + src/Gui/PreferencePacks/CMakeLists.txt | 1 + .../KindredCreate/KindredCreate.qss | 1229 +++++++++++++++++ src/Gui/PreferencePacks/package.xml | 25 +- src/Gui/SplashScreen.cpp | 4 +- src/Gui/Stylesheets/CMakeLists.txt | 1 + src/Main/FreeCADGuiPy.cpp | 10 +- src/Main/MainCmd.cpp | 18 +- src/Main/MainGui.cpp | 32 +- src/Main/MainPy.cpp | 4 +- src/Main/freecad.rc.cmake | 14 +- src/Main/freecadCmd.rc.cmake | 14 +- src/Mod/Assembly/App/AssemblyObject.cpp | 71 +- tests/assytest.20260126-040101.FCBak | Bin 0 -> 32511 bytes tests/assytest.FCStd | Bin 0 -> 37880 bytes tests/assytestpart.FCStd | Bin 0 -> 15561 bytes 36 files changed, 3384 insertions(+), 68 deletions(-) create mode 100644 kindred-logo.svg create mode 100755 resources/branding/generate-icons.sh create mode 100755 resources/branding/generate-splash.py create mode 100644 resources/branding/kindred-logo.svg create mode 100644 resources/icons/hicolor/128x128/apps/kindred-create.png create mode 100644 resources/icons/hicolor/16x16/apps/kindred-create.png create mode 100644 resources/icons/hicolor/24x24/apps/kindred-create.png create mode 100644 resources/icons/hicolor/256x256/apps/kindred-create.png create mode 100644 resources/icons/hicolor/32x32/apps/kindred-create.png create mode 100644 resources/icons/hicolor/48x48/apps/kindred-create.png create mode 100644 resources/icons/hicolor/512x512/apps/kindred-create.png create mode 100644 resources/icons/hicolor/64x64/apps/kindred-create.png create mode 100644 resources/icons/hicolor/scalable/apps/kindred-create.svg create mode 100644 resources/icons/kindred-create.icns create mode 100644 resources/icons/kindred-create.ico create mode 100644 resources/preferences/KindredCreate/KindredCreate.cfg create mode 100644 resources/preferences/KindredCreate/KindredCreate.qss create mode 100644 resources/preferences/package.xml create mode 100644 src/Gui/PreferencePacks/KindredCreate/KindredCreate.qss create mode 100644 tests/assytest.20260126-040101.FCBak create mode 100644 tests/assytest.FCStd create mode 100644 tests/assytestpart.FCStd diff --git a/CMakeLists.txt b/CMakeLists.txt index 879b69d29a..70901a3ab5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,18 +48,38 @@ if(FREECAD_USE_CCACHE) endif() endif() -project(FreeCAD) +project(KindredCreate) -set(PACKAGE_VERSION_MAJOR "1") -set(PACKAGE_VERSION_MINOR "2") -set(PACKAGE_VERSION_PATCH "0") # number of patch release (e.g. "4" for the 0.18.4 release) +# Kindred Create version +set(KINDRED_CREATE_VERSION_MAJOR "0") +set(KINDRED_CREATE_VERSION_MINOR "1") +set(KINDRED_CREATE_VERSION_PATCH "0") +set(KINDRED_CREATE_VERSION "${KINDRED_CREATE_VERSION_MAJOR}.${KINDRED_CREATE_VERSION_MINOR}.${KINDRED_CREATE_VERSION_PATCH}") + +# Underlying FreeCAD version +set(FREECAD_VERSION_MAJOR "1") +set(FREECAD_VERSION_MINOR "2") +set(FREECAD_VERSION_PATCH "0") +set(FREECAD_VERSION "${FREECAD_VERSION_MAJOR}.${FREECAD_VERSION_MINOR}.${FREECAD_VERSION_PATCH}") + +# Package version (used for build system compatibility) +set(PACKAGE_VERSION_MAJOR ${KINDRED_CREATE_VERSION_MAJOR}) +set(PACKAGE_VERSION_MINOR ${KINDRED_CREATE_VERSION_MINOR}) +set(PACKAGE_VERSION_PATCH ${KINDRED_CREATE_VERSION_PATCH}) set(PACKAGE_VERSION_SUFFIX "dev") # either "dev" for development snapshot or "" (empty string) -set(PACKAGE_BUILD_VERSION "0") # used when the same FreeCAD version will be re-released (for example using an updated LibPack) +set(PACKAGE_BUILD_VERSION "0") # used when the same version will be re-released string(TIMESTAMP PACKAGE_COPYRIGHT_YEAR "%Y") set(PACKAGE_VERSION "${PACKAGE_VERSION_MAJOR}.${PACKAGE_VERSION_MINOR}.${PACKAGE_VERSION_PATCH}") set(PACKAGE_STRING "${PROJECT_NAME} ${PACKAGE_VERSION}") +# Pass Kindred Create version to compiler +add_definitions(-DKINDRED_CREATE_VERSION="${KINDRED_CREATE_VERSION}") +add_definitions(-DKINDRED_CREATE_VERSION_MAJOR=${KINDRED_CREATE_VERSION_MAJOR}) +add_definitions(-DKINDRED_CREATE_VERSION_MINOR=${KINDRED_CREATE_VERSION_MINOR}) +add_definitions(-DKINDRED_CREATE_VERSION_PATCH=${KINDRED_CREATE_VERSION_PATCH}) +add_definitions(-DFREECAD_VERSION="${FREECAD_VERSION}") + # include local modules include(CheckCXXCompilerFlag) include(AddFileDependencies) diff --git a/kindred-logo.svg b/kindred-logo.svg new file mode 100644 index 0000000000..64d4ea8d9a --- /dev/null +++ b/kindred-logo.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + diff --git a/resources/branding/generate-icons.sh b/resources/branding/generate-icons.sh new file mode 100755 index 0000000000..ce8a2937bb --- /dev/null +++ b/resources/branding/generate-icons.sh @@ -0,0 +1,98 @@ +#!/bin/bash +# generate-icons.sh - Generate application icons for Kindred Create +# +# This script generates icon files for all platforms from the source SVG. +# Prerequisites: +# - Inkscape (SVG to PNG conversion) +# - ImageMagick (ICO generation for Windows) +# - png2icns or iconutil (ICNS generation for macOS) +# +# Usage: ./generate-icons.sh + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SVG_SOURCE="$SCRIPT_DIR/kindred-logo.svg" +OUTPUT_DIR="$SCRIPT_DIR/../icons" + +# Check for source file +if [ ! -f "$SVG_SOURCE" ]; then + echo "Error: Source SVG not found at $SVG_SOURCE" + echo "Please place kindred-logo.svg in the branding directory." + exit 1 +fi + +# Check for Inkscape +if ! command -v inkscape &> /dev/null; then + echo "Error: Inkscape is required but not installed." + echo "Install with: sudo apt install inkscape (Debian/Ubuntu)" + exit 1 +fi + +echo "Generating icons from $SVG_SOURCE..." + +# Generate PNGs for Linux/hicolor icon theme +for size in 16 24 32 48 64 128 256 512; do + dir="$OUTPUT_DIR/hicolor/${size}x${size}/apps" + mkdir -p "$dir" + echo " Generating ${size}x${size} PNG..." + inkscape -w $size -h $size "$SVG_SOURCE" -o "$dir/kindred-create.png" 2>/dev/null +done + +# Copy SVG for scalable +mkdir -p "$OUTPUT_DIR/hicolor/scalable/apps" +cp "$SVG_SOURCE" "$OUTPUT_DIR/hicolor/scalable/apps/kindred-create.svg" +echo " Copied scalable SVG" + +# Generate Windows ICO (requires ImageMagick) +if command -v convert &> /dev/null; then + echo " Generating Windows ICO..." + convert \ + "$OUTPUT_DIR/hicolor/16x16/apps/kindred-create.png" \ + "$OUTPUT_DIR/hicolor/24x24/apps/kindred-create.png" \ + "$OUTPUT_DIR/hicolor/32x32/apps/kindred-create.png" \ + "$OUTPUT_DIR/hicolor/48x48/apps/kindred-create.png" \ + "$OUTPUT_DIR/hicolor/64x64/apps/kindred-create.png" \ + "$OUTPUT_DIR/hicolor/128x128/apps/kindred-create.png" \ + "$OUTPUT_DIR/hicolor/256x256/apps/kindred-create.png" \ + "$OUTPUT_DIR/kindred-create.ico" + echo " Created kindred-create.ico" +else + echo " Warning: ImageMagick not found, skipping ICO generation." + echo " Install with: sudo apt install imagemagick" +fi + +# Generate macOS ICNS (requires png2icns or iconutil) +if command -v png2icns &> /dev/null; then + echo " Generating macOS ICNS..." + png2icns "$OUTPUT_DIR/kindred-create.icns" \ + "$OUTPUT_DIR/hicolor/16x16/apps/kindred-create.png" \ + "$OUTPUT_DIR/hicolor/32x32/apps/kindred-create.png" \ + "$OUTPUT_DIR/hicolor/128x128/apps/kindred-create.png" \ + "$OUTPUT_DIR/hicolor/256x256/apps/kindred-create.png" \ + "$OUTPUT_DIR/hicolor/512x512/apps/kindred-create.png" + echo " Created kindred-create.icns" +elif command -v iconutil &> /dev/null; then + echo " Generating macOS ICNS using iconutil..." + ICONSET_DIR="$OUTPUT_DIR/kindred-create.iconset" + mkdir -p "$ICONSET_DIR" + cp "$OUTPUT_DIR/hicolor/16x16/apps/kindred-create.png" "$ICONSET_DIR/icon_16x16.png" + cp "$OUTPUT_DIR/hicolor/32x32/apps/kindred-create.png" "$ICONSET_DIR/icon_16x16@2x.png" + cp "$OUTPUT_DIR/hicolor/32x32/apps/kindred-create.png" "$ICONSET_DIR/icon_32x32.png" + cp "$OUTPUT_DIR/hicolor/64x64/apps/kindred-create.png" "$ICONSET_DIR/icon_32x32@2x.png" + cp "$OUTPUT_DIR/hicolor/128x128/apps/kindred-create.png" "$ICONSET_DIR/icon_128x128.png" + cp "$OUTPUT_DIR/hicolor/256x256/apps/kindred-create.png" "$ICONSET_DIR/icon_128x128@2x.png" + cp "$OUTPUT_DIR/hicolor/256x256/apps/kindred-create.png" "$ICONSET_DIR/icon_256x256.png" + cp "$OUTPUT_DIR/hicolor/512x512/apps/kindred-create.png" "$ICONSET_DIR/icon_256x256@2x.png" + cp "$OUTPUT_DIR/hicolor/512x512/apps/kindred-create.png" "$ICONSET_DIR/icon_512x512.png" + iconutil -c icns "$ICONSET_DIR" -o "$OUTPUT_DIR/kindred-create.icns" + rm -rf "$ICONSET_DIR" + echo " Created kindred-create.icns" +else + echo " Warning: Neither png2icns nor iconutil found, skipping ICNS generation." + echo " Install png2icns with: sudo apt install icnsutils" +fi + +echo "" +echo "Icon generation complete!" +echo "Output directory: $OUTPUT_DIR" diff --git a/resources/branding/generate-splash.py b/resources/branding/generate-splash.py new file mode 100755 index 0000000000..7df5e67109 --- /dev/null +++ b/resources/branding/generate-splash.py @@ -0,0 +1,214 @@ +#!/usr/bin/env python3 +""" +Generate Kindred Create splash screen and about images. + +This script creates branded splash screens with: +- Rounded dark rectangle background (Catppuccin Mocha base #1e1e2e) +- Kindred logo centered +- "Kindred Create" title text +- Version string + +Requirements: + pip install Pillow cairosvg + +Usage: + python generate-splash.py [--version VERSION] [--freecad-version FREECAD_VERSION] +""" + +import argparse +import os +import sys +from pathlib import Path + +try: + from PIL import Image, ImageDraw, ImageFont +except ImportError: + print("Error: Pillow is required. Install with: pip install Pillow") + sys.exit(1) + +try: + import cairosvg +except ImportError: + print("Warning: cairosvg not found. Will try alternative SVG conversion.") + cairosvg = None + +# Catppuccin Mocha colors +COLORS = { + 'base': '#1e1e2e', + 'surface0': '#313244', + 'text': '#cdd6f4', + 'subtext0': '#a6adc8', + 'blue': '#89b4fa', + 'lavender': '#b4befe', +} + +def hex_to_rgb(hex_color): + """Convert hex color to RGB tuple.""" + hex_color = hex_color.lstrip('#') + return tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4)) + +def create_rounded_rectangle(draw, bbox, radius, fill): + """Draw a rounded rectangle.""" + x1, y1, x2, y2 = bbox + draw.rounded_rectangle(bbox, radius=radius, fill=fill) + +def load_svg_as_image(svg_path, width, height): + """Load an SVG file and convert to PIL Image at specified size.""" + if cairosvg: + import io + png_data = cairosvg.svg2png(url=str(svg_path), output_width=width, output_height=height) + return Image.open(io.BytesIO(png_data)).convert('RGBA') + else: + # Fallback: try using inkscape command line + import subprocess + import tempfile + with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as tmp: + tmp_path = tmp.name + try: + subprocess.run([ + 'inkscape', '-w', str(width), '-h', str(height), + str(svg_path), '-o', tmp_path + ], check=True, capture_output=True) + img = Image.open(tmp_path).convert('RGBA') + return img + finally: + if os.path.exists(tmp_path): + os.unlink(tmp_path) + +def get_font(size, bold=False): + """Get a font, falling back to default if not available.""" + font_names = [ + '/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf' if bold else '/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', + '/usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf' if bold else '/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf', + '/usr/share/fonts/TTF/DejaVuSans-Bold.ttf' if bold else '/usr/share/fonts/TTF/DejaVuSans.ttf', + ] + for font_name in font_names: + if os.path.exists(font_name): + return ImageFont.truetype(font_name, size) + # Fallback to default + return ImageFont.load_default() + +def create_splash(output_path, logo_path, width, height, version, freecad_version, scale=1): + """Create a splash screen image.""" + # Scale dimensions + w = int(width * scale) + h = int(height * scale) + radius = int(16 * scale) + padding = int(30 * scale) + + # Create image with transparent background + img = Image.new('RGBA', (w, h), (0, 0, 0, 0)) + draw = ImageDraw.Draw(img) + + # Draw rounded rectangle background + bg_color = hex_to_rgb(COLORS['base']) + create_rounded_rectangle(draw, (padding, padding, w - padding, h - padding), radius, bg_color) + + # Load and place logo + logo_max_width = int(300 * scale) + logo_max_height = int(150 * scale) + + try: + logo = load_svg_as_image(logo_path, logo_max_width, logo_max_height) + # Center logo horizontally, place in upper portion + logo_x = (w - logo.width) // 2 + logo_y = int(80 * scale) + img.paste(logo, (logo_x, logo_y), logo) + except Exception as e: + print(f"Warning: Could not load logo: {e}") + logo_y = int(80 * scale) + + # Draw "Kindred Create" title + title_font = get_font(int(24 * scale), bold=True) + title = "Kindred Create" + title_bbox = draw.textbbox((0, 0), title, font=title_font) + title_width = title_bbox[2] - title_bbox[0] + title_x = (w - title_width) // 2 + title_y = int(250 * scale) + draw.text((title_x, title_y), title, fill=hex_to_rgb(COLORS['text']), font=title_font) + + # Draw version string + version_font = get_font(int(12 * scale)) + version_str = f"v{version} (FreeCAD {freecad_version})" + version_bbox = draw.textbbox((0, 0), version_str, font=version_font) + version_width = version_bbox[2] - version_bbox[0] + version_x = (w - version_width) // 2 + version_y = title_y + int(35 * scale) + draw.text((version_x, version_y), version_str, fill=hex_to_rgb(COLORS['subtext0']), font=version_font) + + # Save + img.save(output_path, 'PNG') + print(f"Created: {output_path}") + +def create_about(output_path, logo_path, width, height, scale=1): + """Create an about dialog image.""" + # Scale dimensions + w = int(width * scale) + h = int(height * scale) + + # Create image + img = Image.new('RGBA', (w, h), hex_to_rgb(COLORS['base']) + (255,)) + draw = ImageDraw.Draw(img) + + # Load and place logo + logo_max_width = int(200 * scale) + logo_max_height = int(100 * scale) + + try: + logo = load_svg_as_image(logo_path, logo_max_width, logo_max_height) + logo_x = (w - logo.width) // 2 + logo_y = int(30 * scale) + img.paste(logo, (logo_x, logo_y), logo) + except Exception as e: + print(f"Warning: Could not load logo: {e}") + + # Save + img.save(output_path, 'PNG') + print(f"Created: {output_path}") + +def main(): + parser = argparse.ArgumentParser(description='Generate Kindred Create splash screens') + parser.add_argument('--version', default='0.1.0', help='Kindred Create version') + parser.add_argument('--freecad-version', default='1.0.0', help='FreeCAD version') + args = parser.parse_args() + + script_dir = Path(__file__).parent + logo_path = script_dir / 'kindred-logo.svg' + icons_dir = script_dir.parent.parent / 'src' / 'Gui' / 'Icons' + + if not logo_path.exists(): + print(f"Error: Logo not found at {logo_path}") + sys.exit(1) + + # Create splash screens (600x400 as per spec) + create_splash( + icons_dir / 'kindredcreatesplash.png', + logo_path, + 600, 400, + args.version, + args.freecad_version, + scale=1 + ) + + # Create 2x version for HiDPI + create_splash( + icons_dir / 'kindredcreatesplash_2x.png', + logo_path, + 600, 400, + args.version, + args.freecad_version, + scale=2 + ) + + # Create about image + create_about( + icons_dir / 'kindredcreateabout.png', + logo_path, + 400, 200, + scale=1 + ) + + print("\nSplash screen generation complete!") + +if __name__ == '__main__': + main() diff --git a/resources/branding/kindred-logo.svg b/resources/branding/kindred-logo.svg new file mode 100644 index 0000000000..64d4ea8d9a --- /dev/null +++ b/resources/branding/kindred-logo.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + diff --git a/resources/icons/hicolor/128x128/apps/kindred-create.png b/resources/icons/hicolor/128x128/apps/kindred-create.png new file mode 100644 index 0000000000000000000000000000000000000000..a80ca78828df1f01b02a72b993dd221fc6047ff4 GIT binary patch literal 3931 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 literal 0 HcmV?d00001 diff --git a/resources/icons/hicolor/24x24/apps/kindred-create.png b/resources/icons/hicolor/24x24/apps/kindred-create.png new file mode 100644 index 0000000000000000000000000000000000000000..e353d527c55f249c574e10e85a37f5abc872a9a1 GIT binary patch literal 721 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 DcF3w! literal 0 HcmV?d00001 diff --git a/resources/icons/hicolor/32x32/apps/kindred-create.png b/resources/icons/hicolor/32x32/apps/kindred-create.png new file mode 100644 index 0000000000000000000000000000000000000000..852acb2719db7419fea117dc881d5cfd9bba8fbd GIT binary patch literal 982 zcmV;{11bE8P)#BX8(ysqZ(MgJpG&mGGJl(tj(!DK~hBwZT|K7 z1T15AHB_hwtl8fgXr_&>o4x*cJv0MEMD1-oXV!N-AKjMTA_2e;Gynl91azRyfy*cP z_+T9Gy;!2z0DS#xT$={pn!G#y$F$3Y1>1J_9!X+N->MDr@tPC{q<9o=2m{;GJ8A#V z3A#Nwb0=rUEPOk-jH^oQWoF$JAeroTOo+ofQrjb@v>G0|dd0J_TkPP2b9T^7+z){F zzqe~d_;PCM8v;b6akM?r5nJ1_y6LR|U{~+U;_A31e)_XPuL-xKbS*`dg%s;IN z9VfNUgt*k-x5tWG@fiUCU}*FLa-}PHb87{aI#8}tAOz52u!u*1L%+vr4=UpId@*}2 zZ2znkR z_8Ys`zY-;CKBqig$LT9)y^2;Jy6&ALv!Z_ffH0%wL()_3>!5wqO7YZHxX>x&*KUu;>8)0t7~6NmywUkN^Mx07*qoM6N<$ Eg3=7iGXMYp literal 0 HcmV?d00001 diff --git a/resources/icons/hicolor/48x48/apps/kindred-create.png b/resources/icons/hicolor/48x48/apps/kindred-create.png new file mode 100644 index 0000000000000000000000000000000000000000..5151c6602aa161167b6f4e7e2680d9b80e13047e GIT binary patch literal 1493 zcmV;`1uFW9P)ZeeNdcDvhccegWh{yr!K$=++bY0}^0 z4gy%8cL8BEy*ihETocFHhWmrTU?P)t+(y7u)Q_0q z+qpJYka+-T^jUcIks)G%IU{l2l}$S?0Su#VBY5(m9>~vbq`F-ge5Ep2$;47RaT&o z0*NFHnLX16PuP6H+^nl3E=ouCj(&F64%mcat0tG+3@<`lZbfbtQF*SdvkUi ziiYsr#V`)Gm0`o8k;0w-%loaBXuIwp0Q>)nUH>DUCg&nHJpShaESx`mUS8$_VBNeH z$P!`uArEdu9GYwy&=*o=KZE0C8#`gKL-6HIrL)7i8k0`Xwk+-8g*7 zjg!}$1=W6az8vj0R3he21_ruLX47U2U>N=<0NPZm)u5?%enAFq(Q@w^5CLy|>w(B~ zw;moP>^`C~5#qAt*qKY8Hh``-dL@=VRV0NUo4pc5#hrIG+I09mGjZ{ziUYrtjfM7hJp1AY_3DS|10 zXhLGaU_}OLPC-r?a61^M0}i$X{aF!F=A}Eh?k4><$}|iD5@yc&oVZjMbeE2BB8(GP zogo6JY^Epx3qTZr2Y^E+))=G;<^U7DoR4`R!w57|qbueSze*C%+0gVfRaI0K9iTnb zffIpK0Qj?Tq-Rsn4P_wh6ic2?tXG>TiNlnhpc8{5`007|A>$ef(T_$$jE(VQ&U_!vf z#Lhduhi&lsNF>-g4xax*LBEtl3mhKLP`RdwWV)Av>gsCEG|QA|w0kh$r@^r@Ay13r v$)taso(fQErUI0jsQ{&BDnO~3^a1_`ERIO9DV2@m00000NkvXXu0mjfC%vL; literal 0 HcmV?d00001 diff --git a/resources/icons/hicolor/512x512/apps/kindred-create.png b/resources/icons/hicolor/512x512/apps/kindred-create.png new file mode 100644 index 0000000000000000000000000000000000000000..8769c584cc4089d6716f970a300fd7719eea99ca GIT binary patch literal 16341 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 literal 0 HcmV?d00001 diff --git a/resources/icons/hicolor/64x64/apps/kindred-create.png b/resources/icons/hicolor/64x64/apps/kindred-create.png new file mode 100644 index 0000000000000000000000000000000000000000..9ee90de051cc315e76834b311a6d7892e695881f GIT binary patch literal 1954 zcmV;T2VMAyP)!5HB&_h}CE{r7`t_uqXs-ff#|pF1uSOyE~U1mfe|idHgWDlvdcC zb7tX?bpFYFIGOi(p8xaD`#$gUzUPRl@?M4!Hi58F6Ci8?VWTEM*aX5xO@OcogpHa2 zVG{@&H37mV5H_r^30#R(s$-^Ymu9J2dDC=k*R?L@^Nqu*$4UU{bh^G!FzQ6?Ce?@; zfw*f}r!tv0@rBV%^9s7mCLjlZPh3B)m-c73N`8B>NmVoQTz8Nri08?ON zvSsduAjYB3fJ7pFn<$3?bIa->Hr`vHXbU5baIq-Zt}rxeASg}sO3YH~Bg*us5;2wa zyW{-o@HBuySB-_aTzA$_{LlqRCenLQR&^vD_HVjC)bhvYe8FV-vu#`|383E^%=UiX zkA0|1AdyI~Mp*^0`Til_$pg%6blLEc!q}5Mk!nsa@M9mE03u?FvK`>Abcu)GKN8s2 z#(OW)*60F6T~nU%V;hvc6$z=M0N^L_CptW`O z5>&SVJo>?5mbaIx_W9_Ym;DGHKZwUWS}L)-;R1+=rLOs7gt}QxE?XZQni9XJ0Xx@b zsVmo!xd!%gmDt^I0g~}KUj#lR0z22{XsP$zyId0sW;lHL{&7L&u|#6-q`gJpZBRta z*5>v*6eliXIH*zZOh#OnQO|RRVlgvn+fpauHkqCgLEL5)(qOy*L?2%<%(IW=0>z#P zp2C{%x6;`a1L!lX(Ix%;{e^3d4G);B!=U;IG&B`U41%RMg-F^P?VBW!Vtx%qUu+I zE8I`G%zX0VPF}N%l~CZvi$P3-JH!@eD&of zwyz0%h`S~{g(qKZVbl?Tb0T%WpJ=?VA}Au3hkhMkPSdRaOCBI*#i)2Km-3c9rF{uBJApHVBeTuLDmlro}6%-@g+bqo?Ztm1^Dp1y8{utyL~y+ zqSH`?Cw9lVSe&}G(4Dc^x~B;Mfu9Xz&;D*Qn~DWUCKooT>SlmNtqYjZFe4C2Lkw0g zUWEws)3F zz)ufO=WtK7Dt`dKJ~C~5>qEs`m(TZPDzU3bfYz2dA6L9`ya`~N9$)gsW3mCF#pi%_)38{%;G>94UHAOHwxu-Jm21G3 zmzyX#{tMz;1(O|rZy0}k{zAUzq#yeUvuSOayAtGaC|B>6`ic%%zHr~7j{)WG?T4M0 z6QNKv$X+t&%2=H0w>UjuaW-p_8!^Uif6Calr*XXSWo=it`i(zfE1Zb8|3uJFry6GP z$z_iq)g0ORzubIiUMO`%#h9z@cHRgNh9flfr*{-GrGiN`ms&0_@lb!~X@$^@KEh54v zmOjYr=Gj5wToZfG?C0pYV*s{?w<4SEJ2IsKCc&g7J(KHw8aSk?yn5=d*lzXLSK~NW zIM1>3$HyO^zR}4;1p=t5qrztdibKVVbawq~N&-8c&8sK>f~q2LB$I3Nb(=d?sAyBq zWO|Mw`Za*#7yd*4@Icjp5BL3>{AdB7z{c3-$v6vJiv*8a^Atw9JbTYQ}o*2xveRqoU@r^*Y!s9J+HGx(1;Y_CY zrD}Xk1p*!IqOsC?;5We4`r|y19s6DFjb~2ab2mfsQ04alsZ^>#E;URqT5jpeZ+WgZ zu2iazL?Ti*FwlJ=Xxn-{5c&raVdJLwMkq|w1PGfz*r*8*Hi58F6Ci8?VWTEM*aX5x oO@OcogpHa2VG{@&?|A|K2aW``M2fv!6#xJL07*qoM6N<$g4%b!3IG5A literal 0 HcmV?d00001 diff --git a/resources/icons/hicolor/scalable/apps/kindred-create.svg b/resources/icons/hicolor/scalable/apps/kindred-create.svg new file mode 100644 index 0000000000..64d4ea8d9a --- /dev/null +++ b/resources/icons/hicolor/scalable/apps/kindred-create.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + diff --git a/resources/icons/kindred-create.icns b/resources/icons/kindred-create.icns new file mode 100644 index 0000000000000000000000000000000000000000..0f544abcbcf18e948b0674bab5f9482a24e928be GIT binary patch literal 30648 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 LKw$hoAohO)uW_MY literal 0 HcmV?d00001 diff --git a/resources/icons/kindred-create.ico b/resources/icons/kindred-create.ico new file mode 100644 index 0000000000000000000000000000000000000000..d8df13ebe71ffa6efd836ef3777f89ed6318b45b GIT binary patch literal 109906 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + KindredCreate.qss + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/preferences/KindredCreate/KindredCreate.qss b/resources/preferences/KindredCreate/KindredCreate.qss new file mode 100644 index 0000000000..6ce5343d31 --- /dev/null +++ b/resources/preferences/KindredCreate/KindredCreate.qss @@ -0,0 +1,1229 @@ + +/* ============================================================================= + Catppuccin Mocha Theme for FreeCAD + Bundled with ztools addon + https://catppuccin.com/ + ============================================================================= */ + +/* ============================================================================= + Global Defaults + ============================================================================= */ + +* { + color: #cdd6f4; + font-family: "Segoe UI", "Ubuntu", "Noto Sans", sans-serif; +} + +QWidget { + background-color: #1e1e2e; + color: #cdd6f4; + selection-background-color: #585b70; + selection-color: #cdd6f4; +} + +/* ============================================================================= + Main Window and MDI Area + ============================================================================= */ + +QMainWindow { + background-color: #181825; +} + +QMainWindow::separator { + background-color: #313244; + width: 4px; + height: 4px; +} + +QMainWindow::separator:hover { + background-color: #cba6f7; +} + +QMdiArea { + background-color: #11111b; +} + +QMdiSubWindow { + background-color: #1e1e2e; + border: 1px solid #45475a; +} + +QMdiSubWindow > QWidget { + background-color: #1e1e2e; +} + +/* ============================================================================= + Menu Bar + ============================================================================= */ + +QMenuBar { + background-color: #181825; + color: #cdd6f4; + border-bottom: 1px solid #313244; + padding: 2px; +} + +QMenuBar::item { + background-color: transparent; + padding: 4px 8px; + border-radius: 4px; +} + +QMenuBar::item:selected { + background-color: #313244; +} + +QMenuBar::item:pressed { + background-color: #45475a; +} + +/* ============================================================================= + Menus + ============================================================================= */ + +QMenu { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 6px; + padding: 4px; +} + +QMenu::item { + padding: 6px 24px 6px 8px; + border-radius: 4px; +} + +QMenu::item:selected { + background-color: #45475a; + color: #cdd6f4; +} + +QMenu::item:disabled { + color: #6c7086; +} + +QMenu::separator { + height: 1px; + background-color: #45475a; + margin: 4px 8px; +} + +QMenu::icon { + margin-left: 8px; +} + +QMenu::indicator { + width: 16px; + height: 16px; + margin-left: 4px; +} + +/* ============================================================================= + Toolbars + ============================================================================= */ + +QToolBar { + background-color: #181825; + border: none; + spacing: 2px; + padding: 2px; +} + +QToolBar::handle { + background-color: #45475a; + width: 8px; + margin: 2px; + border-radius: 2px; +} + +QToolBar::handle:horizontal { + width: 8px; +} + +QToolBar::handle:vertical { + height: 8px; +} + +QToolBar::separator { + background-color: #45475a; + width: 1px; + margin: 4px 2px; +} + +/* ============================================================================= + Tool Buttons (Toolbar icons) + ============================================================================= */ + +QToolButton { + background-color: transparent; + border: 1px solid transparent; + border-radius: 4px; + padding: 4px; + margin: 1px; +} + +QToolButton:hover { + background-color: #313244; + border: 1px solid #45475a; +} + +QToolButton:pressed { + background-color: #45475a; +} + +QToolButton:checked { + background-color: #45475a; + border: 1px solid #cba6f7; +} + +QToolButton:disabled { + color: #6c7086; +} + +QToolButton[popupMode="1"] { + padding-right: 16px; +} + +QToolButton::menu-button { + border: none; + width: 14px; +} + +QToolButton::menu-arrow { + width: 10px; + height: 10px; +} + +/* ============================================================================= + Push Buttons + ============================================================================= */ + +QPushButton { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 6px; + padding: 6px 16px; + min-height: 20px; +} + +QPushButton:hover { + background-color: #45475a; + border-color: #585b70; +} + +QPushButton:pressed { + background-color: #585b70; +} + +QPushButton:checked { + background-color: #cba6f7; + color: #11111b; + border-color: #cba6f7; +} + +QPushButton:disabled { + background-color: #313244; + color: #6c7086; + border-color: #313244; +} + +QPushButton:default { + border: 2px solid #cba6f7; +} + +/* ============================================================================= + Dock Widgets + ============================================================================= */ + +QDockWidget { + background-color: #1e1e2e; + color: #cdd6f4; + titlebar-close-icon: none; + titlebar-normal-icon: none; +} + +QDockWidget::title { + background-color: #181825; + color: #cdd6f4; + padding: 6px; + border-bottom: 1px solid #313244; +} + +QDockWidget::close-button, +QDockWidget::float-button { + background-color: transparent; + border: none; + padding: 2px; +} + +QDockWidget::close-button:hover, +QDockWidget::float-button:hover { + background-color: #313244; + border-radius: 4px; +} + +/* ============================================================================= + Tab Widgets + ============================================================================= */ + +QTabWidget::pane { + background-color: #1e1e2e; + border: 1px solid #45475a; + border-radius: 4px; + top: -1px; +} + +QTabBar { + background-color: transparent; +} + +QTabBar::tab { + background-color: #313244; + color: #bac2de; + border: 1px solid #45475a; + padding: 6px 12px; + margin-right: 2px; + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +QTabBar::tab:selected { + background-color: #1e1e2e; + color: #cdd6f4; + border-bottom-color: #1e1e2e; +} + +QTabBar::tab:hover:!selected { + background-color: #45475a; + color: #cdd6f4; +} + +QTabBar::tab:disabled { + color: #6c7086; +} + +QTabBar::close-button { + margin-left: 4px; +} + +QTabBar::close-button:hover { + background-color: #f38ba8; + border-radius: 2px; +} + +/* ============================================================================= + Scroll Bars + ============================================================================= */ + +QScrollBar:horizontal { + background-color: #181825; + height: 12px; + margin: 0 12px 0 12px; + border-radius: 6px; +} + +QScrollBar:vertical { + background-color: #181825; + width: 12px; + margin: 12px 0 12px 0; + border-radius: 6px; +} + +QScrollBar::handle:horizontal { + background-color: #45475a; + min-width: 20px; + border-radius: 5px; + margin: 1px; +} + +QScrollBar::handle:vertical { + background-color: #45475a; + min-height: 20px; + border-radius: 5px; + margin: 1px; +} + +QScrollBar::handle:horizontal:hover, +QScrollBar::handle:vertical:hover { + background-color: #585b70; +} + +QScrollBar::add-line:horizontal, +QScrollBar::sub-line:horizontal, +QScrollBar::add-line:vertical, +QScrollBar::sub-line:vertical { + width: 12px; + height: 12px; + background-color: #313244; + border-radius: 6px; +} + +QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, +QScrollBar::sub-line:vertical:hover { + background-color: #45475a; +} + +QScrollBar::add-page:horizontal, +QScrollBar::sub-page:horizontal, +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical { + background-color: transparent; +} + +/* ============================================================================= + Input Fields + ============================================================================= */ + +QLineEdit { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px 8px; + selection-background-color: #cba6f7; + selection-color: #11111b; +} + +QLineEdit:focus { + border-color: #cba6f7; +} + +QLineEdit:disabled { + background-color: #181825; + color: #6c7086; +} + +QLineEdit:read-only { + background-color: #181825; +} + +QTextEdit, QPlainTextEdit { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + selection-background-color: #cba6f7; + selection-color: #11111b; +} + +QTextEdit:focus, QPlainTextEdit:focus { + border-color: #cba6f7; +} + +/* ============================================================================= + Spin Boxes + ============================================================================= */ + +QSpinBox, QDoubleSpinBox { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px; + padding-right: 20px; +} + +QSpinBox:focus, QDoubleSpinBox:focus { + border-color: #cba6f7; +} + +QSpinBox:disabled, QDoubleSpinBox:disabled { + background-color: #181825; + color: #6c7086; +} + +QSpinBox::up-button, QDoubleSpinBox::up-button { + subcontrol-origin: border; + subcontrol-position: top right; + width: 16px; + border-left: 1px solid #45475a; + border-top-right-radius: 4px; + background-color: #45475a; +} + +QSpinBox::down-button, QDoubleSpinBox::down-button { + subcontrol-origin: border; + subcontrol-position: bottom right; + width: 16px; + border-left: 1px solid #45475a; + border-bottom-right-radius: 4px; + background-color: #45475a; +} + +QSpinBox::up-button:hover, QDoubleSpinBox::up-button:hover, +QSpinBox::down-button:hover, QDoubleSpinBox::down-button:hover { + background-color: #585b70; +} + +QSpinBox::up-button:pressed, QDoubleSpinBox::up-button:pressed, +QSpinBox::down-button:pressed, QDoubleSpinBox::down-button:pressed { + background-color: #cba6f7; +} + +QSpinBox::up-arrow, QDoubleSpinBox::up-arrow { + width: 8px; + height: 8px; +} + +QSpinBox::down-arrow, QDoubleSpinBox::down-arrow { + width: 8px; + height: 8px; +} + +/* ============================================================================= + Combo Boxes + ============================================================================= */ + +QComboBox { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px 8px; + padding-right: 24px; + min-height: 20px; +} + +QComboBox:hover { + border-color: #585b70; +} + +QComboBox:focus { + border-color: #cba6f7; +} + +QComboBox:disabled { + background-color: #181825; + color: #6c7086; +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 20px; + border-left: 1px solid #45475a; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + background-color: #45475a; +} + +QComboBox::drop-down:hover { + background-color: #585b70; +} + +QComboBox::down-arrow { + width: 10px; + height: 10px; +} + +QComboBox QAbstractItemView { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + selection-background-color: #45475a; + selection-color: #cdd6f4; + outline: none; +} + +QComboBox QAbstractItemView::item { + padding: 4px 8px; + min-height: 24px; +} + +QComboBox QAbstractItemView::item:hover { + background-color: #45475a; +} + +QComboBox QAbstractItemView::item:selected { + background-color: #585b70; +} + +/* ============================================================================= + Check Boxes + ============================================================================= */ + +QCheckBox { + spacing: 8px; + color: #cdd6f4; +} + +QCheckBox:disabled { + color: #6c7086; +} + +QCheckBox::indicator { + width: 18px; + height: 18px; + border: 2px solid #585b70; + border-radius: 4px; + background-color: #313244; +} + +QCheckBox::indicator:hover { + border-color: #cba6f7; +} + +QCheckBox::indicator:checked { + background-color: #cba6f7; + border-color: #cba6f7; +} + +QCheckBox::indicator:checked:disabled { + background-color: #6c7086; + border-color: #6c7086; +} + +QCheckBox::indicator:disabled { + background-color: #181825; + border-color: #45475a; +} + +/* ============================================================================= + Radio Buttons + ============================================================================= */ + +QRadioButton { + spacing: 8px; + color: #cdd6f4; +} + +QRadioButton:disabled { + color: #6c7086; +} + +QRadioButton::indicator { + width: 18px; + height: 18px; + border: 2px solid #585b70; + border-radius: 9px; + background-color: #313244; +} + +QRadioButton::indicator:hover { + border-color: #cba6f7; +} + +QRadioButton::indicator:checked { + background-color: #cba6f7; + border-color: #cba6f7; +} + +QRadioButton::indicator:checked:disabled { + background-color: #6c7086; + border-color: #6c7086; +} + +QRadioButton::indicator:disabled { + background-color: #181825; + border-color: #45475a; +} + +/* ============================================================================= + Sliders + ============================================================================= */ + +QSlider::groove:horizontal { + height: 6px; + background-color: #45475a; + border-radius: 3px; +} + +QSlider::groove:vertical { + width: 6px; + background-color: #45475a; + border-radius: 3px; +} + +QSlider::handle:horizontal { + width: 16px; + height: 16px; + margin: -5px 0; + background-color: #cba6f7; + border-radius: 8px; +} + +QSlider::handle:vertical { + width: 16px; + height: 16px; + margin: 0 -5px; + background-color: #cba6f7; + border-radius: 8px; +} + +QSlider::handle:horizontal:hover, +QSlider::handle:vertical:hover { + background-color: #b4befe; +} + +QSlider::handle:horizontal:pressed, +QSlider::handle:vertical:pressed { + background-color: #f5c2e7; +} + +QSlider::sub-page:horizontal { + background-color: #cba6f7; + border-radius: 3px; +} + +QSlider::add-page:vertical { + background-color: #cba6f7; + border-radius: 3px; +} + +/* ============================================================================= + Progress Bars + ============================================================================= */ + +QProgressBar { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + text-align: center; + height: 20px; +} + +QProgressBar::chunk { + background-color: #cba6f7; + border-radius: 3px; +} + +/* ============================================================================= + Group Boxes + ============================================================================= */ + +QGroupBox { + background-color: #1e1e2e; + border: 1px solid #45475a; + border-radius: 6px; + margin-top: 12px; + padding-top: 8px; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + left: 12px; + padding: 0 4px; + color: #bac2de; + background-color: #1e1e2e; +} + +/* ============================================================================= + Tree View + ============================================================================= */ + +QTreeView { + background-color: #1e1e2e; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + outline: none; + show-decoration-selected: 1; +} + +QTreeView::item { + padding: 4px; + border-radius: 2px; +} + +QTreeView::item:hover { + background-color: #313244; +} + +QTreeView::item:selected { + background-color: #45475a; + color: #cdd6f4; +} + +QTreeView::item:selected:active { + background-color: #585b70; +} + +QTreeView::branch { + background-color: transparent; +} + +QTreeView::branch:hover { + background-color: #313244; +} + +QTreeView::branch:selected { + background-color: #45475a; +} + +/* ============================================================================= + List View + ============================================================================= */ + +QListView { + background-color: #1e1e2e; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + outline: none; +} + +QListView::item { + padding: 4px; + border-radius: 2px; +} + +QListView::item:hover { + background-color: #313244; +} + +QListView::item:selected { + background-color: #45475a; + color: #cdd6f4; +} + +/* ============================================================================= + Table View + ============================================================================= */ + +QTableView { + background-color: #1e1e2e; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + gridline-color: #313244; + outline: none; +} + +QTableView::item { + padding: 4px; +} + +QTableView::item:hover { + background-color: #313244; +} + +QTableView::item:selected { + background-color: #45475a; + color: #cdd6f4; +} + +QTableView QTableCornerButton::section { + background-color: #313244; + border: 1px solid #45475a; +} + +/* ============================================================================= + Header Views (for Tables/Trees) + ============================================================================= */ + +QHeaderView { + background-color: #313244; + border: none; +} + +QHeaderView::section { + background-color: #313244; + color: #bac2de; + border: none; + border-right: 1px solid #45475a; + border-bottom: 1px solid #45475a; + padding: 6px 8px; +} + +QHeaderView::section:hover { + background-color: #45475a; + color: #cdd6f4; +} + +QHeaderView::section:checked { + background-color: #45475a; +} + +QHeaderView::down-arrow { + width: 10px; + height: 10px; +} + +QHeaderView::up-arrow { + width: 10px; + height: 10px; +} + +/* ============================================================================= + Splitters + ============================================================================= */ + +QSplitter::handle { + background-color: #313244; +} + +QSplitter::handle:horizontal { + width: 4px; +} + +QSplitter::handle:vertical { + height: 4px; +} + +QSplitter::handle:hover { + background-color: #cba6f7; +} + +/* ============================================================================= + Status Bar + ============================================================================= */ + +QStatusBar { + background-color: #181825; + color: #bac2de; + border-top: 1px solid #313244; +} + +QStatusBar::item { + border: none; +} + +QStatusBar QLabel { + padding: 2px 8px; +} + +/* ============================================================================= + Tooltips + ============================================================================= */ + +QToolTip { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px 8px; +} + +/* ============================================================================= + Labels + ============================================================================= */ + +QLabel { + color: #cdd6f4; + background-color: transparent; +} + +QLabel:disabled { + color: #6c7086; +} + +/* ============================================================================= + Frames + ============================================================================= */ + +QFrame { + border: none; +} + +QFrame[frameShape="4"] { + /* HLine */ + background-color: #45475a; + max-height: 1px; +} + +QFrame[frameShape="5"] { + /* VLine */ + background-color: #45475a; + max-width: 1px; +} + +/* ============================================================================= + Tool Box (Collapsible sections) + ============================================================================= */ + +QToolBox { + background-color: #1e1e2e; + border: 1px solid #45475a; + border-radius: 4px; +} + +QToolBox::tab { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 8px; +} + +QToolBox::tab:selected { + background-color: #45475a; + border-color: #cba6f7; +} + +QToolBox::tab:hover { + background-color: #45475a; +} + +/* ============================================================================= + Dialog Buttons + ============================================================================= */ + +QDialogButtonBox { + button-layout: 0; +} + +/* ============================================================================= + Date/Time Edits + ============================================================================= */ + +QDateEdit, QTimeEdit, QDateTimeEdit { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px; +} + +QDateEdit:focus, QTimeEdit:focus, QDateTimeEdit:focus { + border-color: #cba6f7; +} + +QDateEdit::drop-down, QTimeEdit::drop-down, QDateTimeEdit::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 20px; + border-left: 1px solid #45475a; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + background-color: #45475a; +} + +QCalendarWidget { + background-color: #1e1e2e; +} + +QCalendarWidget QToolButton { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + margin: 2px; +} + +QCalendarWidget QToolButton:hover { + background-color: #45475a; +} + +QCalendarWidget QMenu { + background-color: #313244; +} + +QCalendarWidget QSpinBox { + background-color: #313244; +} + +QCalendarWidget QAbstractItemView { + background-color: #1e1e2e; + selection-background-color: #cba6f7; + selection-color: #11111b; +} + +/* ============================================================================= + Wizard + ============================================================================= */ + +QWizard { + background-color: #1e1e2e; +} + +QWizard QLabel { + color: #cdd6f4; +} + +/* ============================================================================= + FreeCAD Specific Widgets + ============================================================================= */ + +/* Property Editor */ +Gui--PropertyEditor--PropertyEditor { + background-color: #1e1e2e; + color: #cdd6f4; + border: 1px solid #45475a; + qproperty-groupBackground: #313244; + qproperty-groupTextColor: #bac2de; + qproperty-itemBackground: #1e1e2e; +} + +Gui--PropertyEditor--PropertyEditor QLineEdit { + background-color: #313244; + border: 1px solid #45475a; +} + +Gui--PropertyEditor--PropertyEditor QComboBox { + background-color: #313244; +} + +/* Color Button */ +Gui--ColorButton { + background-color: #313244; + border: 1px solid #45475a; + border-radius: 4px; + padding: 2px; +} + +Gui--ColorButton:hover { + border-color: #cba6f7; +} + +/* Workbench Selector */ +Gui--WorkbenchComboBox { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px 8px; +} + +Gui--WorkbenchComboBox:hover { + border-color: #585b70; +} + +Gui--WorkbenchComboBox::drop-down { + background-color: #45475a; + border-left: 1px solid #45475a; + border-radius: 0 4px 4px 0; +} + +/* Task Panel */ +QSint--ActionGroup { + background-color: #313244; + border: 1px solid #45475a; + border-radius: 6px; +} + +QSint--ActionGroup QToolButton { + background-color: #313244; + color: #cdd6f4; + border: none; + border-radius: 4px; + padding: 6px; +} + +QSint--ActionGroup QToolButton:hover { + background-color: #45475a; +} + +QSint--ActionGroup QFrame { + background-color: #1e1e2e; + border: none; + border-radius: 4px; +} + +/* Input Field */ +Gui--InputField { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; +} + +Gui--InputField:focus { + border-color: #cba6f7; +} + +/* Expression Completer */ +Gui--ExpressionCompleter { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; +} + +/* Spreadsheet */ +SpreadsheetGui--SheetTableView { + background-color: #1e1e2e; + color: #cdd6f4; + gridline-color: #45475a; + selection-background-color: #45475a; + selection-color: #cdd6f4; +} + +SpreadsheetGui--SheetTableView QHeaderView::section { + background-color: #313244; + color: #bac2de; + border: 1px solid #45475a; + padding: 4px; +} + +/* Python Console */ +Gui--PythonConsole { + background-color: #11111b; + color: #cdd6f4; + font-family: "JetBrains Mono", "Fira Code", "Consolas", monospace; + selection-background-color: #45475a; +} + +/* Python Editor */ +Gui--PythonEditor { + background-color: #11111b; + color: #cdd6f4; + font-family: "JetBrains Mono", "Fira Code", "Consolas", monospace; + selection-background-color: #cba6f7; + selection-color: #11111b; +} + +/* Report View */ +Gui--DockWnd--ReportOutput { + background-color: #11111b; + color: #cdd6f4; + font-family: "JetBrains Mono", "Fira Code", "Consolas", monospace; +} + +/* DAG View */ +Gui--DAG--Model { + background-color: #1e1e2e; +} + +/* ============================================================================= + Sketcher Specific Styles + ============================================================================= */ + +/* Sketcher constraint colors are handled via preferences, not QSS */ + +/* ============================================================================= + Syntax Highlighting Colors (Python Editor) + Note: These are typically set via FreeCAD preferences, but we define them here + for reference and any widgets that support them. + ============================================================================= */ + +/* + Python Editor Syntax Colors (Catppuccin Mocha): + - Comment: #7f849c + - Number: #fab387 + - String: #a6e3a1 + - Keyword: #cba6f7 + - Class/Def name: #89b4fa + - Operator: #89dceb + - Output: #cdd6f4 + - Error: #f38ba8 +*/ + +/* ============================================================================= + Custom Color Accents by Context + ============================================================================= */ + +/* Success states */ +*[state="success"] { + color: #a6e3a1; +} + +/* Warning states */ +*[state="warning"] { + color: #f9e2af; +} + +/* Error states */ +*[state="error"] { + color: #f38ba8; +} + +/* Info states */ +*[state="info"] { + color: #89b4fa; +} diff --git a/resources/preferences/package.xml b/resources/preferences/package.xml new file mode 100644 index 0000000000..263ed8059c --- /dev/null +++ b/resources/preferences/package.xml @@ -0,0 +1,18 @@ + + + + Kindred Create Preference Packs + Default preference packs for Kindred Create, featuring the Catppuccin Mocha color theme. + 0.1.0 + Kindred Systems LLC + LGPL-2.1-or-later + https://kindredsystems.net + + + + KindredCreate + The default Kindred Create theme based on Catppuccin Mocha - a soothing dark color palette. + + + + diff --git a/src/Gui/Dialogs/DlgAbout.cpp b/src/Gui/Dialogs/DlgAbout.cpp index 4b173a69f7..2dc0d31f1c 100644 --- a/src/Gui/Dialogs/DlgAbout.cpp +++ b/src/Gui/Dialogs/DlgAbout.cpp @@ -328,9 +328,14 @@ void AboutDialog::showCredits() //: Header for the Credits tab of the About screen QString creditsHTML - = QStringLiteral("

%1

%2

%3

    ") + = QStringLiteral("

    %1

    " + "

    Kindred Systems LLC

    " + "

    Kindred Create is developed by Kindred Systems LLC, Kansas City, Missouri.
    " + "Website:
    https://kindredsystems.net

    " + "

    FreeCAD Project

    " + "

    %2

    %3

      ") .arg(tr("Credits", "Header for the Credits tab of the About screen")) - .arg(tr("FreeCAD would not be possible without the contributions of:")) + .arg(tr("Kindred Create is based on FreeCAD and would not be possible without the contributions of:")) .arg(tr("Individuals", "Header for the list of individual people in the Credits list.")); QTextStream stream(&creditsFile); diff --git a/src/Gui/Icons/resource.qrc b/src/Gui/Icons/resource.qrc index 8f0c617fed..490b3c1ffa 100644 --- a/src/Gui/Icons/resource.qrc +++ b/src/Gui/Icons/resource.qrc @@ -122,6 +122,10 @@ freecadsplash8.png freecadsplash9_2x.png freecadsplash9.png + kindred-create.svg + kindredcreateabout.png + kindredcreatesplash.png + kindredcreatesplash_2x.png Geoassembly.svg Geofeaturegroup.svg Group.svg diff --git a/src/Gui/PreferencePacks/CMakeLists.txt b/src/Gui/PreferencePacks/CMakeLists.txt index c0d86a98e9..64f2092426 100644 --- a/src/Gui/PreferencePacks/CMakeLists.txt +++ b/src/Gui/PreferencePacks/CMakeLists.txt @@ -3,6 +3,7 @@ SET(PreferencePacks_Files ) SET(PreferencePacks_Directories + "KindredCreate" "FreeCAD Classic" "Dark behave" "FreeCAD Light" diff --git a/src/Gui/PreferencePacks/KindredCreate/KindredCreate.qss b/src/Gui/PreferencePacks/KindredCreate/KindredCreate.qss new file mode 100644 index 0000000000..6ce5343d31 --- /dev/null +++ b/src/Gui/PreferencePacks/KindredCreate/KindredCreate.qss @@ -0,0 +1,1229 @@ + +/* ============================================================================= + Catppuccin Mocha Theme for FreeCAD + Bundled with ztools addon + https://catppuccin.com/ + ============================================================================= */ + +/* ============================================================================= + Global Defaults + ============================================================================= */ + +* { + color: #cdd6f4; + font-family: "Segoe UI", "Ubuntu", "Noto Sans", sans-serif; +} + +QWidget { + background-color: #1e1e2e; + color: #cdd6f4; + selection-background-color: #585b70; + selection-color: #cdd6f4; +} + +/* ============================================================================= + Main Window and MDI Area + ============================================================================= */ + +QMainWindow { + background-color: #181825; +} + +QMainWindow::separator { + background-color: #313244; + width: 4px; + height: 4px; +} + +QMainWindow::separator:hover { + background-color: #cba6f7; +} + +QMdiArea { + background-color: #11111b; +} + +QMdiSubWindow { + background-color: #1e1e2e; + border: 1px solid #45475a; +} + +QMdiSubWindow > QWidget { + background-color: #1e1e2e; +} + +/* ============================================================================= + Menu Bar + ============================================================================= */ + +QMenuBar { + background-color: #181825; + color: #cdd6f4; + border-bottom: 1px solid #313244; + padding: 2px; +} + +QMenuBar::item { + background-color: transparent; + padding: 4px 8px; + border-radius: 4px; +} + +QMenuBar::item:selected { + background-color: #313244; +} + +QMenuBar::item:pressed { + background-color: #45475a; +} + +/* ============================================================================= + Menus + ============================================================================= */ + +QMenu { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 6px; + padding: 4px; +} + +QMenu::item { + padding: 6px 24px 6px 8px; + border-radius: 4px; +} + +QMenu::item:selected { + background-color: #45475a; + color: #cdd6f4; +} + +QMenu::item:disabled { + color: #6c7086; +} + +QMenu::separator { + height: 1px; + background-color: #45475a; + margin: 4px 8px; +} + +QMenu::icon { + margin-left: 8px; +} + +QMenu::indicator { + width: 16px; + height: 16px; + margin-left: 4px; +} + +/* ============================================================================= + Toolbars + ============================================================================= */ + +QToolBar { + background-color: #181825; + border: none; + spacing: 2px; + padding: 2px; +} + +QToolBar::handle { + background-color: #45475a; + width: 8px; + margin: 2px; + border-radius: 2px; +} + +QToolBar::handle:horizontal { + width: 8px; +} + +QToolBar::handle:vertical { + height: 8px; +} + +QToolBar::separator { + background-color: #45475a; + width: 1px; + margin: 4px 2px; +} + +/* ============================================================================= + Tool Buttons (Toolbar icons) + ============================================================================= */ + +QToolButton { + background-color: transparent; + border: 1px solid transparent; + border-radius: 4px; + padding: 4px; + margin: 1px; +} + +QToolButton:hover { + background-color: #313244; + border: 1px solid #45475a; +} + +QToolButton:pressed { + background-color: #45475a; +} + +QToolButton:checked { + background-color: #45475a; + border: 1px solid #cba6f7; +} + +QToolButton:disabled { + color: #6c7086; +} + +QToolButton[popupMode="1"] { + padding-right: 16px; +} + +QToolButton::menu-button { + border: none; + width: 14px; +} + +QToolButton::menu-arrow { + width: 10px; + height: 10px; +} + +/* ============================================================================= + Push Buttons + ============================================================================= */ + +QPushButton { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 6px; + padding: 6px 16px; + min-height: 20px; +} + +QPushButton:hover { + background-color: #45475a; + border-color: #585b70; +} + +QPushButton:pressed { + background-color: #585b70; +} + +QPushButton:checked { + background-color: #cba6f7; + color: #11111b; + border-color: #cba6f7; +} + +QPushButton:disabled { + background-color: #313244; + color: #6c7086; + border-color: #313244; +} + +QPushButton:default { + border: 2px solid #cba6f7; +} + +/* ============================================================================= + Dock Widgets + ============================================================================= */ + +QDockWidget { + background-color: #1e1e2e; + color: #cdd6f4; + titlebar-close-icon: none; + titlebar-normal-icon: none; +} + +QDockWidget::title { + background-color: #181825; + color: #cdd6f4; + padding: 6px; + border-bottom: 1px solid #313244; +} + +QDockWidget::close-button, +QDockWidget::float-button { + background-color: transparent; + border: none; + padding: 2px; +} + +QDockWidget::close-button:hover, +QDockWidget::float-button:hover { + background-color: #313244; + border-radius: 4px; +} + +/* ============================================================================= + Tab Widgets + ============================================================================= */ + +QTabWidget::pane { + background-color: #1e1e2e; + border: 1px solid #45475a; + border-radius: 4px; + top: -1px; +} + +QTabBar { + background-color: transparent; +} + +QTabBar::tab { + background-color: #313244; + color: #bac2de; + border: 1px solid #45475a; + padding: 6px 12px; + margin-right: 2px; + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +QTabBar::tab:selected { + background-color: #1e1e2e; + color: #cdd6f4; + border-bottom-color: #1e1e2e; +} + +QTabBar::tab:hover:!selected { + background-color: #45475a; + color: #cdd6f4; +} + +QTabBar::tab:disabled { + color: #6c7086; +} + +QTabBar::close-button { + margin-left: 4px; +} + +QTabBar::close-button:hover { + background-color: #f38ba8; + border-radius: 2px; +} + +/* ============================================================================= + Scroll Bars + ============================================================================= */ + +QScrollBar:horizontal { + background-color: #181825; + height: 12px; + margin: 0 12px 0 12px; + border-radius: 6px; +} + +QScrollBar:vertical { + background-color: #181825; + width: 12px; + margin: 12px 0 12px 0; + border-radius: 6px; +} + +QScrollBar::handle:horizontal { + background-color: #45475a; + min-width: 20px; + border-radius: 5px; + margin: 1px; +} + +QScrollBar::handle:vertical { + background-color: #45475a; + min-height: 20px; + border-radius: 5px; + margin: 1px; +} + +QScrollBar::handle:horizontal:hover, +QScrollBar::handle:vertical:hover { + background-color: #585b70; +} + +QScrollBar::add-line:horizontal, +QScrollBar::sub-line:horizontal, +QScrollBar::add-line:vertical, +QScrollBar::sub-line:vertical { + width: 12px; + height: 12px; + background-color: #313244; + border-radius: 6px; +} + +QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, +QScrollBar::sub-line:vertical:hover { + background-color: #45475a; +} + +QScrollBar::add-page:horizontal, +QScrollBar::sub-page:horizontal, +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical { + background-color: transparent; +} + +/* ============================================================================= + Input Fields + ============================================================================= */ + +QLineEdit { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px 8px; + selection-background-color: #cba6f7; + selection-color: #11111b; +} + +QLineEdit:focus { + border-color: #cba6f7; +} + +QLineEdit:disabled { + background-color: #181825; + color: #6c7086; +} + +QLineEdit:read-only { + background-color: #181825; +} + +QTextEdit, QPlainTextEdit { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + selection-background-color: #cba6f7; + selection-color: #11111b; +} + +QTextEdit:focus, QPlainTextEdit:focus { + border-color: #cba6f7; +} + +/* ============================================================================= + Spin Boxes + ============================================================================= */ + +QSpinBox, QDoubleSpinBox { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px; + padding-right: 20px; +} + +QSpinBox:focus, QDoubleSpinBox:focus { + border-color: #cba6f7; +} + +QSpinBox:disabled, QDoubleSpinBox:disabled { + background-color: #181825; + color: #6c7086; +} + +QSpinBox::up-button, QDoubleSpinBox::up-button { + subcontrol-origin: border; + subcontrol-position: top right; + width: 16px; + border-left: 1px solid #45475a; + border-top-right-radius: 4px; + background-color: #45475a; +} + +QSpinBox::down-button, QDoubleSpinBox::down-button { + subcontrol-origin: border; + subcontrol-position: bottom right; + width: 16px; + border-left: 1px solid #45475a; + border-bottom-right-radius: 4px; + background-color: #45475a; +} + +QSpinBox::up-button:hover, QDoubleSpinBox::up-button:hover, +QSpinBox::down-button:hover, QDoubleSpinBox::down-button:hover { + background-color: #585b70; +} + +QSpinBox::up-button:pressed, QDoubleSpinBox::up-button:pressed, +QSpinBox::down-button:pressed, QDoubleSpinBox::down-button:pressed { + background-color: #cba6f7; +} + +QSpinBox::up-arrow, QDoubleSpinBox::up-arrow { + width: 8px; + height: 8px; +} + +QSpinBox::down-arrow, QDoubleSpinBox::down-arrow { + width: 8px; + height: 8px; +} + +/* ============================================================================= + Combo Boxes + ============================================================================= */ + +QComboBox { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px 8px; + padding-right: 24px; + min-height: 20px; +} + +QComboBox:hover { + border-color: #585b70; +} + +QComboBox:focus { + border-color: #cba6f7; +} + +QComboBox:disabled { + background-color: #181825; + color: #6c7086; +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 20px; + border-left: 1px solid #45475a; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + background-color: #45475a; +} + +QComboBox::drop-down:hover { + background-color: #585b70; +} + +QComboBox::down-arrow { + width: 10px; + height: 10px; +} + +QComboBox QAbstractItemView { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + selection-background-color: #45475a; + selection-color: #cdd6f4; + outline: none; +} + +QComboBox QAbstractItemView::item { + padding: 4px 8px; + min-height: 24px; +} + +QComboBox QAbstractItemView::item:hover { + background-color: #45475a; +} + +QComboBox QAbstractItemView::item:selected { + background-color: #585b70; +} + +/* ============================================================================= + Check Boxes + ============================================================================= */ + +QCheckBox { + spacing: 8px; + color: #cdd6f4; +} + +QCheckBox:disabled { + color: #6c7086; +} + +QCheckBox::indicator { + width: 18px; + height: 18px; + border: 2px solid #585b70; + border-radius: 4px; + background-color: #313244; +} + +QCheckBox::indicator:hover { + border-color: #cba6f7; +} + +QCheckBox::indicator:checked { + background-color: #cba6f7; + border-color: #cba6f7; +} + +QCheckBox::indicator:checked:disabled { + background-color: #6c7086; + border-color: #6c7086; +} + +QCheckBox::indicator:disabled { + background-color: #181825; + border-color: #45475a; +} + +/* ============================================================================= + Radio Buttons + ============================================================================= */ + +QRadioButton { + spacing: 8px; + color: #cdd6f4; +} + +QRadioButton:disabled { + color: #6c7086; +} + +QRadioButton::indicator { + width: 18px; + height: 18px; + border: 2px solid #585b70; + border-radius: 9px; + background-color: #313244; +} + +QRadioButton::indicator:hover { + border-color: #cba6f7; +} + +QRadioButton::indicator:checked { + background-color: #cba6f7; + border-color: #cba6f7; +} + +QRadioButton::indicator:checked:disabled { + background-color: #6c7086; + border-color: #6c7086; +} + +QRadioButton::indicator:disabled { + background-color: #181825; + border-color: #45475a; +} + +/* ============================================================================= + Sliders + ============================================================================= */ + +QSlider::groove:horizontal { + height: 6px; + background-color: #45475a; + border-radius: 3px; +} + +QSlider::groove:vertical { + width: 6px; + background-color: #45475a; + border-radius: 3px; +} + +QSlider::handle:horizontal { + width: 16px; + height: 16px; + margin: -5px 0; + background-color: #cba6f7; + border-radius: 8px; +} + +QSlider::handle:vertical { + width: 16px; + height: 16px; + margin: 0 -5px; + background-color: #cba6f7; + border-radius: 8px; +} + +QSlider::handle:horizontal:hover, +QSlider::handle:vertical:hover { + background-color: #b4befe; +} + +QSlider::handle:horizontal:pressed, +QSlider::handle:vertical:pressed { + background-color: #f5c2e7; +} + +QSlider::sub-page:horizontal { + background-color: #cba6f7; + border-radius: 3px; +} + +QSlider::add-page:vertical { + background-color: #cba6f7; + border-radius: 3px; +} + +/* ============================================================================= + Progress Bars + ============================================================================= */ + +QProgressBar { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + text-align: center; + height: 20px; +} + +QProgressBar::chunk { + background-color: #cba6f7; + border-radius: 3px; +} + +/* ============================================================================= + Group Boxes + ============================================================================= */ + +QGroupBox { + background-color: #1e1e2e; + border: 1px solid #45475a; + border-radius: 6px; + margin-top: 12px; + padding-top: 8px; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + left: 12px; + padding: 0 4px; + color: #bac2de; + background-color: #1e1e2e; +} + +/* ============================================================================= + Tree View + ============================================================================= */ + +QTreeView { + background-color: #1e1e2e; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + outline: none; + show-decoration-selected: 1; +} + +QTreeView::item { + padding: 4px; + border-radius: 2px; +} + +QTreeView::item:hover { + background-color: #313244; +} + +QTreeView::item:selected { + background-color: #45475a; + color: #cdd6f4; +} + +QTreeView::item:selected:active { + background-color: #585b70; +} + +QTreeView::branch { + background-color: transparent; +} + +QTreeView::branch:hover { + background-color: #313244; +} + +QTreeView::branch:selected { + background-color: #45475a; +} + +/* ============================================================================= + List View + ============================================================================= */ + +QListView { + background-color: #1e1e2e; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + outline: none; +} + +QListView::item { + padding: 4px; + border-radius: 2px; +} + +QListView::item:hover { + background-color: #313244; +} + +QListView::item:selected { + background-color: #45475a; + color: #cdd6f4; +} + +/* ============================================================================= + Table View + ============================================================================= */ + +QTableView { + background-color: #1e1e2e; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + gridline-color: #313244; + outline: none; +} + +QTableView::item { + padding: 4px; +} + +QTableView::item:hover { + background-color: #313244; +} + +QTableView::item:selected { + background-color: #45475a; + color: #cdd6f4; +} + +QTableView QTableCornerButton::section { + background-color: #313244; + border: 1px solid #45475a; +} + +/* ============================================================================= + Header Views (for Tables/Trees) + ============================================================================= */ + +QHeaderView { + background-color: #313244; + border: none; +} + +QHeaderView::section { + background-color: #313244; + color: #bac2de; + border: none; + border-right: 1px solid #45475a; + border-bottom: 1px solid #45475a; + padding: 6px 8px; +} + +QHeaderView::section:hover { + background-color: #45475a; + color: #cdd6f4; +} + +QHeaderView::section:checked { + background-color: #45475a; +} + +QHeaderView::down-arrow { + width: 10px; + height: 10px; +} + +QHeaderView::up-arrow { + width: 10px; + height: 10px; +} + +/* ============================================================================= + Splitters + ============================================================================= */ + +QSplitter::handle { + background-color: #313244; +} + +QSplitter::handle:horizontal { + width: 4px; +} + +QSplitter::handle:vertical { + height: 4px; +} + +QSplitter::handle:hover { + background-color: #cba6f7; +} + +/* ============================================================================= + Status Bar + ============================================================================= */ + +QStatusBar { + background-color: #181825; + color: #bac2de; + border-top: 1px solid #313244; +} + +QStatusBar::item { + border: none; +} + +QStatusBar QLabel { + padding: 2px 8px; +} + +/* ============================================================================= + Tooltips + ============================================================================= */ + +QToolTip { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px 8px; +} + +/* ============================================================================= + Labels + ============================================================================= */ + +QLabel { + color: #cdd6f4; + background-color: transparent; +} + +QLabel:disabled { + color: #6c7086; +} + +/* ============================================================================= + Frames + ============================================================================= */ + +QFrame { + border: none; +} + +QFrame[frameShape="4"] { + /* HLine */ + background-color: #45475a; + max-height: 1px; +} + +QFrame[frameShape="5"] { + /* VLine */ + background-color: #45475a; + max-width: 1px; +} + +/* ============================================================================= + Tool Box (Collapsible sections) + ============================================================================= */ + +QToolBox { + background-color: #1e1e2e; + border: 1px solid #45475a; + border-radius: 4px; +} + +QToolBox::tab { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 8px; +} + +QToolBox::tab:selected { + background-color: #45475a; + border-color: #cba6f7; +} + +QToolBox::tab:hover { + background-color: #45475a; +} + +/* ============================================================================= + Dialog Buttons + ============================================================================= */ + +QDialogButtonBox { + button-layout: 0; +} + +/* ============================================================================= + Date/Time Edits + ============================================================================= */ + +QDateEdit, QTimeEdit, QDateTimeEdit { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px; +} + +QDateEdit:focus, QTimeEdit:focus, QDateTimeEdit:focus { + border-color: #cba6f7; +} + +QDateEdit::drop-down, QTimeEdit::drop-down, QDateTimeEdit::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 20px; + border-left: 1px solid #45475a; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + background-color: #45475a; +} + +QCalendarWidget { + background-color: #1e1e2e; +} + +QCalendarWidget QToolButton { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + margin: 2px; +} + +QCalendarWidget QToolButton:hover { + background-color: #45475a; +} + +QCalendarWidget QMenu { + background-color: #313244; +} + +QCalendarWidget QSpinBox { + background-color: #313244; +} + +QCalendarWidget QAbstractItemView { + background-color: #1e1e2e; + selection-background-color: #cba6f7; + selection-color: #11111b; +} + +/* ============================================================================= + Wizard + ============================================================================= */ + +QWizard { + background-color: #1e1e2e; +} + +QWizard QLabel { + color: #cdd6f4; +} + +/* ============================================================================= + FreeCAD Specific Widgets + ============================================================================= */ + +/* Property Editor */ +Gui--PropertyEditor--PropertyEditor { + background-color: #1e1e2e; + color: #cdd6f4; + border: 1px solid #45475a; + qproperty-groupBackground: #313244; + qproperty-groupTextColor: #bac2de; + qproperty-itemBackground: #1e1e2e; +} + +Gui--PropertyEditor--PropertyEditor QLineEdit { + background-color: #313244; + border: 1px solid #45475a; +} + +Gui--PropertyEditor--PropertyEditor QComboBox { + background-color: #313244; +} + +/* Color Button */ +Gui--ColorButton { + background-color: #313244; + border: 1px solid #45475a; + border-radius: 4px; + padding: 2px; +} + +Gui--ColorButton:hover { + border-color: #cba6f7; +} + +/* Workbench Selector */ +Gui--WorkbenchComboBox { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; + padding: 4px 8px; +} + +Gui--WorkbenchComboBox:hover { + border-color: #585b70; +} + +Gui--WorkbenchComboBox::drop-down { + background-color: #45475a; + border-left: 1px solid #45475a; + border-radius: 0 4px 4px 0; +} + +/* Task Panel */ +QSint--ActionGroup { + background-color: #313244; + border: 1px solid #45475a; + border-radius: 6px; +} + +QSint--ActionGroup QToolButton { + background-color: #313244; + color: #cdd6f4; + border: none; + border-radius: 4px; + padding: 6px; +} + +QSint--ActionGroup QToolButton:hover { + background-color: #45475a; +} + +QSint--ActionGroup QFrame { + background-color: #1e1e2e; + border: none; + border-radius: 4px; +} + +/* Input Field */ +Gui--InputField { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; + border-radius: 4px; +} + +Gui--InputField:focus { + border-color: #cba6f7; +} + +/* Expression Completer */ +Gui--ExpressionCompleter { + background-color: #313244; + color: #cdd6f4; + border: 1px solid #45475a; +} + +/* Spreadsheet */ +SpreadsheetGui--SheetTableView { + background-color: #1e1e2e; + color: #cdd6f4; + gridline-color: #45475a; + selection-background-color: #45475a; + selection-color: #cdd6f4; +} + +SpreadsheetGui--SheetTableView QHeaderView::section { + background-color: #313244; + color: #bac2de; + border: 1px solid #45475a; + padding: 4px; +} + +/* Python Console */ +Gui--PythonConsole { + background-color: #11111b; + color: #cdd6f4; + font-family: "JetBrains Mono", "Fira Code", "Consolas", monospace; + selection-background-color: #45475a; +} + +/* Python Editor */ +Gui--PythonEditor { + background-color: #11111b; + color: #cdd6f4; + font-family: "JetBrains Mono", "Fira Code", "Consolas", monospace; + selection-background-color: #cba6f7; + selection-color: #11111b; +} + +/* Report View */ +Gui--DockWnd--ReportOutput { + background-color: #11111b; + color: #cdd6f4; + font-family: "JetBrains Mono", "Fira Code", "Consolas", monospace; +} + +/* DAG View */ +Gui--DAG--Model { + background-color: #1e1e2e; +} + +/* ============================================================================= + Sketcher Specific Styles + ============================================================================= */ + +/* Sketcher constraint colors are handled via preferences, not QSS */ + +/* ============================================================================= + Syntax Highlighting Colors (Python Editor) + Note: These are typically set via FreeCAD preferences, but we define them here + for reference and any widgets that support them. + ============================================================================= */ + +/* + Python Editor Syntax Colors (Catppuccin Mocha): + - Comment: #7f849c + - Number: #fab387 + - String: #a6e3a1 + - Keyword: #cba6f7 + - Class/Def name: #89b4fa + - Operator: #89dceb + - Output: #cdd6f4 + - Error: #f38ba8 +*/ + +/* ============================================================================= + Custom Color Accents by Context + ============================================================================= */ + +/* Success states */ +*[state="success"] { + color: #a6e3a1; +} + +/* Warning states */ +*[state="warning"] { + color: #f9e2af; +} + +/* Error states */ +*[state="error"] { + color: #f38ba8; +} + +/* Info states */ +*[state="info"] { + color: #89b4fa; +} diff --git a/src/Gui/PreferencePacks/package.xml b/src/Gui/PreferencePacks/package.xml index 3ecbc6b807..eacd80cc72 100644 --- a/src/Gui/PreferencePacks/package.xml +++ b/src/Gui/PreferencePacks/package.xml @@ -1,12 +1,23 @@ Built-In Preference Packs - Preference Packs included with the FreeCAD distribution + Preference Packs included with the Kindred Create distribution 1.0.0 - MisterMaker + Kindred Systems LLC LGPL2 - https://github.com/FreeCAD/FreeCAD + https://github.com/kindredsystems/create + + KindredCreate + Theme + The default Kindred Create theme based on Catppuccin Mocha - a soothing dark color palette with carefully chosen colors for optimal readability. + 1.0.0 + built-in + default + dark + catppuccin + mocha + FreeCAD Classic Theme @@ -17,8 +28,8 @@ no stylesheet classic theme - - FreeCAD Light + + FreeCAD Light Theme Applies a basic light theme. 1.0.0 @@ -26,8 +37,8 @@ background light - - FreeCAD Dark + + FreeCAD Dark Theme Applies a basic dark theme. 1.0.0 diff --git a/src/Gui/SplashScreen.cpp b/src/Gui/SplashScreen.cpp index 7006911058..656cb64fb2 100644 --- a/src/Gui/SplashScreen.cpp +++ b/src/Gui/SplashScreen.cpp @@ -360,8 +360,8 @@ QPixmap SplashScreen::splashImage() fontExe.setPointSizeF(20.0); QFontMetrics metricExe(fontExe); int l = QtTools::horizontalAdvance(metricExe, title); - if (title == QLatin1String("FreeCAD")) { - l = 0.0; // "FreeCAD" text is already part of the splashscreen, version goes below it + if (title == QLatin1String("Kindred Create")) { + // For Kindred Create splash, we draw the title as part of the dynamic rendering } int w = splash_image.width(); int h = splash_image.height(); diff --git a/src/Gui/Stylesheets/CMakeLists.txt b/src/Gui/Stylesheets/CMakeLists.txt index 717aef4da8..104ff80ae2 100644 --- a/src/Gui/Stylesheets/CMakeLists.txt +++ b/src/Gui/Stylesheets/CMakeLists.txt @@ -1,5 +1,6 @@ SET(Stylesheets_Files + "KindredCreate.qss" "FreeCAD.qss" "defaults.qss" ) diff --git a/src/Main/FreeCADGuiPy.cpp b/src/Main/FreeCADGuiPy.cpp index 583ac6722b..120aa2754c 100644 --- a/src/Main/FreeCADGuiPy.cpp +++ b/src/Main/FreeCADGuiPy.cpp @@ -338,11 +338,11 @@ PyMOD_INIT_FUNC(FreeCADGui) try { // clang-format off Base::Interpreter().loadModule("FreeCAD"); - App::Application::Config()["AppIcon"] = "freecad"; - App::Application::Config()["SplashScreen"] = "freecadsplash"; - App::Application::Config()["CopyrightInfo"] = fmt::format("\xc2\xa9 Juergen Riegel, Werner Mayer, Yorik van Havre and others 2001-{}\n", FCCopyrightYear); - App::Application::Config()["LicenseInfo"] = "FreeCAD is free and open-source software licensed under the terms of LGPL2+ license.\n"; - App::Application::Config()["CreditsInfo"] = "FreeCAD would not be possible without the FreeCAD community.\n"; + App::Application::Config()["AppIcon"] = "kindred-create"; + App::Application::Config()["SplashScreen"] = "kindredcreatesplash"; + App::Application::Config()["CopyrightInfo"] = "\xc2\xa9 2025 Kindred Systems LLC\n"; + App::Application::Config()["LicenseInfo"] = "Kindred Create is licensed under LGPL-3.0-or-later.\nBased on FreeCAD, licensed under LGPL-2.0-or-later.\n"; + App::Application::Config()["CreditsInfo"] = "Kindred Create is based on FreeCAD and would not be possible without the FreeCAD community.\n"; // clang-format on // it's possible that the GUI is already initialized when the Gui version of the executable diff --git a/src/Main/MainCmd.cpp b/src/Main/MainCmd.cpp index f12fb4d12b..30b3dc1fb2 100644 --- a/src/Main/MainCmd.cpp +++ b/src/Main/MainCmd.cpp @@ -46,11 +46,10 @@ using App::Application; using Base::Console; -const auto sBanner = fmt::format( - "(C) 2001-{} FreeCAD contributors\n" - "FreeCAD is free and open-source software licensed under the terms of LGPL2+ license.\n\n", - FCCopyrightYear -); +const char sBanner[] + = "(C) 2025 Kindred Systems LLC\n" + "Kindred Create is licensed under LGPL-3.0-or-later.\n" + "Based on FreeCAD (C) 2001-2025 FreeCAD contributors, licensed under LGPL-2.0-or-later.\n\n"; int main(int argc, char** argv) { @@ -67,12 +66,13 @@ int main(int argc, char** argv) #endif // Name and Version of the Application - App::Application::Config()["ExeName"] = "FreeCAD"; - App::Application::Config()["ExeVendor"] = "FreeCAD"; + App::Application::Config()["ExeName"] = "Kindred Create"; + App::Application::Config()["ExeVendor"] = "Kindred Systems LLC"; App::Application::Config()["AppDataSkipVendor"] = "true"; // set the banner (for logging and console) App::Application::Config()["CopyrightInfo"] = sBanner; + App::Application::Config()["MaintainerUrl"] = "https://kindredsystems.net"; try { // Init phase =========================================================== @@ -147,7 +147,7 @@ int main(int argc, char** argv) } // Destruction phase =========================================================== - Console().log("FreeCAD terminating...\n"); + Console().log("Kindred Create terminating...\n"); try { // close open documents @@ -159,7 +159,7 @@ int main(int argc, char** argv) // cleans up Application::destruct(); - Console().log("FreeCAD completely terminated\n"); + Console().log("Kindred Create completely terminated\n"); return 0; } diff --git a/src/Main/MainGui.cpp b/src/Main/MainGui.cpp index 43dd556818..9a371f7687 100644 --- a/src/Main/MainGui.cpp +++ b/src/Main/MainGui.cpp @@ -54,11 +54,10 @@ void PrintInitHelp(); -const auto sBanner = fmt::format( - "(C) 2001-{} FreeCAD contributors\n" - "FreeCAD is free and open-source software licensed under the terms of LGPL2+ license.\n\n", - FCCopyrightYear -); +const char sBanner[] + = "(C) 2025 Kindred Systems LLC\n" + "Kindred Create is licensed under LGPL-3.0-or-later.\n" + "Based on FreeCAD (C) 2001-2025 FreeCAD contributors, licensed under LGPL-2.0-or-later.\n\n"; #if defined(_MSC_VER) void InitMiniDumpWriter(const std::string&); @@ -188,26 +187,25 @@ int main(int argc, char** argv) #endif // Name and Version of the Application - App::Application::Config()["ExeName"] = "FreeCAD"; - App::Application::Config()["ExeVendor"] = "FreeCAD"; + App::Application::Config()["ExeName"] = "Kindred Create"; + App::Application::Config()["ExeVendor"] = "Kindred Systems LLC"; App::Application::Config()["AppDataSkipVendor"] = "true"; - App::Application::Config()["MaintainerUrl"] = "https://freecad.org"; + App::Application::Config()["MaintainerUrl"] = "https://kindredsystems.net"; // set the banner (for logging and console) App::Application::Config()["CopyrightInfo"] = sBanner; - App::Application::Config()["AppIcon"] = "freecad"; - App::Application::Config()["SplashScreen"] = "freecadsplash"; - App::Application::Config()["AboutImage"] = App::Application::isDevelopmentVersion() - ? "freecadaboutdev" - : "freecadabout"; + App::Application::Config()["AppIcon"] = "kindred-create"; + App::Application::Config()["SplashScreen"] = "kindredcreatesplash"; + App::Application::Config()["AboutImage"] = "kindredcreateabout"; + App::Application::Config()["StyleSheet"] = "KindredCreate.qss"; App::Application::Config()["StartWorkbench"] = "PartDesignWorkbench"; // App::Application::Config()["HiddenDockWindow"] = "Property editor"; App::Application::Config()["SplashAlignment"] = "Bottom|Left"; - App::Application::Config()["SplashTextColor"] = "#418FDE"; - App::Application::Config()["SplashWarningColor"] = "#CA333B"; - App::Application::Config()["SplashInfoColor"] = "#000000"; + App::Application::Config()["SplashTextColor"] = "#cdd6f4"; // Catppuccin Mocha text + App::Application::Config()["SplashWarningColor"] = "#f38ba8"; // Catppuccin Mocha red + App::Application::Config()["SplashInfoColor"] = "#a6adc8"; // Catppuccin Mocha subtext0 App::Application::Config()["SplashInfoPosition"] = "6,75"; - App::Application::Config()["DesktopFileName"] = "org.freecad.FreeCAD"; + App::Application::Config()["DesktopFileName"] = "net.kindredsystems.KindredCreate"; try { // Init phase =========================================================== diff --git a/src/Main/MainPy.cpp b/src/Main/MainPy.cpp index 1be1d0d364..c6cffd2369 100644 --- a/src/Main/MainPy.cpp +++ b/src/Main/MainPy.cpp @@ -80,8 +80,8 @@ BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID /*lpReser PyMOD_INIT_FUNC(FreeCAD) { // Init phase =========================================================== - App::Application::Config()["ExeName"] = "FreeCAD"; - App::Application::Config()["ExeVendor"] = "FreeCAD"; + App::Application::Config()["ExeName"] = "Kindred Create"; + App::Application::Config()["ExeVendor"] = "Kindred Systems LLC"; App::Application::Config()["AppDataSkipVendor"] = "true"; QByteArray path; diff --git a/src/Main/freecad.rc.cmake b/src/Main/freecad.rc.cmake index d0ab6d261f..467d4dbf92 100644 --- a/src/Main/freecad.rc.cmake +++ b/src/Main/freecad.rc.cmake @@ -11,7 +11,7 @@ // remains consistent on all systems. IDI_ICON1 ICON DISCARDABLE "icon.ico" -// File info for the FreeCAD.exe +// File info for the kindred-create.exe // 1 VERSIONINFO FILEVERSION ${PACKAGE_VERSION_MAJOR},${PACKAGE_VERSION_MINOR},${PACKAGE_VERSION_PATCH},${PACKAGE_BUILD_VERSION} @@ -20,12 +20,12 @@ BEGIN BEGIN BLOCK "040904b0" // 409 stands for US English BEGIN - VALUE "CompanyName", "${PROJECT_NAME} Team" - VALUE "FileDescription", "${PROJECT_NAME} main executable" - VALUE "InternalName", "FreeCAD.exe" - VALUE "LegalCopyright", "Copyright (C) 2022" - VALUE "OriginalFilename", "FreeCAD.exe" - VALUE "ProductName", "${PROJECT_NAME}" + VALUE "CompanyName", "Kindred Systems LLC" + VALUE "FileDescription", "Kindred Create - Parametric 3D CAD modeler" + VALUE "InternalName", "kindred-create.exe" + VALUE "LegalCopyright", "Copyright (C) 2025 Kindred Systems LLC" + VALUE "OriginalFilename", "kindred-create.exe" + VALUE "ProductName", "Kindred Create" VALUE "ProductVersion", "${PACKAGE_VERSION}${PACKAGE_VERSION_SUFFIX}" END END diff --git a/src/Main/freecadCmd.rc.cmake b/src/Main/freecadCmd.rc.cmake index bc0d408d73..c62d2cdea7 100644 --- a/src/Main/freecadCmd.rc.cmake +++ b/src/Main/freecadCmd.rc.cmake @@ -11,7 +11,7 @@ // remains consistent on all systems. IDI_ICON1 ICON DISCARDABLE "icon.ico" -// File info for the FreeCADCmd.exe +// File info for the kindred-create-cmd.exe // 1 VERSIONINFO FILEVERSION ${PACKAGE_VERSION_MAJOR},${PACKAGE_VERSION_MINOR},${PACKAGE_VERSION_PATCH},${PACKAGE_BUILD_VERSION} @@ -20,12 +20,12 @@ BEGIN BEGIN BLOCK "040904b0" // 409 stands for US English BEGIN - VALUE "CompanyName", "${PROJECT_NAME} Team" - VALUE "FileDescription", "${PROJECT_NAME} command line executable" - VALUE "InternalName", "FreeCADCmd.exe" - VALUE "LegalCopyright", "Copyright (C) 2022" - VALUE "OriginalFilename", "FreeCADCmd.exe" - VALUE "ProductName", "${PROJECT_NAME}" + VALUE "CompanyName", "Kindred Systems LLC" + VALUE "FileDescription", "Kindred Create command line executable" + VALUE "InternalName", "kindred-create-cmd.exe" + VALUE "LegalCopyright", "Copyright (C) 2025 Kindred Systems LLC" + VALUE "OriginalFilename", "kindred-create-cmd.exe" + VALUE "ProductName", "Kindred Create" VALUE "ProductVersion", "${PACKAGE_VERSION}${PACKAGE_VERSION_SUFFIX}" END END diff --git a/src/Mod/Assembly/App/AssemblyObject.cpp b/src/Mod/Assembly/App/AssemblyObject.cpp index 42baf4469d..95e49d6c6f 100644 --- a/src/Mod/Assembly/App/AssemblyObject.cpp +++ b/src/Mod/Assembly/App/AssemblyObject.cpp @@ -165,9 +165,8 @@ int AssemblyObject::solve(bool enableRedo, bool updateJCS) jointParts(joints); - if (enableRedo) { - savePlacementsForUndo(); - } + // Always save placements to enable orientation flip detection + savePlacementsForUndo(); try { mbdAssembly->runPreDrag(); @@ -186,8 +185,22 @@ int AssemblyObject::solve(bool enableRedo, bool updateJCS) return -1; } + // Validate that the solve didn't cause any parts to flip orientation + if (!validateNewPlacements()) { + // Restore previous placements - the solve found an invalid configuration + undoSolve(); + lastSolverStatus = -2; + updateSolveStatus(); + return -2; + } + setNewPlacements(); + // Clear undo history if the caller didn't want redo capability + if (!enableRedo) { + clearUndo(); + } + redrawJointPlacements(joints); updateSolveStatus(); @@ -480,8 +493,56 @@ bool AssemblyObject::validateNewPlacements() } } - // TODO: We could do further tests - // For example check if the joints connectors are correctly aligned. + // Check if any part has flipped orientation (rotation > 90 degrees from original) + // This prevents joints from "breaking" when the solver finds an alternate configuration + for (const auto& savedPair : previousPositions) { + App::DocumentObject* obj = savedPair.first; + if (!obj) { + continue; + } + + auto it = objectPartMap.find(obj); + if (it == objectPartMap.end()) { + continue; + } + + std::shared_ptr mbdPart = it->second.part; + if (!mbdPart) { + continue; + } + + Base::Placement newPlacement = getMbdPlacement(mbdPart); + if (!it->second.offsetPlc.isIdentity()) { + newPlacement = newPlacement * it->second.offsetPlc; + } + + const Base::Placement& oldPlc = savedPair.second; + + // Calculate the rotation difference between old and new orientations + Base::Rotation oldRot = oldPlc.getRotation(); + Base::Rotation newRot = newPlacement.getRotation(); + + // Get the relative rotation: how much did the part rotate? + Base::Rotation relativeRot = newRot * oldRot.inverse(); + + // Get the angle of this rotation + Base::Vector3d axis; + double angle; + relativeRot.getRawValue(axis, angle); + + // If the part rotated more than 90 degrees, consider it a flip + // Use 91 degrees to allow for small numerical errors + constexpr double maxAngle = 91.0 * M_PI / 180.0; + if (std::abs(angle) > maxAngle) { + Base::Console().warning( + "Assembly : Ignoring bad solve, part (%s) flipped orientation (%.1f degrees).\n", + obj->getFullLabel(), + std::abs(angle) * 180.0 / M_PI + ); + return false; + } + } + return true; } diff --git a/tests/assytest.20260126-040101.FCBak b/tests/assytest.20260126-040101.FCBak new file mode 100644 index 0000000000000000000000000000000000000000..7d6bc0404fa240129e3fa2787da7b87e4cf74f49 GIT binary patch literal 32511 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 literal 0 HcmV?d00001 diff --git a/tests/assytest.FCStd b/tests/assytest.FCStd new file mode 100644 index 0000000000000000000000000000000000000000..204b7f24b5acc4040ff285f2ef3eb056a3278d3b GIT binary patch literal 37880 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 P(ADMR;m7;?ru%;ZkJWT% literal 0 HcmV?d00001 diff --git a/tests/assytestpart.FCStd b/tests/assytestpart.FCStd new file mode 100644 index 0000000000000000000000000000000000000000..a51de66e301832abf1091e0ae364c96e87c182c5 GIT binary patch literal 15561 zcmb7r1z6R~_Vz|Zy1P@lK{}Q=-bI<>q zakG7R_WSNNYu3AdGqVPHDe$Lg0000AU`@oO?f!;Ko)j4XxY+>!;6T3>wlQ?FGPZW4 zceS$I*U@rFl|=C#s(5u?*;@pI0!P%bYt&!0hc`77#{NMmMpqF^lo|J_ra)VoUTy6y z;#Y>*W$Hka2IzU(yJ)COXJ{IYr8TWE~3of5XVg0G|KgcmKVyS`9sHsxC%t9N(Jv`tIL6M@#- z(&qNsLaBLQJL=h-oAS4LKpi`Rto_!jtKgSD1-(;oxjZks8Rf0%`n)Q$PhVlDJmhIQ zjGg-=AN3j@zPbVvd8<%FsM(vi&uwhfQFpudnMeEryG93}YuqiGfu^pITZ;)Fe}c{P zOAyHoEx%9(W}k9?;nNCdyV)L<%_ z#rV1xD%v!pX5)q6-FCX#TMaDT&i(x>4eU^wUv5;(h&A?1=={0C>|aDQOsbf1L5TDx zY!5I}YGv{?AOzVG%tXnTP!0m?ce$R1KNB~r%RJM&fqUJw@-`a(uqdDlh#h)cUEIK4 zs9>e@G4=W_vs6TgE?sb|vL@v71X}#2K5NMXes#I_-IQlCme-lI{XJ%644kiXstkx$ zX^Na#%P|NFpUcKJy@@lVsz(=C*ZmT(4Fsw%v~w>GInhz4ABIQki;uc2TLFyr4@GaMaJ;9bc*S@q< zwJ@;ty1Vhd5O*8`WjCE7oayED0Ko}MV@m_HB+&o0g1EbpcU5OKn#+s^TWjomx8KLP z96*+nNP=J%iP5rVlTDs+Xy(Y9=boodXAFf+$9E7}3zGpXW+ZVc$P@OLa7D;|LSE2} z*O-nIA*x+%dr+nFJ|AillM>{no+1Z3)`!>SY>Disv3l>AJQJi;E-SP6j; zLr3aGzdAnM({N!X!&*azJB9Lw^IpIShprY6ZX^rvjLn*a`=qL%Q5fof!9*#-ODlrE zTS5t}!~S|P=N=gs2D?s29Xlufo`BL<4)Dqe9t&nYJ&I+6K$&}Jwo zK2{J_q088HE-O#TV~VkaVoVSluYD9mIWpH7{8TT)PMU zq@ltI@o?aI9-><#b4!4+ZX4X8ZL(U=D!kx~G&~HkM?KyxV>f+*0b$~+Kg8r7UP6|SUGkhxXsNpzR>o%R z%kc&Aa0@xar-(DxLkRBKs2&t_PEJk-9TBh4v7DVeJ;RgTuA=R*rI%UCeLM8XOKL7* zm7@jhM&7zu!?Qe%3MR`5>e=g*9mla<%!TT64$_SU$g;!r4x4I6){?SF z_=luEDbBe<6b!oh(4s!*uXji%g)!g2L+rykthnr@)sp*1uVbbdsNVUb%285Pc6GrB z5wUlli$g?nRKBa_At$`+!&ozfD7xuViE_d@MR;M5JfRXiUS0(6&v@G~b&F0${h?(| zH{_0sfE%g3AWTwGzj75@&6n&N2GQvj?=rJXFQUndxa9%-;XV^?nODjc5$cfhsY=qN zsq0C_)8lrOu7?{)w%eJRBL2)l+S%vU(U+T~Ls=60?}&)4ENR!IkSZwdIdPP9uB%e|Cy##>Fc2X* z!_VQ2F<{{1W96xpo``wDd@#VyJD)07uLSG%ho?^9M(h57D^EL1$re=hf+}G)%Ru8^ zp0zm;!t%bbo8m=ZK9g^@YZ|!*t7cV&=hY^3cwR}<9gm3V)t#jiq(Hbz-$qHC$xIFz zW6ppiEzKz&=@C}CeM^DeGe8HJC{mZq5|vbnh#!i2N|A!RO0EI+TV^YaqEPf^foLoV zBM9hRd0$GS46z3Zf!Nndl!a~>5XD0|vfTZ!;JamN+B_Z>vTb>`3zSuy|$(fLF*ifSxtg=4WHcJgZ#?~x*pB@v6@LW3EqWvmDBB&&O zExb6cu?~%iws)!ZY_jy$7NsJZ!&Pb;(6)6q~|16eiSvoy>AZOp$^ungm$^ zG8}F9-P5E%_XRRfJ45rMQF(IRhrv5TROzX{2+X}Mqp}su5`moMF_o)lUkJiQJJ;i# zW;90a5bSbzi`pVmt|7gzF2|l>n+ti)1Qh{0NckkOk=%|N*C%)Y{f#^N7Bzz%CI^*{ zBwkZvm>u_*5W{Cd^A`}o-!Q+m9>7MNafu$UV|<;zln|45ytJU8ERLFbcXY4PP@rS| zO_s4+>!n8S1^Ri?2$d{%*xh8w;rbjS2Dg?xjjb#}RwME!V$%%e=~D1h6(i|cRb+li z17rEmAt*b?*{^N0Pa0G?`r&bF-Q}f&6b!w{#NIjjL9MTK;n8B+Qsu!}KscC0M9RQ> z4+g{6sMedXKWkFC^;FsD-EVcXubAa2(V*}m+vq)Pbvp^M$v9KpKg|lcJZfp2I_g|V z&9B@&54X?9-c2NtK8N0YR$&|KgU+V)AgF;yq?-}sCMU?ey+lWng%Pp~d`p~7$LuSJ zUx_~dY<*VFqp0PgCj*(HGXicZ%`l;1GI$k?CR~8pnFEJ#RaJsVUYyT|>LvM*cdyH$ zGV-42HAL=)eNO}=ger_`Ib0F>*MWfOloj*_oUTTdIY^`1t&!(*FPFsZ(KwnSBd&V< zl43u22P||u1!4HX(A|%Z=7o&`A%^ZDKf=m9?NB8J)V*Mf!$!@)g+fJ;jRQR+#d%w= z9dAa%2VS`Dc=GJie(0eCU+NM%d^d$v{(kJtSb3!ST?-a9SufLdXk^L|Z-_KrzoE>U zXiY~U^I&y~a8ws^7KDO4R-}Rkl-RE7NB*2_+@@Q_wPzT*3s9w{3w%F zODPVYNhw=c(Lv@%mPN{igEJ5p2gCQOy)m&&npmG~J^94hCTN_ILG3O{eYz*}L8Rvt zK+Cz|pD!Y^%jsKNMJ0DL8QIslzZyulKp&kh$is|z=S(91X#jl=M(5J!QG?v}%Li#__$uf072hf~ky_=RX3$Bq`b znY@$;JlStm?~+bU-Q+0k3`&xk+u9wT5V=GQK|DIe*n9+~E-MxCs$9;+{(0OnD$V?Q><5>>q6{0^~=&H7Sw?m&ivRZBAr zuGt-(;*||Ouf^x_*M>WYn#6$P5-cU$BOa)uI}>bUJ_qnC|IadK%+7E3W|NB%a9;6i zz9MApXp`$`bBAIDI1hLTxDM$rRP$8^u#ujo(Pr^=_u|pOY6JFY!M;rkL0)`}0l%#T zyU2yO&vNo>`n%N5Md&h~{WPEvvYLn?92TF#+OC_rN}jrf(rVL-FaM z{SE`}!Y<V)(ykb25|k_T$_Y9C>IKjSK1>x$dar|Aa-Uy?Cr>IT^cMn1`vkr4TxaXsTvO3ME6Xs2e_)P>FIusoENq33Wv!SqKbWEv`RC z=enQZD!;{go`DR}+Q~#Y$V5AcjL$;d%|biGQrLm2L0P|DWL_QTfkd$U@ylEGW_>ZP z$!FQCgVyTc+1$ay4_%2;CpxP%d_ECEj-rsPAOi{`*tHkRS;-u+^9i2FJu7 zAs3)GPkp9dz^8;UslICVe+p%{){NCN#9GErXa%(RP?%YRDss3?VLXO1d8VWBAa%^{ z@M(f!#I^2Jt~(PuffKro`o8-^L15)l>#ZxW)9ssRjlEnwa_76IMVGjZc~<1Gu1z;) zFd?Ej#Ji-!0(j=p;M5~%oPxF;bQlXCN;jMNYYQ{kIY>`AxL7CyZJdM^QN_x01|i7z z0kpj*&1?BVEhDu{#XU~)wT@|svauDbRp9eDwJPl&o*?g9j@%fRvNc0Uvoz1|>|yY_ z>*9_03Fzu1top{1qQZFQs%Be+p;%7qXNKAiPIKc4;igcZ4Ylo;Cg?G@A8PCAoWDS> zL1;h2^%QofEae8&L9BBpm+qgkmQ6yZWNO^R=50+&EGVPJt`T_%iw$lzU1UFxT(2Ux zC)IqVoV=kSlOwhQHSAAG3HPOtHZZrgB+DY&6=E=mGxMdE-LcdQZ)df9SPI5AptTii zWWxK4oYSrkrSorN=YxrzQrA~toU@!N2wy&*Hr)th1U#c^KF-9*@q?RoKG@h-Iy^Q4 zYwTPrDYb4qFm=JOgQv0QKk1fqBPqL6@zZPx7k9U9SYZIelD%7>)juhYZowv3yE$i| z53>Lu)Waa~WOA3kc$)xl;cbYYV}IvTYlFdij;3~fwNW!xJ>JNE=H+?nBmc``3RpLv zXAtNRKl+kl#uR|fTx$BrB^U6zD11L0u_ZXt zEYw%Fmj<{(-(IoI;iVIss3&hV_zBDSe%>NZGg!CAM@D(7Vi1|vg_4Mp^-kveP3*b! zxuSriFD-azDw8_kSHnTJ0-k*T0cu#Fmy(6CqoEnSgteowy|uojl9|4(F};DkE%+l` z+$ZH?a?oHMo&f+zKX8A2zV+RrMF1nxm&L=1hA&R^&#UTEqeO1&s{BTIA$LoO@~?7- zAG|S5A+_QpXjxFA`qyuPc;rZyxvy{!7*#1$3itdyj(uHvpXeDWNnrGeW}I@VJ?AMA zWXyx;H?DHECM>rm4g;oOA5*F6ld08+@dNn0=~k%|jVCdHB1=fM6Cu)y_&63wVq$JN zF9Q?!x26KY%WEaXhG8#1&D6&%-~-^T&{#Quc)(=)FIiLL*{fp&7s6vk zN3#yi7;`wuR-YTEeS9luJ6^DyavkxH^TIl{hFquLczEvzo%3B;7e!^=)QR2luZ+3zE& z^tq$48=06{R7|qcA{SR-e;q(pA|^}*D4Jq%0RRNh0AAV{xzYa>68nidHZzQ9!G}Pa zuj`Wo@lpFv?KK2lYR%sX%sUBlhX;yxi@m?U#hL)(r+&ni-ty~z) zav5t6(!W-g?LUT{Tc)^Tyn)h-SZ`SZ8ffsyVZ5{d+!mK>AdwD{Wzut`sjNqoBdYF2 zDVq{>M=5;sA>thXg~PvLkNE-fQa6HB;000MSub88t`Q5jG`^QPz|a?w)6yg67A`xY zBEibq8{ZkGb>i+?aDjnMXJ+WR(9#MQx)1p>e(Ab<7nb{HO4rn?RP;!Al-Jx1`~$aX zNAfh9k%JG+LqbBQ7z!3Rw}ZThvW4?Yi~ZaE4QWMu`)9lN_0zU|R3@tvjzBft%8#$_ ztFcC?qSM!qpa$!D@z_67(JXut)Rg-of%^HMF(0{(0?^2Eq9&X)L=@LHFts@)=k8yNe7#ne+^! zJyfD3hDFi@vB|I$>l{|fB}s*5(pyv<2Le5#I0iE>;>G5?sBwbvDW)43 zBrC8pr*3a)w%}xo&&c!+v(DMzVSCYpXVpUxZo4wZT3RMVo#veQv=pzNzttC+c|oQE zMWZpGjU(AGPF(6}a7IU#@5@DFA&JLirh$B`5reMExHt&Ik54N&`qq5=^RPd@5UdGt z%^GsGIp;Fkb6<>6#a79+^(*u#1eHOp;HwPM-SDq$Q7l<_+BN;#%7O2zVG^69GB&hTU*y537_ z6LgV%G{~sg@S=$iMKcmomZ9TV1HBYh)|A*n6nzb;-X{?zE117Va=i!rFbhbAFyH_H z%CC|9Um-dv^vix?L~1!yQ};JC?vCQ|@}~rY_Cu;co?^8V%3~8jD)#1!w3;KAi4QO} zbzYf1Z?&AEpY2QEyV*Q}#fOqVYkJsb-)EYCaONd>`k^T%Ix#-*rT66t6p2Py)OxBo z!BmZ8r$}~E2=cptogFO6jKgfD^K7Yc4y zY1VCx3XR{)W~eh23JH3mB=C|uBanU?i_tEjSVf8{0X1^ynwc&5M=Lg;bdw0Pp8mG2McU8( z8cj*o8{HMn!6PQu-04RN(RYb-AE&IKHi#UvcS#Bbz6!3yjhj*p5E=CO9L3GIZx8Cd zkfq~r87t|=wNcBP3V1_?=(fN~zEtB3*+! zpft4q_>ElAMcM|>GcF?sg;}dqEJNiv=gM_9AB@BN1Q*hUx32umf@>K|Sh#dIDd&f# zvm6(aWNPA?gY+|Vnwb1b2nT0XG}2x%XI=9=`wa+IJDM|d?!&S>!*yw8-tl#|`H?kY z?+5pZXY!@F7v!|k!CeY4tf{O|s1K~+=bp^$sM%s>IczD;IW{!pq8zl;MR6QV*wI25 z7=)~P68GiQsLUJ?oZ%+kIpaZm*~sguF`819Cq$B#^k*ut__$?0^-3)2BGueehKKG9mWNH$4UnaSk zdpD)sLIj>>YvA}67rS5-p7+>?jAsRsj28tGjnv=XY~SM(;jf;%!zaR_2YHPbwElqq zujhWqF>w*}0RQiru67`PNWzy-b(pX0_4}*?&K!J^mw79o2lyqo-b*nIaPqHPZ0LSf zUwfw(Z`Um0;L1loP8{KgT}$!xQ`lSy=pFZ8!P!(#kSKk!jBk}q9P>n2Jh7`=`HCU| z4yLoU1M8FvH7+y=k|PP>_Rt#NyIb6METPY!N$YmVm~YFD^_Ew1 zKDr;@7!f3<9-!O`6rPFX_+);@E^Xu_5sk!>yN_`Qc`geU>`ZoF!F(xF6>$x@vCmx# z<2hHhxo-t^a5_CpmMJErdtv-w&8I0{eQm@`GenOwdcGpYwn0aHO{(QzF^e=Hxb<>M zMBXpWzl%vDGmkMKlye46fvc-K zf7-|fMj<9hkvsoYWUxbn_tVm_Qw3?+BC~ewF9IQ!#IKw2Q4RgWX9+Tz2Q#~x&DZ8b zL7GIAMrx$s=n{=+GXWls$#6N7#UjV5R!1PzPj<_E4&(N+gdKY??!IE3={y(6c1~+$ z&1*&>W2W_0wOv+=LrHC>Yjnez&`Rk&{$YNZtY7miR6QEI8@fvcm^GNyxkZE2FoYwO z^^D$}0)&ggEF|7#Do4T-rm9bNRY=APGt~QM7dLNdyqhEa4ILDXH0?o(JVchJ_Gi*P zsog%U``9L~5rDrP?%0Ke_E23nYK|bFjA48%f5rCs9QD`0dLaQZ@~0$0Mdv@V{Vxk! zrx-1{E}}njee_l?aZvUwtlUgZ3f9|^`Oj)~-7`k@7By_Qr|*6Do=;PJ^)&Tmu`Ou! zret?72|1SViU|XIEJpbF*R10=9^)R-*OF}vddB}1WAJw|8hsbzz@K8QGk01zyJ&D+ zH&*~pYTzU87m%4?+-~%^Sk~q2pIld(A4A}#ZJ$wbCGwdTH+Kd~-#E7Cp~?Hp z2JC-WCp#Ng9-JBo8BBchG#JYuzy=G#nLv@Kf7C$AqoS;A_Es-LOz2FUCzI=VS_|wqp#JVW10lk~!}ie;K*u#Ot!`*Ic??#x%fv^7kJzjuX_t@?pO=?+ z;?OOU;9v^>5Nw{C0Ed%6aD0PMEa@2M{xb7{0FU70#6%>^+D1V1iu|d(lEs$VUM7F@ zw~XhW90GTTK(ewZ`5|b_i&z3LlT~ESBB#nPukEIFO@UiyUutv31;xg`=*LGaT2s31 zxPB$wM?HjNc_Uk(VkU_u$*QK_e>r=>a*iJKz{X4!eJ1x>5}paP$gq4^5~)dfYn;`B zl<4{f#YZ)!Z?W+r@KwW7C#&&x?N-U^bp@Q|NCsiLsqXf-bqT8}UcL;$P6;;Fm2c1~C~OdJvgC=Y zGH(XoLx~J|RW8%&8mPxeO3?jj2((Th60Oel;CfSHY+`KTeoVN;12oZdxFuFFGpC;pqUkppM2(N%mI`VxXz#4S!sq;|pRP zDeP@6|PN*$Iuuj zP;@?kvblmB7-oUI?BNu1D02_IOO6RkT#cAq0_ZhTS8qC~kw)%sPQTRfg4sH@LmN@X z=XaA``g%IKk)!*LLDuB7z-?IDmadI_i1tVvFLY}a&Pj~m$^xINEM_R?^(^8?BoEUy zKC*^y2fYr^lUlR<48aH{)d-J?@WI+E zOJe5E>ArqCKfclvGW<#I1DAj1_9tIEbSlCWO}rEt+4StyZUflNQjywdpWw3WBFQl` zEKzf;*^H1cy#h)%!>29T;H}D@(63B&ZzQAm1Jq3`h$M^AgleZ zP@cwdKR50L6Gd z`lc*u{rSecvh-jNrs6y9rW1^3a5f!5(J{XL^|Hy+^$l(}ULQWZigz2;*YMMxIdYbU zc@zKP$=qjkiCJJ3${X=l!cRzJA^P;HljOlC6C-eZ&m*#*OzM@2Ku&(|i@1{ybjuw=fFST0rUjGV+4p`Ka@Jl!0VI!Z(;fiifxyuqundtGr~_Mxfi_g) z?GSkkm@I&8Od*K8c6BLOaY9h{u@Uzv1}{lGNX4jZ(;f$uf{>LUBt|74sNXMCwbi}; zq+34byNrf>M6`q!Q^q`RokoH}&#hTqgq46Rm5*ZcrM#nujHaUuueq>e_-QaXBkOc( zcCY332+m5#^DnVg;7C49$^v&%UG0#N^x((eI|CiRrqEsGo;tHLV1*$VCe$bFYWYl_ z$eZXMNPItSl-Cx1p}$;ZGzX{w88m#4vj6EgTi{mU_EzW?e@;*2N;P9b?5%c5RFmJX zd)Fojer&u{)C!AWbU z{OyX?{%_sZ^-@hZB+@=!#W_j&uHH41x9$u^lB9Y zg-zGomMkn+V$om*h%!R#>P)a>V!%;`yfr?mU1Bo_M)bYI|PvvqhVR!oSFHYmk$TQ zrNTVf+1Mq@${>eIGIy-dsN%h^8}1-B&c2@J&-Q12lCV?vBw^o|vlnF{7LrQfe8anr z0lh{n4L&)ysmVFm3aw2Qj zC9A-O)eJ39Kv{o_grj@pS4+0klo{zKoP+$IIL@_0FBQcE2QU#_$QXFpY)7{Sa7y2o zL}q#F!x}TQJW(GPuwOG3Mc z6d&=5M5*;G-4j~*Iqt0(**e5PXGr))_OGpG2iFd~Z16(t`R4Dy$QjsFrh2tw%D3st z&cgHel^5hts_S4o%bh*KU!^2UymB)4kt~;3@+?@Dl{vY2XJ>e7^_sdSWxftwwyVQh z3u}0P$XW~BdDdU5nUJ2Y^!4fs?`A80C7;1*&3;*0yboYCh&AoRRaQY4GFe`r4ouGl zcGs{B*e3C%rwjAx8wkE-kexLE-~9OL!1tmvUDAH z<6L1QH>>xxVn&}}>bR&fsW5vAH-CaLb!*u2#CnAB?K9?hccCdXmVrIjPN^hy^}KN{ zlTV}Ls_%Tp9c#^5ac~~KnPC+hv%v?tZob|YwYaYve2Y zs}IN3qYZE8pyqoi&{35G#D7ll9nGAq46OCdEgcw?|NJk#t+nYc+>yiPdhCk9t5-|s zXSUFwcO!s40y&YBM#ln@xE+S8Fa`_b5k8py=b{8L;tcvoVswXv1&$=TSbB#$ zeYcq@w6_BiQ}Gy1>!#^dbTpa)Zxj(7En?_K&!efBrl^B+8A5*=jLve zka+E;Ew-I@BabO|@6H^Sv@cdOTR9jR_DsPJK$2H-Br(EVF*iW5Xyd7G%t~PvtE4YU0m#ERx3+c&sDuqU9EaMvpZFhK4fF2k#N1cf4_2Q zN2BKD<71;aTxQi+ov^;33-MG@#rlh)=Qtu6aN*%$`8ZLn`k~IJjr-CSNZ5SqqIcka zdFA?`7~`0Kc2sSiikYt^jj?d=6GUTL&o95Zt8?!2Q2jm_50z*5E5k#{t=Go>4GnJ4 zIJwIKnpJ7b%LlK^z1i8Iy)cW&UamDvOf9eFt;U_c zkG9r~d12XobDeZvOXtfQKs&Y*6>WW&s1u&6o1>-GTc;)|p_f8J6}ql1`iTS;`+mSf zJ7nqw69+MTj z4mLhY@l_ZHCCv|3r*ZNgqV04zVL`9;?DyovywJUu6me*5=vpl1H`*N#EEvUFj=YaE zs(lZc7X5cmr(v!-XIPTZOqd)CnP^umvAPD_H?BSfGr@Ut2l>9I3@9kc?B^;7B!5&6 zdqbYDhX>kgQG#CI_gsH$&IE03jrHyItqqM0jb6RFBE-SDd3aNG{16!#`5@q}shPqH zjsw~W|58XK7C=sg0TDofUf)Y7(&pC2LN=B*_Ja2I`fh*lFi=rJ{}0snua~zmw|4w@ z7!~t^!k41M>V)?%_E%i?h{tug2e=uFW`QMZB^X&eOpI-dM^sm$VFHCIzccyZ_kq#&_}mnlk<~yno3V--G&5 z&iF^%&q?F&EdQaaf6W@bSVc^KCcED)|Bp8x&QHZ2C7YjNe`EPS;{MI@A3FY5%l|E? zehB$*g9_{k8u&l|B@SpZ{%AFR-`{>dyOWpt75Vtu$$xMFK#iXaXlnlc63Sza?-`Zo3*Qfxzm6;)qaWXV_<@cEl?MOr9>imY$5#)2 zFerf>{p&@9$Jock-XBf+&afYYAMbyDfCs1mfPdNzJ!bj&q4PZ*{n6nK-fo#`7!wCtoA({{@H5$!0CUpn&~n6@x%WITIP2&^Zy;4_&b{A zG5Y5u`m5#3zoS_nqko>QU(qxSzm5CF{~hi0JDTk=`kyUt{~gW#82!&ahi3fEa*oI7 zpH~jQj$7$>H0NXV&tCif^!~He_@)1jW@3B{|9RlQ!nghg{y(GbS2zpPZzE^=E!=({ z`mb>Bzk&Z2Z$C@)SDE#K;J-@rH`9Lx|LS%C^KTmc4gIr7f3=(ggnqob{VmpiUh({D zc>oChtL49W?Pu_>mN)%w`ETfdw*2I8EdNbs{~R#9EWZyNBs2)ng;D_EIjG};YM7y* T4