Add planning documents

This commit is contained in:
Nettika 2026-01-28 14:06:53 -08:00
parent edee50802f
commit 9ca012e6c6
No known key found for this signature in database
4 changed files with 499 additions and 1 deletions

View file

@ -0,0 +1,302 @@
# 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:
```csharp
// 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) vs `PrinterTabPage` (printing)
- `PartWorkspace` supports `Printer == null` for design workspaces
- Design tools have ZERO printing dependencies
**Challenges:**
- `PrinterConfig` constructor always creates `PrinterConnection`
- 465+ printer-related null checks throughout codebase
- Print queue, temperature monitoring tightly coupled
**Approach:**
1. Remove `PrinterTabPage`, `PrinterActionsBar`, `SliceLayerSelector`
2. Remove `PrinterCommunication/` directory
3. Remove `MatterControl.Printing/` project
4. Modify `PrinterConfig` to be optional or remove entirely
5. Keep only `DesignTabPage` workspaces
**Files affected:** ~50-80 files
---
### 3. Slicing (MatterSlice) - VERY DIFFICULT
**Deep integration:**
- **248 files** reference slicing functionality
- **150+ settings** mapped in `EngineMappingsMatterSlice`
- `PrinterSettings.SliceEngines` assumed 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:
1. **Remove projects:**
- `Submodules/MatterSlice/`
- `MatterControl.Printing/`
2. **Remove directories:**
- `MatterControlLib/PrinterCommunication/`
- `MatterControlLib/Queue/`
- `MatterControlLib/SlicerConfiguration/`
- `MatterControlLib/PrinterControls/`
- `MatterControlLib/ConfigurationPage/PrintLeveling/`
- `MatterControlLib/SetupWizard/`
3. **Modify:**
- Remove `PrinterTabPage` from `PartPreviewWindow/`
- Remove printer workspace creation from `ApplicationController`
- Remove printer-related settings from `SettingsManagement/`
- Update `MainViewWidget` to only create design tabs
4. **Keep intact:**
- `DesignTools/` - All parametric design
- `Library/` - Content management
- `View3DWidget` - 3D viewport
- `DataStorage/` - 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:
```csharp
#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:**
1. **ApplicationController.cs**
- Remove cloud delegate registrations
- Remove `PrinterConfig` creation logic
- Remove printer workspace support
- Keep design workspace support only
2. **MainViewWidget.cs**
- Remove `CreatePrinterTab()` calls
- Keep only `CreateDesignTab()`
- Remove printer-related status bar items
3. **PartPreviewWindow/PrinterTabPage.cs**
- DELETE entire file (or keep as reference)
4. **PartPreviewWindow/DesignTabPage.cs**
- Remove any printing-related conditionals
- This becomes the only tab type
5. **ApplicationView/PrinterConfig.cs**
- DELETE or heavily refactor
- Remove `PrinterConnection` instantiation
6. **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:
1. Remove `using` statements for deleted namespaces
2. Remove printer-related null checks
3. Remove printer-specific UI conditionals
4. Stub or remove features that depended on printing
### Phase 5: Clean Up & Test (Days 10-14)
1. Remove dead code and unused references
2. Update project files (.csproj)
3. 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
4. Remove printing-related localization strings
---
## Verification Steps
After implementation, verify:
1. **Build succeeds** without MatterSlice or Printing references
2. **App launches** without printer setup wizard
3. **Design tab works:**
- Create new design workspace
- Add primitives to scene
- Apply boolean operations
- Save/load files (STL, OBJ, etc.)
4. **Library works:**
- Browse files
- Drag-and-drop import
5. **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.

View file

@ -44,6 +44,13 @@ MatterControl is a comprehensive 3D printing workflow application built by Matte
|-----------|----------|-------------|
| agg-sharp | [agg-sharp.md](agg-sharp.md) | Graphics library: 2D rendering, GUI widgets, 3D mesh, VectorMath, OpenGL, Typography |
## Planning
| Document | Description |
| -------- | ----------- |
| [Design-Only Fork](design-only-fork.md) | Plan to strip MatterControl down to a pure 3D design/modeling application, removing all printing, slicing, and cloud features. |
| [Linux Migration](linux-migration.md) | Feasibility of migrating the project from its many Windows-only dependencies to cross platform alternatives to fully support Linux. |
## Key Entry Points
| File | Purpose |

189
research/linux-migration.md Normal file
View file

@ -0,0 +1,189 @@
# MatterControl Linux Migration Notes
## Current State
The project is a C# .NET 6.0 desktop application for 3D printing control. It currently targets Windows but has cross-platform foundations.
## Build Errors on Linux
```
error NETSDK1100: To build a project targeting Windows on this operating system, set the EnableWindowsTargeting property to true.
```
Affected projects:
- `MatterControl.Winforms/MatterControl.Winforms.csproj`
- `Submodules/agg-sharp/PlatformWin32/PlatformWin32.csproj`
- `Submodules/agg-sharp/Tests/TestInvoker/TestInvoker.csproj`
## Architecture Overview
### Platform Abstraction Layer
The project uses a provider pattern for platform-specific functionality:
1. **Window Providers** (in `Program.cs:167-172`):
- `MatterHackers.GlfwProvider.GlfwWindowProvider` - Cross-platform (GLFW)
- `MatterHackers.MatterControl.WinformsSingleWindowProvider` - Windows-only (WinForms)
2. **Platform Features** (`Program.cs:276`):
- `MatterHackers.MatterControl.WindowsPlatformsFeatures` - Windows implementation
### Key Projects
| Project | Target | Notes |
|---------|--------|-------|
| `MatterControl.csproj` | `net6.0-windows` | Main entry point, needs `net6.0` |
| `MatterControlLib.csproj` | `net6.0-windows` | Core library, needs `net6.0` |
| `MatterControl.Winforms.csproj` | `net6.0-windows` | WinForms provider, Windows-only |
| `GlfwProvider.csproj` | `net6.0` | Already cross-platform! |
| `PlatformWin32.csproj` | `net6.0-windows` | Windows-only |
### GLFW Provider (Cross-Platform)
Located at `Submodules/agg-sharp/Glfw/GlfwProvider.csproj` - already targets `net6.0` and provides cross-platform windowing via GLFW library.
## Windows-Specific Code in Program.cs
```csharp
// P/Invoke - Windows only
[DllImport("kernel32.dll")]
static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
[DllImport("Shcore.dll")]
static extern int SetProcessDpiAwareness(int PROCESS_DPI_AWARENESS);
```
These are used for:
- Preventing system sleep during prints (`KeepAwake`)
- High-DPI display support
## Windows-Specific Code in WindowsPlatformsFeatures.cs
- `System.Media.SoundPlayer` - Windows-only audio
- `WindowsFormsClipboard` - WinForms clipboard
- `WinformsEventSink.AllowInspector` - Debug inspector
- `InspectForm` - WinForms debug form
## Migration Strategy
### Phase 1: Project File Changes
1. Change target frameworks from `net6.0-windows` to `net6.0`:
- `MatterControl.csproj`
- `MatterControlLib.csproj`
2. Use conditional project references:
```xml
<ProjectReference Condition="'$(OS)' == 'Windows_NT'" Include="MatterControl.Winforms.csproj" />
```
3. Remove or conditionally exclude:
- `PrinterDriverInstaller` (Windows driver installer)
- `MatterControl.Winforms` reference on Linux
### Phase 2: Code Changes
1. **Program.cs** - Add platform detection:
```csharp
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
AggContext.Config.ProviderTypes.SystemWindowProvider =
"MatterHackers.GlfwProvider.GlfwWindowProvider, MatterHackers.GlfwProvider";
// Use Linux platform features
}
```
2. **Create LinuxPlatformFeatures.cs**:
- Implement `INativePlatformFeatures` for Linux
- Handle clipboard via X11/Wayland or cross-platform library
- Stub out Windows-specific features (sound, camera)
3. **Conditional P/Invoke**:
```csharp
static void KeepAwake(bool keepAwake)
{
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
return;
// Windows implementation
}
```
### Phase 3: Dependencies
1. **GLFW native library**: Need `libglfw.so` on Linux
```bash
# Debian/Ubuntu
sudo apt-get install libglfw3
# Or via Nix
pkgs.glfw
```
2. **OpenGL**: Need OpenGL drivers
```bash
sudo apt-get install libgl1-mesa-dev
```
3. **Serial ports**: Already have `System.IO.Ports` package (cross-platform)
### Phase 4: shell.nix Updates
```nix
{
pkgs ? import <nixpkgs> { },
}:
pkgs.mkShell {
packages = with pkgs; [
dotnet-sdk_8
glfw
libGL
xorg.libX11
xorg.libXcursor
xorg.libXrandr
xorg.libXinerama
xorg.libXi
];
LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath [
pkgs.glfw
pkgs.libGL
];
}
```
## Files to Create
1. `MatterControl.Linux/LinuxPlatformFeatures.cs` - Linux platform implementation
2. `MatterControl.Linux/MatterControl.Linux.csproj` - Linux-specific project (optional)
## Files to Modify
1. `MatterControl.csproj` - Change TFM, conditional references
2. `MatterControlLib/MatterControlLib.csproj` - Change TFM
3. `Program.cs` - Platform detection, conditional code
4. `shell.nix` - Add native dependencies
## Alternative: Minimal Changes Approach
Instead of full platform abstraction, use `#if` directives:
```csharp
#if WINDOWS
// Windows-specific code
#else
// Linux/cross-platform code
#endif
```
And build with:
```bash
dotnet build -p:DefineConstants=LINUX
```
## Open Questions
1. Should the GLFW provider be the default for all platforms?
2. What Linux-specific features need implementation (file dialogs, etc.)?
3. Is the old `PlatformGtk` worth updating or should we focus on GLFW?
4. Should we create a separate solution file for Linux builds?