# Prop3D `uLib::Vtk::Prop3D` is a bridge class that wraps VTK 3D representations (`vtkProp`, `vtkProp3D`) and integrates them into the `uLib` object model. It allows the framework to manage visual objects, synchronize them with underlying data models, and expose display-specific properties to the GUI. ## Inheritance `uLib::Vtk::Prop3D` : `uLib::Object` ## Key Functionalities ### VTK Integration The class provides access to the underlying VTK objects: - `GetProp()`: Returns the `vtkProp`. - `GetProxyProp()`: Returns the `vtkProp3D`. - `GetParts()` / `GetProps()`: Returns `vtkPropCollection` for composite objects. ### Model-View Synchronization `Prop3D` ensures that the visual representation stays in sync with the domain model: - `Update()`: Synchronizes the VTK representation based on current internal state and properties. Should be called when model data changes. - `SyncFromVtk()`: Updates internal state using data from the VTK representation (e.g., after user interaction via gizmos in the 3D view). - `GetContent()`: Returns the `uLib::Object` that this `Prop3D` represents visually. ### Visual Appearance - **Color & Opacity**: `SetColor(r, g, b)` and `SetOpacity(alpha)`. - **Selection**: `SetSelectable(bool)` and `SetSelected(bool)` to manage interactivity and highlighting. - **BBox/Scale**: `ShowBoundingBox(bool)` and `ShowScaleMeasures(bool)`. ### Rendering Modes The rendering style can be controlled via the `Representation` enum: - `Points` - `Wireframe` - `Surface` - `SurfaceWithEdges` - `Volume` - `Outline` - `Slice` ### Display Properties System `Prop3D` implements a system to expose specific properties (often marked as `hrp` - human readable properties) to a property editor in the GUI. - `GetDisplayProperties()`: Returns the list of properties registered for display. - `RegisterDisplayProperty(uLib::PropertyBase*)`: Adds a property to the display list. - `serialize_display(...)`: A virtual method that subclasses implement to define which properties should be exposed. #### Activating Display Properties To automatically populate the display properties list, the `ULIB_ACTIVATE_DISPLAY_PROPERTIES` macro should be called in the constructor. This triggers `serialize_display` using a `display_properties_archive`. ## Implementation Details `Prop3D` uses the Pimpl idiom (via `Prop3DData *pd`) to hide VTK-specific implementation details and reduce header dependencies.