9.9 KiB
Plan: Create Design-Only MatterControl Fork
Goal: Strip MatterControl down to a pure 3D design/modeling application, removing all printing, slicing, and cloud features.
Feasibility Summary
| Feature Category | Removal Difficulty | Effort Estimate |
|---|---|---|
| Cloud Features | Easy | Low - 1-2 days |
| Printing/Communication | Moderate | Medium - 1-2 weeks |
| Slicing (MatterSlice) | Very Difficult | High - 3-4 weeks |
The codebase has good architectural separation for design vs printing, but slicing is deeply embedded. A "design-only" variant is feasible with moderate effort.
Detailed Analysis
1. Cloud Features - EASY TO REMOVE
Cloud features use a nullable delegate pattern - already designed to be optional:
// All cloud delegates are nullable (ApplicationController.cs)
public static Func<PrinterInfo, string, Task<PrinterSettings>> GetPrinterProfileAsync;
public static Func<string, Action<double,string>, Task> SyncCloudProfiles;
public static Func<bool> GuestUserActive;
public static Func<AuthenticationContext, DialogPage> GetAuthPage;
public static Func<bool> UserHasPro;
To remove: Simply don't register these delegates. Code already has null checks everywhere.
Files to modify: ~5-10 files to remove registration points
2. Printing/Communication - MODERATE EFFORT
Good separation exists:
DesignTabPage(design-only) vsPrinterTabPage(printing)PartWorkspacesupportsPrinter == nullfor design workspaces- Design tools have ZERO printing dependencies
Challenges:
PrinterConfigconstructor always createsPrinterConnection- 465+ printer-related null checks throughout codebase
- Print queue, temperature monitoring tightly coupled
Approach:
- Remove
PrinterTabPage,PrinterActionsBar,SliceLayerSelector - Remove
PrinterCommunication/directory - Remove
MatterControl.Printing/project - Modify
PrinterConfigto be optional or remove entirely - Keep only
DesignTabPageworkspaces
Files affected: ~50-80 files
3. Slicing (MatterSlice) - VERY DIFFICULT
Deep integration:
- 248 files reference slicing functionality
- 150+ settings mapped in
EngineMappingsMatterSlice PrinterSettings.SliceEnginesassumed non-empty (crashes if empty)- Settings validation checks
printer.Settings.Slicer.PrinterType
Critical coupling points:
- Multi-extruder logic depends on slicer
- Support/raft/brim features depend on slicer
- G-code generation requires active slicer
- 30+ UI field types assume slicer presence
If slicing removed, you also lose:
- All print settings UI (no point without slicing)
- G-code preview/visualization
- Layer-by-layer analysis
- Print time estimation
Architecture Overview
┌─────────────────────────────────────────────────┐
│ KEEP: Core Design Features │
├──────────────────────────────────────────────────┤
│ DesignTools/ - Primitives, booleans │
│ View3DWidget - 3D viewport │
│ Library/ - Content management │
│ DataStorage/ - SQLite persistence │
│ SettingsManagement/ - Basic settings │
│ agg-sharp/ - Rendering, UI, math │
└──────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────┐
│ REMOVE: Printing-Specific │
├──────────────────────────────────────────────────┤
│ PrinterCommunication/ - Serial I/O, drivers │
│ MatterControl.Printing/- G-code streams │
│ Queue/ - Print queue │
│ PrinterControls/ - Printer UI │
│ SlicerConfiguration/ - Slicer settings (150+) │
│ MatterSlice/ - Slicer engine │
│ PrinterTabPage - Printer workspace UI │
└──────────────────────────────────────────────────┘
Recommended Approach
Option A: Design-Only Fork (Recommended)
Create a stripped-down version keeping only design features:
-
Remove projects:
Submodules/MatterSlice/MatterControl.Printing/
-
Remove directories:
MatterControlLib/PrinterCommunication/MatterControlLib/Queue/MatterControlLib/SlicerConfiguration/MatterControlLib/PrinterControls/MatterControlLib/ConfigurationPage/PrintLeveling/MatterControlLib/SetupWizard/
-
Modify:
- Remove
PrinterTabPagefromPartPreviewWindow/ - Remove printer workspace creation from
ApplicationController - Remove printer-related settings from
SettingsManagement/ - Update
MainViewWidgetto only create design tabs
- Remove
-
Keep intact:
DesignTools/- All parametric designLibrary/- Content managementView3DWidget- 3D viewportDataStorage/- Persistence- All
agg-sharp/modules
Estimated effort: 2-3 weeks for clean separation
Option B: Feature Flags (Alternative)
Add compile-time flags to conditionally include printing:
#if PRINTING_ENABLED
// Printer-specific code
#endif
Pros: Maintains single codebase Cons: More complex maintenance, larger binary
What You'd Lose
Removing printing/slicing means losing:
- Printer connection and control
- G-code generation and preview
- Layer-by-layer visualization
- Print time/material estimation
- Temperature monitoring
- Print queue management
- Printer setup wizard
- 150+ slicer settings
What You'd Keep
Design-only mode retains:
- Full 3D viewport with camera controls
- All parametric primitives (cube, sphere, cylinder, text, etc.)
- Boolean operations (union, subtract, intersect)
- Mesh operations (repair, decimate, hollow, twist, etc.)
- Transform tools (scale, rotate, mirror, array)
- File I/O (STL, OBJ, AMF, 3MF, MCX)
- Library browsing and management
- Undo/redo system
- Theme system
- Tabbed workspaces (design-only)
Implementation Plan
Phase 1: Remove Submodules & Projects (Day 1)
Remove from solution:
Submodules/MatterSlice/ # Slicing engine
MatterControl.Printing/ # G-code processing
Update .gitmodules to remove MatterSlice reference.
Phase 2: Remove Printing Directories (Days 1-2)
Delete directories:
MatterControlLib/PrinterCommunication/ # Serial I/O, drivers
MatterControlLib/Queue/ # Print queue
MatterControlLib/SlicerConfiguration/ # 150+ slicer settings
MatterControlLib/PrinterControls/ # Printer UI widgets
MatterControlLib/ConfigurationPage/PrintLeveling/
MatterControlLib/SetupWizard/ # Printer setup wizard
MatterControlLib/EeProm/ # Printer EEPROM
Phase 3: Modify Core Files (Days 2-5)
Key files to modify:
-
ApplicationController.cs
- Remove cloud delegate registrations
- Remove
PrinterConfigcreation logic - Remove printer workspace support
- Keep design workspace support only
-
MainViewWidget.cs
- Remove
CreatePrinterTab()calls - Keep only
CreateDesignTab() - Remove printer-related status bar items
- Remove
-
PartPreviewWindow/PrinterTabPage.cs
- DELETE entire file (or keep as reference)
-
PartPreviewWindow/DesignTabPage.cs
- Remove any printing-related conditionals
- This becomes the only tab type
-
ApplicationView/PrinterConfig.cs
- DELETE or heavily refactor
- Remove
PrinterConnectioninstantiation
-
SettingsManagement/
- Remove slicer-related settings
- Keep only design/application settings
Phase 4: Fix Compilation Errors (Days 5-10)
Expect ~200-300 compilation errors from removed dependencies. Systematically:
- Remove
usingstatements for deleted namespaces - Remove printer-related null checks
- Remove printer-specific UI conditionals
- Stub or remove features that depended on printing
Phase 5: Clean Up & Test (Days 10-14)
- Remove dead code and unused references
- Update project files (.csproj)
- Test all design features:
- 3D viewport and camera
- All primitives (cube, sphere, cylinder, text, etc.)
- Boolean operations
- Mesh operations (repair, decimate, etc.)
- File I/O (STL, OBJ, AMF, 3MF)
- Library browsing
- Undo/redo
- Remove printing-related localization strings
Verification Steps
After implementation, verify:
- Build succeeds without MatterSlice or Printing references
- App launches without printer setup wizard
- Design tab works:
- Create new design workspace
- Add primitives to scene
- Apply boolean operations
- Save/load files (STL, OBJ, etc.)
- Library works:
- Browse files
- Drag-and-drop import
- No printer references in UI menus or settings
Risk Assessment
| Risk | Mitigation |
|---|---|
| Hidden printing dependencies | Incremental removal with frequent builds |
| Broken design features | Comprehensive testing after each phase |
| Missing shared code | Keep agg-sharp, VectorMath, PolygonMesh intact |
| Settings system breakage | Carefully separate design vs printer settings |
Conclusion
Feasibility: YES - Estimated 2-3 weeks
The architecture supports this well. The main effort is removing ~6 directories and fixing ~200-300 compilation errors from broken references. Design features (DesignTools, View3DWidget, Library) have clean separation and should work unchanged.