- Add QGroupBox::indicator styles matching QCheckBox::indicator for
consistent checkbox appearance in checkable group boxes (#44)
- Add QLabel[haslink] color rule using Catppuccin lavender (#b4befe)
so hyperlinks render correctly in the dark theme (#43)
- Add checkLogging and checkShowReportViewOnError defaults to the
KindredCreate preference pack (#41)
Closes#41, closes#43, closes#44
- Make src/Gui/Stylesheets/KindredCreate.qss the single source of truth
- Generate PreferencePacks QSS copy at build time via configure_file()
- Merge missing preference defaults into PreferencePacks cfg:
Document (undo, autosave, backup, license), TreeView (PreSelection,
SyncView, SyncSelection), NotificationArea, OutputWindow recording,
General (AutoloadModule=ZToolsWorkbench)
- Delete unused resources/preferences/KindredCreate/ directory
- Delete src/Gui/PreferencePacks/KindredCreate/KindredCreate.qss from source
- Update documentation to reflect single QSS location
- Fix hazy text on Wayland by setting QT_SCALE_FACTOR_ROUNDING_POLICY=RoundPreferFloor
and QT_ENABLE_HIGHDPI_SCALING=1 in deb and AppImage launchers; remove forced
QT_QPA_PLATFORM=xcb from AppImage to allow native Wayland (fixes#33)
- Add menu icon size preference selector (Small/Medium/Large/Extra large) in
General preferences, applied via QMenu stylesheet at startup and on save (fixes#46)
- Replace verbose theme customization banner with concise 'Kindred Create Theme'
label in UI preferences; split Overlay group into 'Panel Visibility' and
'Overlay Interaction' sections (fixes#35)
- Remove Addon Manager branding label from General preferences, change recent
file list default from 4 to 10 (fixes#36)
Issue #28: Add version.py.in CMake template that injects
KINDRED_CREATE_VERSION at build time, making the Kindred Create
version available to Python code via 'from version import VERSION'.
Issue #29: Add update_checker.py that queries the Gitea releases
API on startup (10s deferred) to check for newer versions. Uses
stdlib urllib only, 5s timeout, never blocks the UI. Respects
user preferences for check interval, enable/disable, and skipped
versions. Logs results to Console for now — UI notification will
follow in issue #30.
Closes#28Closes#29
Replace stub QMessageBox in Add Silo and Edit Origin buttons with
actual calls to the Silo_Settings command, so users can configure
their Silo connection from the origin manager dialog.
- Increase OriginSelectorWidget max width from 120 to 160px for longer
origin names
- Set explicit SizePolicy::Preferred for better toolbar layout
- Update silo submodule to fix/silo-workbench-bugs with auth and menu fixes
The silo submodule now uses silo-mod layout where the FreeCAD workbench
is at freecad/ (not pkg/freecad/). Also install the silo-client
submodule directory.
Copy silo-bom, silo-commit, silo-info, silo-pull, and silo-push SVG
icons from mods/silo/pkg/freecad/resources/icons/ into src/Gui/Icons/
and register them in resource.qrc so they are compiled into the binary
and discoverable by BitmapFactory at runtime.
- OriginSelectorWidget: use BitmapFactoryInst::mergePixmap() instead of
BitmapFactory::mergePixmap() since BitmapFactory is a function, not a class
- OriginManager: use Console().log() instead of Console().Log() which
does not exist on ConsoleSingleton
viewDefaultOrientation is a method on View3DInventorPy (Python wrapper),
not on View3DInventorViewer (C++ viewer). Use doCommand with the Python
API, matching the pattern used in StdCmdViewHome.
SelectModule is declared in FileDialog.h which was already included.
The separate #include "SelectModule.h" referenced a header that
doesn't exist, causing a fatal build error.
- Detect document's origin vs current (target) origin
- Route to appropriate workflow:
- Same origin: standard SaveAs
- Local → PLM: migration (handled by PLM origin)
- PLM → Local: export (handled by local origin)
- PLM → PLM: transfer (handled by target PLM origin)
This provides the infrastructure for Issue #17: Mixed origin workflows.
The actual migration/export dialogs will be implemented in the
respective origin adapters (SiloOrigin, LocalFileOrigin).
- Create OriginManagerDialog with list of configured origins
- Show connection status for remote origins
- Allow setting default origin
- Add/Edit/Remove buttons (Add/Edit show placeholder for now)
- Wire up 'Manage Origins...' button in OriginSelectorWidget
- Prevent removal of built-in local origin
Part of Issue #15: Multi-instance Silo configuration UI
- Create OriginSelectorWidget class (QToolButton with dropdown menu)
- Add OriginSelectorAction to create widget in toolbars
- Add Std_Origin command registered in CommandStd.cpp
- Add widget to File toolbar (before New/Open/Save)
- Connect to OriginManager fastsignals for origin changes
- Add Catppuccin Mocha styling for the widget
- Widget shows current origin name/icon with connection status overlay
This implements Issue #13: Origin selector toolbar widget
- Add openDocumentInteractive() and saveDocumentAsInteractive() to FileOriginPython
- Fix Console API: Warning -> warning, Error -> error in OriginManager.cpp
- These methods bridge Python origins to the new interactive document operations
Issue #10: Local filesystem origin implementation
- Add openDocumentInteractive() method to FileOrigin interface for UI-based
file opening (shows file dialog)
- Add saveDocumentAsInteractive() method for UI-based save as
- Implement LocalFileOrigin::openDocumentInteractive() with full file dialog
support, filter list building, and module handler integration
- Implement LocalFileOrigin::saveDocumentAsInteractive() delegating to
Gui::Document::saveAs()
Issue #12: Modify Std_* commands to delegate to current origin
- StdCmdNew::activated() now delegates to origin->newDocument() and sets
up view orientation for the new document
- StdCmdOpen::activated() delegates to origin->openDocumentInteractive()
with connection state checking for authenticated origins
- StdCmdSave::activated() uses document's owning origin (via findOwningOrigin)
for save, falling back to saveDocumentAsInteractive if no filename
- StdCmdSaveAs::activated() delegates to origin->saveDocumentAsInteractive()
- Updated isActive() methods to check for active document
The Std_* commands now work seamlessly with both LocalFileOrigin and
SiloOrigin. When Local origin is selected, standard file dialogs appear.
When Silo origin is selected, Silo's search/creation dialogs appear.
Import and Export commands are left unchanged as they operate on document
content rather than document lifecycle.
Closes#10, Closes#12
Add QApplication, QEvent, and Gui/Application.h includes that were
missing, causing build failures with undeclared identifiers for qApp,
QEvent::LanguageChange, and Gui::Application::Instance.
- Remove dead code in migrateOldTheme() that set Theme parameter for
KindredCreate.yaml, which no longer exists in the Stylesheets build
- Remove orphaned Classic.yaml and KindredCreate.yaml parameter files
from Stylesheets CMakeLists and from disk
- Remove unused includes in ThemeSelectorWidget.cpp (QApplication,
QEvent, Gui/Application.h)
- Update .gitmodules: ztools, silo, and OndselSolver now reference
public git.kindred-systems.com URLs instead of internal Gitea
- Merge OndselSolver numerical solver with ML solver scaffolding
into unified kindred/solver repository
- Rewrite README.md for conciseness
- Add docs/CI_CD.md with full pipeline documentation
- Rework CI/CD workflows for public dockerized runners
- Add multi-platform release builds (Linux, macOS, Windows)
- Release workflow triggers on v* tags only
- Update docs/REPOSITORY_STATE.md and docs/INTEGRATION_PLAN.md
The isConvergedToNumericalLimit() method compared dxNorms->at(iterNo)
to itself instead of the previous iteration (iterNo - 1). This meant
the solver could never detect convergence improvement, causing it to
exhaust iterations on assemblies with many constraints, producing
'iterNo > iterMax' exceptions and 'grounded object moved' warnings.
Also updates silo submodule pointer.
InitGui.py: Store SiloAuthDockWidget reference on the QDockWidget to
prevent Python from garbage-collecting it while its 30-second QTimer is
still running. The lost reference caused 'QThread: Destroyed while
thread is still running' followed by abort.
ztools InitGui.py: Move addWorkbenchManipulator() call from module-level
into Initialize(), after command modules are imported. The manipulator
references ZTools_DatumCreator, ZTools_DatumManager, ZTools_EnhancedPocket,
and ZTools_RotatedLinearPattern, which don't exist until the imports run.
Also updates README.md and submodule pointers.
- Add _setup_silo_auth_panel() to dock auth widget in right panel at startup
- Update silo submodule: SSE listener, revision pull dialog, conflict detection
Replace the static QListWidget with a full SiloActivityPanel class
that provides:
- Search field with 300ms debounce for filtering items by name
- Type filter dropdown (All / Part / Assembly)
- Refresh button for manual reload
- QTableWidget with Part Number, Description, Type, and Updated columns
- Part Details pane that appears on row selection showing part number,
description, type, revision, last updated date, and project tags
- Open button / double-click to open items via SiloSync.open_item()
- Info button showing revision history dialog (reuses Silo_Info pattern)
- Graceful error handling for connection failures and empty results
Replace the simple open/closed disclosure arrows with full spanning
tree branch connectors that draw pipe-style lines between parent and
child items in the model tree.
New dark-theme SVGs created with Catppuccin colors:
- branch_vline_dark: vertical continuation line (#585b70)
- branch_more_dark: T-junction for mid-siblings
- branch_end_dark: L-junction for last sibling
- branch_more_closed_dark: T-junction + closed chevron (#a6adc8)
- branch_more_open_dark: T-junction + open chevron (#cdd6f4)
- branch_end_closed_dark: L-junction + closed chevron
- branch_end_open_dark: L-junction + open chevron
Updated QSS branch pseudo-selectors in KindredCreate.qss to map all
seven branch states (vline, more, end, more-closed, more-open,
end-closed, end-open) to the corresponding SVGs.
Updated ztools submodule with matching CatppuccinMocha.qss changes.
Wire up the new Silo authentication dock panel in InitGui.py:
- _setup_silo_auth_panel() creates the Database Auth dock widget
- Tabified with the existing Database Activity panel on the right dock
- Deferred to 4500ms to ensure activity panel exists first
- Widget reference pinned on the dock panel to prevent GC
Update silo submodule to include auth widget, login flow, token
management, enhanced settings dialog, and silo-auth.svg icon.
QTreeView::item had padding: 4px on all sides, eating 8px of
horizontal space per item. Combined with icon decorations and
indentation this caused excessive middle-elide truncation in the
model tree. Change to padding: 2px 0px (vertical only).
Qt defaults alternate-background-color to white when unset. Add
#181825 (Mantle) as the alternate row color to QTreeView, QListView,
QTableView, and the property editor in both KindredCreate.qss copies.
Move ZTools command imports before workbench initialization in
InitGui.py so commands are registered before PartDesign/Sketcher
init triggers toolbar state restoration.
Import silo_commands eagerly in _setup_silo_menu() so Silo commands
exist before the WorkbenchManipulator references them.
Create KindredCreate.yaml and Classic.yaml theme parameter files
defining all style tokens (PrimaryColor, TextForegroundColor, etc.)
used by FreeCAD.qss and the overlay stylesheet. Register them in
CMakeLists.txt and set the Theme preference in KindredCreate.cfg.
Add migration in migrateOldTheme() to set Theme=KindredCreate for
existing users who have the stylesheet but not the Theme parameter.
Stylesheet fixes (KindredCreate theme):
- Add tree branch expand/collapse SVG indicators (branch_closed.svg,
branch_open.svg) visible on dark background
- Add QSS rules for QTreeView::branch pseudo-states
- Add min-height: 20px to QHeaderView::section to fix bottom clipping
- Merge QDockWidget::title and QSint--ActionGroup QToolButton padding
improvements from Stylesheets copy into canonical
- Add SpreadsheetGui--SheetTableView QLineEdit cell editor styling
- Sync all three QSS copies (resources/preferences, src/Gui/Stylesheets,
src/Gui/PreferencePacks) to canonical version
ZTools-PartDesign workbench integration:
- Add _ZToolsPartDesignManipulator via WorkbenchManipulator API
- Injects DatumCreator, DatumManager into Part Design Helper Features toolbar
- Injects EnhancedPocket into Part Design Modeling Features toolbar
- Injects RotatedLinearPattern into Part Design Transformation Features toolbar
- Adds corresponding PartDesign menu entries after PartDesign_Boolean
Silo enhancements:
- Add Silo_ToggleMode command: toggle switch in File toolbar that swaps
Ctrl+O/S/N between standard FreeCAD and Silo equivalents
- Add SSL certificate file browser in Silo Settings dialog (SslCertPath
preference, supports .pem/.crt/.cer)
- Update _get_ssl_context() to load custom CA cert before system CAs
- Expand SiloMenuManipulator: Silo_New, Silo_Open, Silo_Save, Silo_Commit,
Silo_Pull, Silo_Push, Silo_BOM in File menu
- Integrate upstream Silo_BOM command (tabbed BOM/Where-Used dialog)
Submodule updates:
- silo: Silo mode toggle, SSL cert browsing, BOM menu integration
- ztools: PartDesign WorkbenchManipulator and Catppuccin theme sync
Documentation:
- Add docs/REPOSITORY_STATE.md: comprehensive repository state report with
architecture overview, submodule status, potential issues, feature stubs,
and Silo integration path forward
When a PartDesign::Plane (including ZTools datums like ZPlane_Mid,
ZPlane_Offset) is used as a reference in an Assembly joint,
findPlacement() returns an all-zero placement, making the joint
constraint degenerate and ineffective.
Root cause: getElementName() strips the terminal '.Plane' suffix
because it matches the hardcoded set for App::LocalCoordinateSystem
datum elements ({X, Y, Z, Point, Line, Plane}). This is correct
behavior — the issue is that findPlacement()'s 'whole part' branch
only handled App::Line objects and returned App.Placement() (zeros)
for everything else, including PartDesign::Plane datums.
The fix extends the 'whole part' branch in findPlacement() to
compute a proper placement for PartDesign::Plane objects by
extracting the plane's center-of-gravity and surface rotation from
its Shape, then converting to object-local coordinates. This matches
the existing convention used for Face elements elsewhere in the
function.
Also adds handling for PartDesign::Point datums, which hit the same
empty-element code path.
Existing App::Plane origin references (XY_Plane, etc.) are unaffected
since isDerivedFrom('PartDesign::Plane') does not match App::Plane.
AssemblyObject::onChanged() was calling updateSolveStatus() when the
Group property changed during document restore. This triggered the
solver (solve -> validateNewPlacements) while child objects were still
being deserialized, causing a segfault in validateNewPlacements() due
to accessing uninitialized data.
Add isRestoring() and isPerformingTransaction() guards matching the
pattern used by GroupExtension::onChanged() and other FreeCAD modules.
Fix the exec() calls in Create module's Init.py and InitGui.py to pass
__file__ and __name__ in the globals dict. The silo workbench code uses
__file__ to resolve icon paths, but exec() without explicit globals
does not provide it, causing 'name __file__ is not defined' errors.
Also add three silo integration enhancements to InitGui.py:
- First-startup check: launches Silo_Settings dialog if API URL is not
configured on first run
- File menu injection: WorkbenchManipulator inserts Silo Open, Save,
and Commit commands into the File menu across all workbenches
- Database activity panel: dock widget showing recent silo items,
displayed on the right side of the main window
Add QApplication (for qApp macro), QEvent (for QEvent::LanguageChange),
and Gui/Application.h (for Gui::Application::Instance) which were
missing after the develop merge.
- Rework ThemeSelectorWidget to show only KindredCreate theme
instead of FreeCAD Classic/Light/Dark buttons that no longer exist
- Fix migrateOldTheme() to map old FreeCAD Light/Dark stylesheets
to KindredCreate instead of throwing an exception
- Remove orphaned FreeCAD Dark.yaml and FreeCAD Light.yaml
parameter files from Stylesheets build
- Move ComboView default dock position from Left to Right
- Remove FreeCAD Classic, FreeCAD Light, FreeCAD Dark, and Dark behave
theme packs, keeping only KindredCreate (Catppuccin Mocha)
- Increase min-height and padding on QDockWidget::title to prevent header text clipping
- Increase min-height and padding on QSint--ActionGroup QToolButton for task panel headers
- Add specific styling for spreadsheet cell editor with reduced padding for better text visibility
- Add src/Mod/Create/ module to handle addon loading
- Init.py adds mods/ztools and mods/silo to sys.path at startup
- InitGui.py loads workbenches from addon InitGui.py files
- CMakeLists.txt installs Create module and mods/ directory
- Set ZToolsWorkbench as default startup workbench in preferences
* PartDesign: Add interactive gizmo for draft operation
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
---------
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>