diff --git a/PartPreviewWindow/View3D/View3DWidget.cs b/PartPreviewWindow/View3D/View3DWidget.cs index 1d5730a28..4851fb2ea 100644 --- a/PartPreviewWindow/View3D/View3DWidget.cs +++ b/PartPreviewWindow/View3D/View3DWidget.cs @@ -1663,23 +1663,35 @@ namespace MatterHackers.MatterControl.PartPreviewWindow alignButtons.AddChild(new HorizontalSpacer()); } + var dualExtrusionAlignButton = ApplicationController.Instance.Theme.MenuButtonFactory.Generate("Align for Dual Extrusion".Localize()); + dualExtrusionAlignButton.Margin = new BorderDouble(21, 0); + dualExtrusionAlignButton.HAnchor = HAnchor.Left; + buttonPanel.AddChild(dualExtrusionAlignButton); + + AddAlignDelegates(0, AxisAlignment.SourceCoordinateSystem, dualExtrusionAlignButton); + return widget; } - internal enum AxisAlignment { Min, Center, Max }; + internal enum AxisAlignment { Min, Center, Max, SourceCoordinateSystem }; private GuiWidget CreateAlignButton(int axisIndex, AxisAlignment alignment, string lable) { var smallMarginButtonFactory = ApplicationController.Instance.Theme.MenuButtonFactory; var alignButton = smallMarginButtonFactory.Generate(lable); alignButton.Margin = new BorderDouble(3, 0); - int extruderIndexCanPassToClick = axisIndex; + AddAlignDelegates(axisIndex, alignment, alignButton); + + return alignButton; + } + + private void AddAlignDelegates(int axisIndex, AxisAlignment alignment, Button alignButton) + { alignButton.Click += (sender, e) => { if (Scene.HasSelection) { var transformDatas = GetTransforms(axisIndex, alignment); - this.Scene.UndoBuffer.AddAndDo(new TransformUndoCommand(transformDatas)); //Scene.SelectedItem.MaterialIndex = extruderIndexCanPassToClick; @@ -1689,36 +1701,43 @@ namespace MatterHackers.MatterControl.PartPreviewWindow alignButton.MouseEnter += (s2, e2) => { - // make a preview of the new positions - var transformDatas = GetTransforms(axisIndex, alignment); - foreach (var transform in transformDatas) + if (Scene.HasSelection) { - var copy = transform.TransformedObject.Clone(); - copy.Matrix = transform.RedoTransform; - copy.Color = new RGBA_Bytes(copy.Color, 126); - Scene.Children.Add(copy); + // make a preview of the new positions + var transformDatas = GetTransforms(axisIndex, alignment); + foreach (var transform in transformDatas) + { + var copy = transform.TransformedObject.Clone(); + copy.Matrix = transform.RedoTransform; + copy.Color = new RGBA_Bytes(RGBA_Bytes.Gray, 126); + Scene.Children.Add(copy); + } } }; alignButton.MouseLeave += (s3, e3) => { - // clear the preview of the new positions - foreach(var child in Scene.Children.ToArray()) + if (Scene.HasSelection) { - if(child.Color.Alpha0To255 == 126) + // clear the preview of the new positions + foreach (var child in Scene.Children.ToArray()) { - Scene.Children.Remove(child); + if (child.Color.Alpha0To255 == 126) + { + Scene.Children.Remove(child); + } } } }; - - return alignButton; } private List GetTransforms(int axisIndex, AxisAlignment alignment) { var transformDatas = new List(); var totalAABB = Scene.SelectedItem.GetAxisAlignedBoundingBox(Matrix4X4.Identity); + + Vector3 firstSourceOrigin = new Vector3(double.MaxValue, double.MaxValue, double.MaxValue); + // move the objects to the right place foreach (var child in Scene.SelectedItem.Children) { @@ -1735,8 +1754,21 @@ namespace MatterHackers.MatterControl.PartPreviewWindow break; case AxisAlignment.Max: + offset[axisIndex] = totalAABB.maxXYZ[axisIndex] - childAABB.maxXYZ[axisIndex]; + break; + + case AxisAlignment.SourceCoordinateSystem: { - offset[axisIndex] = totalAABB.maxXYZ[axisIndex] - childAABB.maxXYZ[axisIndex]; + // move the object back to the origin + offset = -Vector3.Transform(Vector3.Zero, child.Matrix); + + // figure out how to move it back to the start center + if(firstSourceOrigin.x == double.MaxValue) + { + firstSourceOrigin = -offset; + } + + offset += firstSourceOrigin; } break; } diff --git a/StaticData/Translations/Master.txt b/StaticData/Translations/Master.txt index 24a301db6..c96890e60 100644 --- a/StaticData/Translations/Master.txt +++ b/StaticData/Translations/Master.txt @@ -4552,3 +4552,21 @@ Translated:empty for default English:The offset of each nozzle relative to the first nozzle. Only useful for multiple extruder machines. Translated:The offset of each nozzle relative to the first nozzle. Only useful for multiple extruder machines. +English:Nozzle Offsets +Translated:Nozzle Offsets + +English:Bend +Translated:Bend + +English:Cut Out +Translated:Cut Out + +English:Pinch +Translated:Pinch + +English:Bend Up +Translated:Bend Up + +English:Align for Dual Extrusion +Translated:Align for Dual Extrusion +