Accelerated Intersect and Subtract

Refactoring
This commit is contained in:
Lars Brubaker 2017-10-25 10:49:24 -07:00
parent 630f64fcaf
commit 06da80bd63
3 changed files with 35 additions and 36 deletions

View file

@ -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<Type> 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;
}
}
});

View file

@ -66,7 +66,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
public readonly int EditButtonHeight = 44;
private ObservableCollection<GuiWidget> extruderButtons = new ObservableCollection<GuiWidget>();
private ObservableCollection<GuiWidget> materialButtons = new ObservableCollection<GuiWidget>();
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;
}
}

@ -1 +1 @@
Subproject commit 43d695c8e589fd5c05859a03bb25ab67dd7f8d52
Subproject commit a697aa74d7fb187f8779abc389fbd37b2662230d