Files
unnamed-cad-software/CONTEXT.md
Tanner Collin 2a51808303 docs: Describe MVC architecture in CONTEXT.md
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
2026-02-13 18:11:48 -07:00

78 lines
6.4 KiB
Markdown

# OpenCAD Context
Project Goal: To build an open source cross-platform Fusion 360 3D CAD clone using C++, Qt, and OpenGL.
Features should be as close to Fusion 360 as possible.
Don't ask for unrelated files to be added to the chat.
## Architecture
The application is structured using a Model-View-Controller (MVC) architecture to ensure a clear separation of concerns, making the codebase easier to maintain and extend.
* **Model:** This layer represents the application's data and business logic. It knows nothing about the user interface.
* `Document`: Manages the collection of all features.
* `Feature`, `SketchFeature`: Represent individual components or operations in the CAD model.
* **View:** This layer is responsible for displaying the data from the Model and capturing user input. It should be as "dumb" as possible, delegating all actions to the Controller.
* `MainWindow`: The main application window, toolbars, and menus.
* `ViewportWidget`: The 3D OpenGL viewport for rendering the model.
* `FeatureBrowser`: The UI component that lists the features in the document.
* **Controller:** This layer acts as the intermediary between the Model and the View. It contains the application's core logic.
* `ApplicationController`: The "brains" of the application. It is created in `main()` and passed to the UI. It responds to user actions from the View, manipulates the Model, and uses signals and slots to notify the View of any state changes.
## Development Log
1 Initial Setup: We created the basic application structure with a MainWindow class. This window was set up with a top toolbar to act as a banner for tools and a central widget area as a
placeholder for the 3D viewport.
2 3D Viewport Implementation: We created a ViewportWidget class (inheriting from QOpenGLWidget) to handle 3D rendering. This widget replaced the initial placeholder. To test functionality,
we rendered a simple, multi-colored 3D cube in the center of the viewport.
3 Camera Controls: We implemented mouse-based camera controls in the ViewportWidget:
• Zoom: Mouse scroll wheel.
• Rotate: Middle mouse button drag.
• Pan: Shift + Middle mouse button drag.
4 View Cube: We added a view orientation cube (like in Fusion 360) to the top-right corner of the viewport.
• The first version used QPainter to draw 2D text labels ("TOP", "FRONT", etc.) over the 3D cube.
• We then improved this by rendering the labels as textures directly onto the faces of the 3D view cube, so they rotate with the cube.
5 Refactoring: To improve code organization, all logic related to the view cube (drawing, texturing, and axis lines) was extracted from ViewportWidget into its own dedicated ViewCube class.
6 UI Toolbar: We implemented a tabbed toolbar in the MainWindow to mimic the Fusion 360 UI.
• Created "SOLID", "SURFACE", and "TOOLS" tabs.
• Added "Create Sketch" and "Extrude" QToolButtons to the "SOLID" tab, complete with custom SVG icons loaded via a Qt resource file (.qrc).
7 Code Cleanup & Bug Fixes:
• Removed the initial colorful test cube from the main scene.
• Fixed a build error caused by a typo (QMatrix4xá4 instead of QMatrix4x4) that was introduced during the cleanup.
• Resolved a Qt6 compatibility issue by replacing a legacy Qt5 OpenGL header include with its modern equivalent.
8 Sketch Creation Workflow:
• Implemented a sketch creation dialog that prompts the user to select a plane (XY, XZ, YZ).
• The viewport camera automatically orients itself to be normal to the chosen plane.
• Created a dedicated `SketchGrid` class to draw a 2D grid on the active sketch plane, complete with major/minor grid lines, labeled axes, and an origin point.
• Fixed a bug where the XY and XZ camera orientations were incorrect.
9 Data Model and File Persistence:
• Designed and implemented a feature-based dependency graph model.
• Created a base `Feature` class and a concrete `SketchFeature` class.
• A `Document` class was created to manage the collection of features (the feature graph).
• Implemented JSON serialization for the document, allowing models to be saved to and loaded from disk.
• Added "New", "Open", "Save", and "Save As" functionality to the main file menu.
10 Feature Browser UI:
• Added a dockable feature browser (tree view) to the left side of the main window.
• The browser displays the current document as the root node and lists all features (e.g., "Sketch") as children.
• The `Document` class now uses Qt signals and slots to notify the `MainWindow` of changes, ensuring the feature browser is always synchronized with the underlying data model.
11 Floating Feature Browser:
• Replaced the dockable feature browser with a floating, semi-transparent overlay inside the viewport, mimicking Fusion 360's UI.
• The drawing logic was encapsulated into a dedicated `FeatureBrowser` class to improve modularity.
• Position was set to the top-left corner and font size was increased for better visibility.
• Fixed a linker error by adding the new `FeatureBrowser.cpp` source file to the `CMakeLists.txt` build configuration.
12 View Cube Rendering Fix:
• Resolved a rendering glitch where the View Cube appeared transparent on startup by enabling the OpenGL depth test (`GL_DEPTH_TEST`) and face culling (`GL_CULL_FACE`) at the beginning of each frame's render cycle.
13 Sketch Mode UI and State Management:
• Implemented a dedicated "SKETCH" UI mode. When a sketch is created, the main toolbar tabs are replaced with a single "SKETCH" tab.
• Added "Line", "Rectangle", "Circle", and "Save Sketch" tool buttons to the sketch tab, complete with new SVG icons.
• Fixed an issue where tool buttons only showed icons; they now display text labels below the icons for clarity.
• The sketch grid is now only rendered when in sketch mode.
14 Camera Animation and View Presets:
• Implemented smooth camera transitions when entering and exiting sketch mode. The camera animates to a view normal to the sketch plane and animates back to its original position when the sketch is saved.
• This was achieved by converting camera parameters into Qt properties and using `QPropertyAnimation`.
• Resolved a C++ build error caused by naming conflicts between camera state member variables and their accessor methods.
• The default startup camera view was changed to a standard isometric angle for a better initial perspective.