This commit removes the Parent/Child issue structures that were added to Issue, and instead opts for a more lean approach to determining the layers affected by an operation. Instead of building out the entire parent/child tree for ever single suction cup issue, we know only calculate what we need when we need it.
During a repair operation, we calculate only the suction cup issues that have no overlapping suction cup issue below it. For "delete issue" behavior we only calculate the suction cup issues that overlap the selected on in both directions (following that direction until no more overlaps are found).
You can now remove suction cups from the reported issues. It will remove the selected issue as well as any others that are connected. This will allow for users to remove suction cup issues they do not wish to be fixed via auto repair (when available).
Currently disabled by default, this needs a corresponding UI component to toggle on/off, as well as a configuration setting for the size of the hole to drill.
This change makes each suction cup issue know its parent (if applicable) and its children (if applicable). This is useful to group connected suction cup issues for later use (possible repair)
This method determines a minimum bounding box that can contain both contours, it then draws each contour to its on Mat, offset appropriately for the determined bounding rectangle. A bitwise AND then checks to see if there is any overlap.
- **UI:**
- (Add) Context menu for ROI button at status bar with the following:
- Mask: Select layer positive areas
- Mask: Select layer hollow areas
- ROI: Select model volume
- ROI: Select layer volume
- Clear Mask
- Clear ROI
- (Add) Allow to choose custom locations for "Send to"
- (Add) Network remote printers: Send files remotely directly to printer
- (Add) Layer image shortcut: Right-click + ALT + CTRL on a specific object to select all it enclosing areas as a Mask
- (Improvement) Redesign numerical input box with value labels into the box
- (Improvement) Layer tracker highlight issues: Scale line stroke to make sequential layers with issues shows all togther as a group
- (Fix) Outline - Hollow areas: Not outlining the second closing contour for contours with child
- (Fix) Pixel editor - Eraser: It was selecting the whole blob even if have inner parents
- (Fix) Setting window: When open it will change tabs quickly to fix the windows height/scroll problem
- (Fix) Minor problems with autosizes on some input boxes
- **Tools:**
- **Import layers:**
- (Add) 'MergeMax' to import type (#289)
- (Add) 'AbsDiff' to import type
- (Add) Description of operations on the combo box
- **Dynamic Lifts:**
- (Add) Set methods: Traditional and FullRange (#291)
- (Improvement) Rearrange the layout
- (Fix) Normal pixels were being used to calculate bottom lift speed
- (Improvement) Solidify: Area threshold are now calculated by the real area instead of rectangle area
- (Improvement) Dynamic layer height: Perform the maximum of layer pixels instead of sum to improve files with AA and prevent glare
- **Resin traps & Suction cups:**
- **By Timothy Slater [tslater2006] (#292):**
- (Add) Suction cups detection: Air trapped inside hollow areas that create a suction force. Calculated during resin trap algorithm.
This issues will not be auto fixed and require a vent hole as proper fix
- (Improvement) New and improved algorithm for resin trap detection
- **Settings:**
- (Add) Option: Loads the last recent file on startup if no file was specified
- (Change) Resin trap hightlight default color
- (Fix) Unable to set resin trap threshold to 0 (disabled)
- (Improvement) Better random generation for benchmark
- (Improvement) Allow to cancel the new version download
- (Improvement) Better version checker and file download methods
- (Fix) Disable Centroids by default on settings
- (Fix) Settings: Automations were not being cloned when required
- (Upgrade) .NET from 5.0.9 to 5.0.10
Some sliced files can contain a completely empty layer. In such cases there are no "externals" and no "hollows", so appropriate null checks are needed.
Adjust airmap logic during 2nd pass to account for contours that were determined to be air-connected during first pass.
Always move resolved resin traps to suction traps, and only conditionally report them as issues if configured to do so. Suction traps are used during a cleanup stage for resin traps, so needs to be populated no matter what, there is no additional processing penalty for this.
The following is a novel implementation of resin/suction trap detection for MSLA sliced images It largely consists of 2 passes through the layers.
The 1st pass processes the layers from the bottom to the top, keeping track of what areas in the previous layer are air (or connected to air in some way). The initial air map is derived from the starting layer, by inverting the layer and then filling all external contours black (not air) which results in an inital air map of everything that is not solid, or inside a solid, being considered air. While traversing the layers, the air map is updated to include any new air regions, or hollow areas that intersect with the air map (since while they are not air, they are connected to air). Any regions that do not overlap the air map are declared resin traps.
The 2nd pass processes the layers from the top to the bottom, the initial air map differs from the 1st pass. For the 2nd pass, anything that is not solid is considered to be air (a bitwise not of the top layer is used). The airmap is updated per layer just like it was in the 1st pass, however we do not test all contours of the layer, only those that were marked as resin traps by the 1st pass. This is acceptable because in the event we did test all hollow areas, and one of those was *not* detected on 1st pass, it must be air-accessible from the bottom. In the even that a contour we are testing does overlap the air map during the 2nd pass, it is cleared from the "resin trap" list and instead added to the "suction trap" list. This is to indicate that while there is access to air from the top, there are regions that could be affected by vacuum/suction forces during the print