Made paint material work much better
This commit is contained in:
parent
0897a32c88
commit
acf3ea14fa
2 changed files with 75 additions and 33 deletions
|
|
@ -92,7 +92,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
|
||||||
|
|
||||||
private void AddPaintSelector(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();
|
var children = group.Children.ToList();
|
||||||
|
|
||||||
tabContainer.AddChild(new TextWidget("Set as Paint")
|
tabContainer.AddChild(new TextWidget("Set as Paint")
|
||||||
{
|
{
|
||||||
|
|
@ -101,39 +101,70 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
|
||||||
AutoExpandBoundsToText = true,
|
AutoExpandBoundsToText = true,
|
||||||
});
|
});
|
||||||
|
|
||||||
for (int i = 0; i < differenceItems.Count; i++)
|
// create this early so we can use enable disable it on button changed state
|
||||||
{
|
|
||||||
var itemIndex = i;
|
|
||||||
var item = differenceItems[itemIndex];
|
|
||||||
FlowLayoutWidget rowContainer = new FlowLayoutWidget();
|
|
||||||
|
|
||||||
var checkBox = new CheckBox(string.IsNullOrWhiteSpace(item.Name) ? $"{itemIndex}" : $"{item.Name}")
|
|
||||||
{
|
|
||||||
Checked = item.OutputType == PrintOutputTypes.Hole,
|
|
||||||
TextColor = ActiveTheme.Instance.PrimaryTextColor
|
|
||||||
};
|
|
||||||
rowContainer.AddChild(checkBox);
|
|
||||||
|
|
||||||
checkBox.CheckedStateChanged += (s, e) =>
|
|
||||||
{
|
|
||||||
// make sure the mesh on the group is not visible
|
|
||||||
group.ResetMeshWrappers();
|
|
||||||
// and set the output type for this checkbox
|
|
||||||
item.OutputType = checkBox.Checked ? PrintOutputTypes.Hole : PrintOutputTypes.Solid;
|
|
||||||
};
|
|
||||||
|
|
||||||
tabContainer.AddChild(rowContainer);
|
|
||||||
}
|
|
||||||
|
|
||||||
var updateButton = theme.ButtonFactory.Generate("Update".Localize());
|
var updateButton = theme.ButtonFactory.Generate("Update".Localize());
|
||||||
updateButton.Margin = new BorderDouble(5);
|
updateButton.Margin = new BorderDouble(5);
|
||||||
updateButton.HAnchor = HAnchor.Right;
|
updateButton.HAnchor = HAnchor.Right;
|
||||||
|
updateButton.Enabled = false; // starts out disabled as there are no holes selected
|
||||||
updateButton.Click += (s, e) =>
|
updateButton.Click += (s, e) =>
|
||||||
{
|
{
|
||||||
// make sure the mesh on the group is not visible
|
// make sure the mesh on the group is not visible
|
||||||
group.ResetMeshWrappers();
|
group.ResetMeshWrappers();
|
||||||
ProcessBooleans(group);
|
ProcessBooleans(group);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
List<GuiWidget> radioSiblings = new List<GuiWidget>();
|
||||||
|
for (int i = 0; i < children.Count; i++)
|
||||||
|
{
|
||||||
|
var itemIndex = i;
|
||||||
|
var item = children[itemIndex];
|
||||||
|
FlowLayoutWidget rowContainer = new FlowLayoutWidget();
|
||||||
|
|
||||||
|
GuiWidget selectWidget;
|
||||||
|
if (children.Count == 2)
|
||||||
|
{
|
||||||
|
var radioButton = new RadioButton(string.IsNullOrWhiteSpace(item.Name) ? $"{itemIndex}" : $"{item.Name}")
|
||||||
|
{
|
||||||
|
Checked = item.OutputType == PrintOutputTypes.Hole,
|
||||||
|
TextColor = ActiveTheme.Instance.PrimaryTextColor
|
||||||
|
};
|
||||||
|
radioSiblings.Add(radioButton);
|
||||||
|
radioButton.SiblingRadioButtonList = radioSiblings;
|
||||||
|
selectWidget = radioButton;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectWidget = new CheckBox(string.IsNullOrWhiteSpace(item.Name) ? $"{itemIndex}" : $"{item.Name}")
|
||||||
|
{
|
||||||
|
Checked = item.OutputType == PrintOutputTypes.Hole,
|
||||||
|
TextColor = ActiveTheme.Instance.PrimaryTextColor
|
||||||
|
};
|
||||||
|
}
|
||||||
|
rowContainer.AddChild(selectWidget);
|
||||||
|
ICheckbox checkBox = selectWidget as ICheckbox;
|
||||||
|
|
||||||
|
checkBox.CheckedStateChanged += (s, e) =>
|
||||||
|
{
|
||||||
|
// make sure the mesh on the group is not visible
|
||||||
|
group.ResetMeshWrappers();
|
||||||
|
|
||||||
|
var wrappedItems = item.Descendants().Where((obj) => obj.OwnerID == group.ID).ToList();
|
||||||
|
foreach (var meshWrapper in wrappedItems)
|
||||||
|
{
|
||||||
|
// and set the output type for this checkbox
|
||||||
|
meshWrapper.OutputType = checkBox.Checked ? PrintOutputTypes.Hole : PrintOutputTypes.Solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
var allItems = group.Descendants().Where((obj) => obj.OwnerID == group.ID).ToList();
|
||||||
|
int holeCount = allItems.Where((o) => o.OutputType == PrintOutputTypes.Hole).Count();
|
||||||
|
int solidCount = allItems.Where((o) => o.OutputType != PrintOutputTypes.Hole).Count();
|
||||||
|
updateButton.Enabled = allItems.Count() != holeCount && allItems.Count() != solidCount;
|
||||||
|
};
|
||||||
|
|
||||||
|
tabContainer.AddChild(rowContainer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// add this last so it is at the bottom
|
||||||
tabContainer.AddChild(updateButton);
|
tabContainer.AddChild(updateButton);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -151,11 +182,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
|
||||||
{
|
{
|
||||||
foreach (var paint in paintObjects)
|
foreach (var paint in paintObjects)
|
||||||
{
|
{
|
||||||
|
var transformedPaint = Mesh.Copy(paint.Mesh, CancellationToken.None);
|
||||||
|
transformedPaint.Transform(paint.WorldMatrix());
|
||||||
|
var inverseRemove = paint.WorldMatrix();
|
||||||
|
inverseRemove.Invert();
|
||||||
|
paint.Mesh = null;
|
||||||
|
|
||||||
foreach (var keep in keepObjects)
|
foreach (var keep in keepObjects)
|
||||||
{
|
{
|
||||||
var transformedPaint = Mesh.Copy(paint.Mesh, CancellationToken.None);
|
|
||||||
transformedPaint.Transform(paint.WorldMatrix());
|
|
||||||
|
|
||||||
var transformedKeep = Mesh.Copy(keep.Mesh, CancellationToken.None);
|
var transformedKeep = Mesh.Copy(keep.Mesh, CancellationToken.None);
|
||||||
transformedKeep.Transform(keep.WorldMatrix());
|
transformedKeep.Transform(keep.WorldMatrix());
|
||||||
|
|
||||||
|
|
@ -166,12 +200,20 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
|
||||||
intersectAndSubtract.subtract.Transform(inverseKeep);
|
intersectAndSubtract.subtract.Transform(inverseKeep);
|
||||||
keep.Mesh = intersectAndSubtract.subtract;
|
keep.Mesh = intersectAndSubtract.subtract;
|
||||||
|
|
||||||
var inverseRemove = paint.WorldMatrix();
|
// keep all the intersections together
|
||||||
inverseRemove.Invert();
|
if(paint.Mesh == null)
|
||||||
intersectAndSubtract.intersect.Transform(inverseRemove);
|
{
|
||||||
paint.Mesh = intersectAndSubtract.intersect;
|
paint.Mesh = intersectAndSubtract.intersect;
|
||||||
|
}
|
||||||
|
else // union into the current paint
|
||||||
|
{
|
||||||
|
paint.Mesh = PolygonMesh.Csg.CsgOperations.Union(paint.Mesh, intersectAndSubtract.intersect);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// move the paint mesh back to its original coordinates
|
||||||
|
paint.Mesh.Transform(inverseRemove);
|
||||||
|
|
||||||
// now set it to the new solid color
|
// now set it to the new solid color
|
||||||
paint.OutputType = PrintOutputTypes.Solid;
|
paint.OutputType = PrintOutputTypes.Solid;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit efd93e4f15744711f4079109aa035b9b48500135
|
Subproject commit 4be9b559a44466c85015e4e2277154d43c7abe9b
|
||||||
Loading…
Add table
Add a link
Reference in a new issue