diff --git a/PartPreviewWindow/View3D/Actions/PaintMaterialEditor.cs b/PartPreviewWindow/View3D/Actions/PaintMaterialEditor.cs index e896f2249..11de0f349 100644 --- a/PartPreviewWindow/View3D/Actions/PaintMaterialEditor.cs +++ b/PartPreviewWindow/View3D/Actions/PaintMaterialEditor.cs @@ -58,14 +58,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D if (group is MeshWrapperOperation) { - AddHoleSelector(view3DWidget, mainContainer, theme); + AddPaintSelector(view3DWidget, mainContainer, theme); } return mainContainer; } public IEnumerable SupportedTypes() => new Type[] - { + { typeof(MeshWrapperOperation), }; @@ -89,11 +89,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D return rowContainer; } - private void AddHoleSelector(View3DWidget view3DWidget, FlowLayoutWidget tabContainer, ThemeConfig theme) + private void AddPaintSelector(View3DWidget view3DWidget, FlowLayoutWidget tabContainer, ThemeConfig theme) { var differenceItems = group.Descendants().Where((obj) => obj.OwnerID == group.ID).ToList(); - tabContainer.AddChild(new TextWidget("Set as Hole") + tabContainer.AddChild(new TextWidget("Set as Paint") { TextColor = ActiveTheme.Instance.PrimaryTextColor, HAnchor = HAnchor.Left, @@ -142,41 +142,40 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D await Task.Run(() => { var participants = group.Descendants().Where((obj) => obj.OwnerID == group.ID).ToList(); - var removeObjects = participants.Where((obj) => obj.OutputType == PrintOutputTypes.Hole).ToList(); + var paintObjects = participants.Where((obj) => obj.OutputType == PrintOutputTypes.Hole).ToList(); var keepObjects = participants.Where((obj) => obj.OutputType != PrintOutputTypes.Hole).ToList(); - if (removeObjects.Any() + if (paintObjects.Any() && keepObjects.Any()) { - foreach (var remove in removeObjects) + foreach (var paint in paintObjects) { foreach (var keep in keepObjects) { - var transformedRemove = Mesh.Copy(remove.Mesh, CancellationToken.None); - transformedRemove.Transform(remove.WorldMatrix()); + if (paint.MaterialIndex != keep.MaterialIndex) + { + var transformedPaint = Mesh.Copy(paint.Mesh, CancellationToken.None); + transformedPaint.Transform(paint.WorldMatrix()); - var transformedKeep = Mesh.Copy(keep.Mesh, CancellationToken.None); - transformedKeep.Transform(keep.WorldMatrix()); + var transformedKeep = Mesh.Copy(keep.Mesh, CancellationToken.None); + transformedKeep.Transform(keep.WorldMatrix()); - // remove the paint from the original - var transformedKeep2 = PolygonMesh.Csg.CsgOperations.Subtract(transformedKeep, transformedRemove); - var inverseKeep = keep.WorldMatrix(); - inverseKeep.Invert(); - transformedKeep2.Transform(inverseKeep); - keep.Mesh = transformedKeep2; + // remove the paint from the original + var intersectAndSubtract = PolygonMesh.Csg.CsgOperations.IntersectAndSubtract(transformedKeep, transformedPaint); + var inverseKeep = keep.WorldMatrix(); + inverseKeep.Invert(); + intersectAndSubtract.subtract.Transform(inverseKeep); + keep.Mesh = intersectAndSubtract.subtract; - // intersect the paint with the original - transformedRemove = PolygonMesh.Csg.CsgOperations.Intersect(transformedKeep, transformedRemove); - var inverseRemove = remove.WorldMatrix(); - inverseRemove.Invert(); - transformedRemove.Transform(inverseRemove); - remove.Mesh = transformedRemove; + var inverseRemove = paint.WorldMatrix(); + inverseRemove.Invert(); + intersectAndSubtract.intersect.Transform(inverseRemove); + paint.Mesh = intersectAndSubtract.intersect; + } } - // set it to the correct extruder - remove.MaterialIndex = 1; // now set it to the new solid color - remove.OutputType = PrintOutputTypes.Solid; + paint.OutputType = PrintOutputTypes.Solid; } } }); diff --git a/PartPreviewWindow/View3D/View3DWidget.cs b/PartPreviewWindow/View3D/View3DWidget.cs index 91fa6dfc5..3fa8c4b36 100644 --- a/PartPreviewWindow/View3D/View3DWidget.cs +++ b/PartPreviewWindow/View3D/View3DWidget.cs @@ -66,7 +66,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public readonly int EditButtonHeight = 44; - private ObservableCollection extruderButtons = new ObservableCollection(); + private ObservableCollection materialButtons = new ObservableCollection(); private bool hasDrawn = false; internal bool partHasBeenEdited = false; @@ -189,7 +189,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow }; this.InteractionLayer.AddChild(processingProgressControl); - var buttonSpacing = ApplicationController.Instance.Theme.ButtonSpacing; + var buttonSpacing = theme.ButtonSpacing; Button addButton = smallMarginButtonFactory.Generate("Insert".Localize(), AggContext.StaticData.LoadIcon("cube.png", 14, 14, IconColor.Theme)); addButton.Margin = 0; @@ -1664,7 +1664,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow }; widget.AddChild(buttonPanel); - extruderButtons.Clear(); + materialButtons.Clear(); int extruderCount = 4; for (int extruderIndex = 0; extruderIndex < extruderCount; extruderIndex++) { @@ -1678,8 +1678,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow string materialLabelText = string.Format("{0} {1}", "Material".Localize(), extruderIndex + 1); RadioButton materialSelection = new RadioButton(materialLabelText, textColor: RGBA_Bytes.Black); - extruderButtons.Add(materialSelection); - materialSelection.SiblingRadioButtonList = extruderButtons; + materialButtons.Add(materialSelection); + materialSelection.SiblingRadioButtonList = materialButtons; colorSelectionContainer.AddChild(materialSelection); colorSelectionContainer.AddChild(new HorizontalSpacer()); int extruderIndexCanPassToClick = extruderIndex; @@ -1763,22 +1763,22 @@ namespace MatterHackers.MatterControl.PartPreviewWindow var selectedItem = Scene.SelectedItem; - if (extruderButtons?.Count > 0) + if (materialButtons?.Count > 0) { bool setSelection = false; // Set the material selector to have the correct material button selected - for (int i = 0; i < extruderButtons.Count; i++) + for (int i = 0; i < materialButtons.Count; i++) { if (selectedItem.MaterialIndex == i) { - ((RadioButton)extruderButtons[i]).Checked = true; + ((RadioButton)materialButtons[i]).Checked = true; setSelection = true; } } if(!setSelection) { - ((RadioButton)extruderButtons[0]).Checked = true; + ((RadioButton)materialButtons[0]).Checked = true; } } diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 43d695c8e..a697aa74d 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 43d695c8e589fd5c05859a03bb25ab67dd7f8d52 +Subproject commit a697aa74d7fb187f8779abc389fbd37b2662230d