Merge pull request #2134 from jlewin/design_tools
Remove Rotate/Scale controls
This commit is contained in:
commit
305565154e
5 changed files with 10 additions and 511 deletions
|
|
@ -208,7 +208,6 @@
|
||||||
<Compile Include="PartPreviewWindow\OverflowDropdown.cs" />
|
<Compile Include="PartPreviewWindow\OverflowDropdown.cs" />
|
||||||
<Compile Include="PartPreviewWindow\View3D\GridOptionsPanel.cs" />
|
<Compile Include="PartPreviewWindow\View3D\GridOptionsPanel.cs" />
|
||||||
<Compile Include="PartPreviewWindow\View3D\PrinterActionsBar.cs" />
|
<Compile Include="PartPreviewWindow\View3D\PrinterActionsBar.cs" />
|
||||||
<Compile Include="PartPreviewWindow\View3D\SideBar\RotateControls.cs" />
|
|
||||||
<Compile Include="PrinterCommunication\Io\NotPrintingStream.cs" />
|
<Compile Include="PrinterCommunication\Io\NotPrintingStream.cs" />
|
||||||
<Compile Include="Library\Widgets\ListView\ListView.cs" />
|
<Compile Include="Library\Widgets\ListView\ListView.cs" />
|
||||||
<Compile Include="Library\Widgets\ListView\ListViewItem.cs" />
|
<Compile Include="Library\Widgets\ListView\ListViewItem.cs" />
|
||||||
|
|
@ -219,7 +218,6 @@
|
||||||
<Compile Include="PartPreviewWindow\ColorGradientWidget.cs" />
|
<Compile Include="PartPreviewWindow\ColorGradientWidget.cs" />
|
||||||
<Compile Include="PartPreviewWindow\PartPreviewContent.cs" />
|
<Compile Include="PartPreviewWindow\PartPreviewContent.cs" />
|
||||||
<Compile Include="PartPreviewWindow\View3D\DebugBvh.cs" />
|
<Compile Include="PartPreviewWindow\View3D\DebugBvh.cs" />
|
||||||
<Compile Include="PartPreviewWindow\View3D\SideBar\ScaleControls.cs" />
|
|
||||||
<Compile Include="PartPreviewWindow\View3D\UndoCommands\UngroupCommand.cs" />
|
<Compile Include="PartPreviewWindow\View3D\UndoCommands\UngroupCommand.cs" />
|
||||||
<Compile Include="PartPreviewWindow\View3D\UndoCommands\InsertCommand.cs" />
|
<Compile Include="PartPreviewWindow\View3D\UndoCommands\InsertCommand.cs" />
|
||||||
<Compile Include="PartPreviewWindow\View3D\UndoCommands\DeleteUndoCommand.cs" />
|
<Compile Include="PartPreviewWindow\View3D\UndoCommands\DeleteUndoCommand.cs" />
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,16 @@ using MatterHackers.Agg.UI;
|
||||||
|
|
||||||
namespace MatterHackers.MatterControl.PartPreviewWindow
|
namespace MatterHackers.MatterControl.PartPreviewWindow
|
||||||
{
|
{
|
||||||
public partial class MirrorControls : PopupActionPanel
|
public class PopupActionPanel : FlowLayoutWidget, IIgnoredPopupChild
|
||||||
|
{
|
||||||
|
public PopupActionPanel() : base(FlowDirection.TopToBottom)
|
||||||
|
{
|
||||||
|
this.Padding = 15;
|
||||||
|
this.BackgroundColor = ActiveTheme.Instance.SecondaryBackgroundColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class MirrorControls : PopupActionPanel
|
||||||
{
|
{
|
||||||
private View3DWidget view3DWidget;
|
private View3DWidget view3DWidget;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,165 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright (c) 2017, Lars Brubaker, John Lewin
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
||||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
|
||||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
||||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
The views and conclusions contained in the software and documentation are those
|
|
||||||
of the authors and should not be interpreted as representing official policies,
|
|
||||||
either expressed or implied, of the FreeBSD Project.
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using MatterHackers.Agg;
|
|
||||||
using MatterHackers.Agg.Image;
|
|
||||||
using MatterHackers.Agg.PlatformAbstract;
|
|
||||||
using MatterHackers.Agg.UI;
|
|
||||||
using MatterHackers.Localizations;
|
|
||||||
using MatterHackers.MatterControl.CustomWidgets;
|
|
||||||
using MatterHackers.VectorMath;
|
|
||||||
|
|
||||||
namespace MatterHackers.MatterControl.PartPreviewWindow
|
|
||||||
{
|
|
||||||
public class RotateControls : PopupActionPanel
|
|
||||||
{
|
|
||||||
private View3DWidget view3DWidget;
|
|
||||||
|
|
||||||
public RotateControls(View3DWidget view3DWidget, TextImageButtonFactory buttonFactory, TextImageButtonFactory smallMarginButtonFactory)
|
|
||||||
{
|
|
||||||
this.view3DWidget = view3DWidget;
|
|
||||||
this.HAnchor = HAnchor.FitToChildren;
|
|
||||||
|
|
||||||
var degreesContainer = new FlowLayoutWidget(FlowDirection.LeftToRight);
|
|
||||||
degreesContainer.HAnchor = HAnchor.ParentLeftRight;
|
|
||||||
degreesContainer.Padding = new BorderDouble(5);
|
|
||||||
|
|
||||||
var degreesLabel = new TextWidget("Degrees".Localize() + ":", textColor: ActiveTheme.Instance.PrimaryTextColor);
|
|
||||||
degreesContainer.AddChild(degreesLabel);
|
|
||||||
degreesContainer.AddChild(new HorizontalSpacer());
|
|
||||||
|
|
||||||
var degreesControl = new MHNumberEdit(45, pixelWidth: 40, allowNegatives: true, allowDecimals: true, increment: 5, minValue: -360, maxValue: 360);
|
|
||||||
degreesControl.VAnchor = Agg.UI.VAnchor.ParentTop;
|
|
||||||
degreesContainer.AddChild(degreesControl);
|
|
||||||
|
|
||||||
this.AddChild(degreesContainer);
|
|
||||||
|
|
||||||
var rotateButtonContainer = new FlowLayoutWidget(FlowDirection.LeftToRight)
|
|
||||||
{
|
|
||||||
HAnchor = HAnchor.FitToChildren
|
|
||||||
};
|
|
||||||
|
|
||||||
// Reused on each button below
|
|
||||||
var rotateIcon = StaticData.Instance.LoadIcon("icon_rotate_32x32.png", 32, 32);
|
|
||||||
|
|
||||||
var initialMargin = smallMarginButtonFactory.Margin;
|
|
||||||
|
|
||||||
smallMarginButtonFactory.Margin = 0;
|
|
||||||
|
|
||||||
//smallMarginButtonFactory.Margin = 0;
|
|
||||||
|
|
||||||
Button rotateXButton = CreateAxisButton("X", smallMarginButtonFactory.Generate("", rotateIcon));
|
|
||||||
rotateXButton.Click += (s, e) =>
|
|
||||||
{
|
|
||||||
var scene = view3DWidget.Scene;
|
|
||||||
if (scene.HasSelection)
|
|
||||||
{
|
|
||||||
double radians = MathHelper.DegreesToRadians(degreesControl.ActuallNumberEdit.Value);
|
|
||||||
Matrix4X4 rotation = Matrix4X4.CreateRotationX(radians);
|
|
||||||
Matrix4X4 undoTransform = scene.SelectedItem.Matrix;
|
|
||||||
scene.SelectedItem.Matrix = PlatingHelper.ApplyAtCenter(scene.SelectedItem, rotation);
|
|
||||||
view3DWidget.UndoBuffer.Add(new TransformUndoCommand(view3DWidget, scene.SelectedItem, undoTransform, scene.SelectedItem.Matrix));
|
|
||||||
view3DWidget.PartHasBeenChanged();
|
|
||||||
Invalidate();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
rotateButtonContainer.AddChild(rotateXButton);
|
|
||||||
|
|
||||||
Button rotateYButton = CreateAxisButton("Y", smallMarginButtonFactory.Generate("", rotateIcon));
|
|
||||||
rotateYButton.Click += (s, e) =>
|
|
||||||
{
|
|
||||||
var scene = view3DWidget.Scene;
|
|
||||||
if (scene.HasSelection)
|
|
||||||
{
|
|
||||||
double radians = MathHelper.DegreesToRadians(degreesControl.ActuallNumberEdit.Value);
|
|
||||||
Matrix4X4 rotation = Matrix4X4.CreateRotationY(radians);
|
|
||||||
Matrix4X4 undoTransform = scene.SelectedItem.Matrix;
|
|
||||||
scene.SelectedItem.Matrix = PlatingHelper.ApplyAtCenter(scene.SelectedItem, rotation);
|
|
||||||
view3DWidget.UndoBuffer.Add(new TransformUndoCommand(view3DWidget, scene.SelectedItem, undoTransform, scene.SelectedItem.Matrix));
|
|
||||||
view3DWidget.PartHasBeenChanged();
|
|
||||||
Invalidate();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
rotateButtonContainer.AddChild(rotateYButton);
|
|
||||||
|
|
||||||
Button rotateZButton = CreateAxisButton("Z", smallMarginButtonFactory.Generate("", rotateIcon));
|
|
||||||
rotateZButton.Click += (s, e) =>
|
|
||||||
{
|
|
||||||
var scene = view3DWidget.Scene;
|
|
||||||
if (scene.HasSelection)
|
|
||||||
{
|
|
||||||
double radians = MathHelper.DegreesToRadians(degreesControl.ActuallNumberEdit.Value);
|
|
||||||
Matrix4X4 rotation = Matrix4X4.CreateRotationZ(radians);
|
|
||||||
Matrix4X4 undoTransform = scene.SelectedItem.Matrix;
|
|
||||||
scene.SelectedItem.Matrix = PlatingHelper.ApplyAtCenter(scene.SelectedItem, rotation);
|
|
||||||
view3DWidget.UndoBuffer.Add(new TransformUndoCommand(view3DWidget, scene.SelectedItem, undoTransform, scene.SelectedItem.Matrix));
|
|
||||||
view3DWidget.PartHasBeenChanged();
|
|
||||||
Invalidate();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
rotateButtonContainer.AddChild(rotateZButton);
|
|
||||||
|
|
||||||
this.AddChild(rotateButtonContainer);
|
|
||||||
|
|
||||||
Button layFlatButton = buttonFactory.Generate("Align to Bed".Localize(), centerText: true);
|
|
||||||
layFlatButton.HAnchor = HAnchor.ParentCenter;
|
|
||||||
layFlatButton.Margin = new BorderDouble(0, 0, 0, 8);
|
|
||||||
layFlatButton.Cursor = Cursors.Hand;
|
|
||||||
layFlatButton.Click += (s, e) =>
|
|
||||||
{
|
|
||||||
var scene = view3DWidget.Scene;
|
|
||||||
|
|
||||||
if (scene.HasSelection)
|
|
||||||
{
|
|
||||||
Matrix4X4 undoTransform = scene.SelectedItem.Matrix;
|
|
||||||
view3DWidget.MakeLowestFaceFlat(scene.SelectedItem);
|
|
||||||
view3DWidget.UndoBuffer.Add(new TransformUndoCommand(view3DWidget, scene.SelectedItem, undoTransform, scene.SelectedItem.Matrix));
|
|
||||||
view3DWidget.PartHasBeenChanged();
|
|
||||||
Invalidate();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
this.AddChild(layFlatButton);
|
|
||||||
|
|
||||||
smallMarginButtonFactory.Margin = initialMargin;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Button CreateAxisButton(string axis, Button button)
|
|
||||||
{
|
|
||||||
var textWidget = new TextWidget(axis, pointSize: 10, textColor: ActiveTheme.Instance.PrimaryTextColor);
|
|
||||||
textWidget.Margin = new BorderDouble(3, 0, 0, 0);
|
|
||||||
textWidget.AnchorCenter();
|
|
||||||
|
|
||||||
button.Margin = new BorderDouble(0, 0, 12, 0);
|
|
||||||
button.AddChild(textWidget);
|
|
||||||
|
|
||||||
return button;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,329 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright (c) 2017, Lars Brubaker, John Lewin
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
||||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
|
||||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
||||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
The views and conclusions contained in the software and documentation are those
|
|
||||||
of the authors and should not be interpreted as representing official policies,
|
|
||||||
either expressed or implied, of the FreeBSD Project.
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using MatterHackers.Agg;
|
|
||||||
using MatterHackers.Agg.UI;
|
|
||||||
using MatterHackers.Localizations;
|
|
||||||
using MatterHackers.MatterControl.CustomWidgets;
|
|
||||||
using MatterHackers.VectorMath;
|
|
||||||
|
|
||||||
namespace MatterHackers.MatterControl.PartPreviewWindow
|
|
||||||
{
|
|
||||||
public class PopupActionPanel : FlowLayoutWidget, IIgnoredPopupChild
|
|
||||||
{
|
|
||||||
public PopupActionPanel() : base(FlowDirection.TopToBottom)
|
|
||||||
{
|
|
||||||
this.Padding = 15;
|
|
||||||
this.BackgroundColor = ActiveTheme.Instance.SecondaryBackgroundColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ScaleControls : PopupActionPanel
|
|
||||||
{
|
|
||||||
private Button applyScaleButton;
|
|
||||||
private MHNumberEdit scaleRatioControl;
|
|
||||||
private EditableNumberDisplay[] sizeDisplay = new EditableNumberDisplay[3];
|
|
||||||
private CheckBox uniformScale;
|
|
||||||
private View3DWidget view3DWidget;
|
|
||||||
|
|
||||||
public ScaleControls(View3DWidget view3DWidget, TextImageButtonFactory buttonFactory)
|
|
||||||
{
|
|
||||||
this.view3DWidget = view3DWidget;
|
|
||||||
|
|
||||||
List<GuiWidget> scaleControls = new List<GuiWidget>();
|
|
||||||
|
|
||||||
// Put in the scale ratio edit field
|
|
||||||
{
|
|
||||||
var scaleRatioContainer = new FlowLayoutWidget(FlowDirection.LeftToRight);
|
|
||||||
scaleRatioContainer.HAnchor = HAnchor.ParentLeftRight;
|
|
||||||
scaleRatioContainer.Padding = new BorderDouble(5);
|
|
||||||
|
|
||||||
var scaleRatioLabel = new TextWidget("Ratio".Localize() + ":", textColor: ActiveTheme.Instance.PrimaryTextColor);
|
|
||||||
scaleRatioLabel.Margin = new BorderDouble(0, 0, 3, 0);
|
|
||||||
scaleRatioLabel.VAnchor = VAnchor.ParentCenter;
|
|
||||||
scaleRatioContainer.AddChild(scaleRatioLabel);
|
|
||||||
|
|
||||||
scaleRatioContainer.AddChild(new HorizontalSpacer());
|
|
||||||
|
|
||||||
scaleRatioControl = new MHNumberEdit(1, pixelWidth: 50 * GuiWidget.DeviceScale, allowDecimals: true, increment: .05);
|
|
||||||
scaleRatioControl.SelectAllOnFocus = true;
|
|
||||||
scaleRatioControl.VAnchor = VAnchor.ParentCenter;
|
|
||||||
scaleRatioContainer.AddChild(scaleRatioControl);
|
|
||||||
scaleRatioControl.ActuallNumberEdit.KeyPressed += (sender, e) =>
|
|
||||||
{
|
|
||||||
OnSelectedTransformChanged(this, null);
|
|
||||||
};
|
|
||||||
|
|
||||||
scaleRatioControl.ActuallNumberEdit.KeyDown += (sender, e) =>
|
|
||||||
{
|
|
||||||
OnSelectedTransformChanged(this, null);
|
|
||||||
};
|
|
||||||
|
|
||||||
scaleRatioControl.ActuallNumberEdit.EnterPressed += (object sender, KeyEventArgs keyEvent) =>
|
|
||||||
{
|
|
||||||
ApplyScaleFromEditField();
|
|
||||||
};
|
|
||||||
|
|
||||||
scaleRatioContainer.AddChild(CreateScaleDropDownMenu());
|
|
||||||
|
|
||||||
this.AddChild(scaleRatioContainer);
|
|
||||||
|
|
||||||
scaleControls.Add(scaleRatioControl);
|
|
||||||
}
|
|
||||||
|
|
||||||
applyScaleButton = buttonFactory.Generate("Apply Scale".Localize(), centerText: true);
|
|
||||||
applyScaleButton.Cursor = Cursors.Hand;
|
|
||||||
this.AddChild(applyScaleButton);
|
|
||||||
|
|
||||||
scaleControls.Add(applyScaleButton);
|
|
||||||
applyScaleButton.Click += (s, e) =>
|
|
||||||
{
|
|
||||||
ApplyScaleFromEditField();
|
|
||||||
};
|
|
||||||
|
|
||||||
// add in the dimensions
|
|
||||||
{
|
|
||||||
this.AddChild(CreateAxisScalingControl("x".ToUpper(), 0, buttonFactory));
|
|
||||||
this.AddChild(CreateAxisScalingControl("y".ToUpper(), 1, buttonFactory));
|
|
||||||
this.AddChild(CreateAxisScalingControl("z".ToUpper(), 2, buttonFactory));
|
|
||||||
|
|
||||||
uniformScale = new CheckBox("Lock Ratio".Localize(), textColor: ActiveTheme.Instance.PrimaryTextColor);
|
|
||||||
uniformScale.Checked = true;
|
|
||||||
|
|
||||||
FlowLayoutWidget leftToRight = new FlowLayoutWidget();
|
|
||||||
leftToRight.Padding = new BorderDouble(5, 3);
|
|
||||||
|
|
||||||
leftToRight.AddChild(uniformScale);
|
|
||||||
this.AddChild(leftToRight);
|
|
||||||
}
|
|
||||||
|
|
||||||
view3DWidget.SelectedTransformChanged += OnSelectedTransformChanged;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ApplyScaleFromEditField()
|
|
||||||
{
|
|
||||||
if (view3DWidget.Scene.HasSelection)
|
|
||||||
{
|
|
||||||
Matrix4X4 startingTransform = view3DWidget.Scene.SelectedItem.Matrix;
|
|
||||||
Vector3 currentScale = view3DWidget.Scene.SelectedItem.ExtraData.CurrentScale;
|
|
||||||
|
|
||||||
double scale = scaleRatioControl.ActuallNumberEdit.Value;
|
|
||||||
if (scale > 0)
|
|
||||||
{
|
|
||||||
ScaleAxis(scale, 0);
|
|
||||||
|
|
||||||
view3DWidget.Scene.SelectedItem.ExtraData.CurrentScale.y = currentScale.y;
|
|
||||||
view3DWidget.Scene.SelectedItem.ExtraData.CurrentScale.z = currentScale.z;
|
|
||||||
ScaleAxis(scale, 1);
|
|
||||||
|
|
||||||
view3DWidget.Scene.SelectedItem.ExtraData.CurrentScale.z = currentScale.z;
|
|
||||||
ScaleAxis(scale, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
view3DWidget.AddUndoForSelectedMeshGroupTransform(startingTransform);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private GuiWidget CreateAxisScalingControl(string axis, int axisIndex, TextImageButtonFactory buttonFactory)
|
|
||||||
{
|
|
||||||
var leftToRight = new FlowLayoutWidget()
|
|
||||||
{
|
|
||||||
Padding = new BorderDouble(5, 3)
|
|
||||||
};
|
|
||||||
|
|
||||||
var sizeDescription = new TextWidget("{0}:".FormatWith(axis), textColor: ActiveTheme.Instance.PrimaryTextColor);
|
|
||||||
sizeDescription.VAnchor = VAnchor.ParentCenter;
|
|
||||||
leftToRight.AddChild(sizeDescription);
|
|
||||||
|
|
||||||
sizeDisplay[axisIndex] = new EditableNumberDisplay(buttonFactory, "100", "1000.00");
|
|
||||||
sizeDisplay[axisIndex].EditComplete += (sender, e) =>
|
|
||||||
{
|
|
||||||
if (view3DWidget.Scene.HasSelection)
|
|
||||||
{
|
|
||||||
Matrix4X4 startingTransform = view3DWidget.Scene.SelectedItem.Matrix;
|
|
||||||
SetNewModelSize(sizeDisplay[axisIndex].GetValue(), axisIndex);
|
|
||||||
sizeDisplay[axisIndex].SetDisplayString("{0:0.00}".FormatWith(view3DWidget.Scene.SelectedItem.GetAxisAlignedBoundingBox(Matrix4X4.Identity).Size[axisIndex]));
|
|
||||||
OnSelectedTransformChanged(null, null);
|
|
||||||
view3DWidget.AddUndoForSelectedMeshGroupTransform(startingTransform);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sizeDisplay[axisIndex].SetDisplayString("---");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
leftToRight.AddChild(sizeDisplay[axisIndex]);
|
|
||||||
|
|
||||||
return leftToRight;
|
|
||||||
}
|
|
||||||
|
|
||||||
private DropDownMenu CreateScaleDropDownMenu()
|
|
||||||
{
|
|
||||||
var presetScaleMenu = new DropDownMenu("", Direction.Down)
|
|
||||||
{
|
|
||||||
NormalArrowColor = ActiveTheme.Instance.PrimaryTextColor,
|
|
||||||
HoverArrowColor = ActiveTheme.Instance.PrimaryTextColor,
|
|
||||||
MenuAsWideAsItems = false,
|
|
||||||
AlignToRightEdge = true,
|
|
||||||
//presetScaleMenu.OpenOffset = new Vector2(-50, 0);
|
|
||||||
HAnchor = HAnchor.AbsolutePosition,
|
|
||||||
VAnchor = VAnchor.AbsolutePosition,
|
|
||||||
Width = 25,
|
|
||||||
Height = scaleRatioControl.Height + 2
|
|
||||||
};
|
|
||||||
|
|
||||||
presetScaleMenu.AddItem("mm to in (.0393)");
|
|
||||||
presetScaleMenu.AddItem("in to mm (25.4)");
|
|
||||||
presetScaleMenu.AddItem("mm to cm (.1)");
|
|
||||||
presetScaleMenu.AddItem("cm to mm (10)");
|
|
||||||
presetScaleMenu.AddItem("none".Localize() + " (1)");
|
|
||||||
|
|
||||||
presetScaleMenu.SelectionChanged += (sender, e) =>
|
|
||||||
{
|
|
||||||
double scale = 1;
|
|
||||||
switch (presetScaleMenu.SelectedIndex)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
scale = 1.0 / 25.4;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
scale = 25.4;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
scale = .1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
scale = 10;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 4:
|
|
||||||
scale = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
scaleRatioControl.ActuallNumberEdit.Value = scale;
|
|
||||||
};
|
|
||||||
|
|
||||||
return presetScaleMenu;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ScaleAxis(double scaleIn, int axis)
|
|
||||||
{
|
|
||||||
var selectedItem = view3DWidget.Scene.SelectedItem;
|
|
||||||
AxisAlignedBoundingBox originalMeshBounds = selectedItem.GetAxisAlignedBoundingBox(Matrix4X4.Identity);
|
|
||||||
|
|
||||||
AxisAlignedBoundingBox scaledBounds = selectedItem.GetAxisAlignedBoundingBox(selectedItem.Matrix);
|
|
||||||
|
|
||||||
// first we remove any scale we have applied and then scale to the new value
|
|
||||||
Vector3 axisRemoveScalings = Vector3.One;
|
|
||||||
if(originalMeshBounds.XSize > 0 && scaledBounds.XSize > 0) axisRemoveScalings.x = originalMeshBounds.XSize / scaledBounds.XSize;
|
|
||||||
if (originalMeshBounds.YSize > 0 && scaledBounds.YSize > 0) axisRemoveScalings.y = originalMeshBounds.YSize / scaledBounds.YSize;
|
|
||||||
if (originalMeshBounds.ZSize > 0 && scaledBounds.ZSize > 0) axisRemoveScalings.z = originalMeshBounds.ZSize / scaledBounds.ZSize;
|
|
||||||
|
|
||||||
Matrix4X4 removeScaleMatrix = Matrix4X4.CreateScale(axisRemoveScalings);
|
|
||||||
|
|
||||||
Vector3 newScale = selectedItem.ExtraData.CurrentScale;
|
|
||||||
newScale[axis] = scaleIn;
|
|
||||||
Matrix4X4 totalScale = Matrix4X4.CreateScale(newScale);
|
|
||||||
|
|
||||||
selectedItem.Matrix = PlatingHelper.ApplyAtCenter(selectedItem, totalScale);
|
|
||||||
|
|
||||||
PlatingHelper.PlaceMeshAtHeight(selectedItem, originalMeshBounds.minXYZ.z);
|
|
||||||
|
|
||||||
view3DWidget.PartHasBeenChanged();
|
|
||||||
Invalidate();
|
|
||||||
view3DWidget.Scene.SelectedItem.ExtraData.CurrentScale[axis] = scaleIn;
|
|
||||||
OnSelectedTransformChanged(this, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetNewModelSize(double sizeInMm, int axis)
|
|
||||||
{
|
|
||||||
if (view3DWidget.Scene.HasSelection)
|
|
||||||
{
|
|
||||||
// because we remove any current scale before we change to a new one we only get the size of the base mesh data
|
|
||||||
AxisAlignedBoundingBox originalMeshBounds = view3DWidget.Scene.SelectedItem.GetAxisAlignedBoundingBox(Matrix4X4.Identity);
|
|
||||||
|
|
||||||
double currentSize = originalMeshBounds.Size[axis];
|
|
||||||
double desiredSize = sizeDisplay[axis].GetValue();
|
|
||||||
double scaleFactor = 1;
|
|
||||||
if (currentSize != 0)
|
|
||||||
{
|
|
||||||
scaleFactor = desiredSize / currentSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (uniformScale.Checked)
|
|
||||||
{
|
|
||||||
scaleRatioControl.ActuallNumberEdit.Value = scaleFactor;
|
|
||||||
ApplyScaleFromEditField();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ScaleAxis(scaleFactor, axis);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnSelectedTransformChanged(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
if (sizeDisplay[0] != null
|
|
||||||
&& view3DWidget.Scene.HasSelection)
|
|
||||||
{
|
|
||||||
var selectedItem = view3DWidget.Scene.SelectedItem;
|
|
||||||
|
|
||||||
// TODO: jlewin - could be this simple but how do we call old/new transform values from this context given they've likely been updated and we track one value
|
|
||||||
// AxisAlignedBoundingBox bounds = view3DWidget.SelectedObject3D.GetAxisAlignedBoundingBox();
|
|
||||||
AxisAlignedBoundingBox bounds = selectedItem.GetAxisAlignedBoundingBox(selectedItem.Matrix);
|
|
||||||
sizeDisplay[0].SetDisplayString("{0:0.00}".FormatWith(bounds.Size[0]));
|
|
||||||
sizeDisplay[1].SetDisplayString("{0:0.00}".FormatWith(bounds.Size[1]));
|
|
||||||
sizeDisplay[2].SetDisplayString("{0:0.00}".FormatWith(bounds.Size[2]));
|
|
||||||
|
|
||||||
// set the scaling to be this new size
|
|
||||||
AxisAlignedBoundingBox originalMeshBounds = selectedItem.GetAxisAlignedBoundingBox(Matrix4X4.Identity);
|
|
||||||
AxisAlignedBoundingBox scaledBounds = selectedItem.GetAxisAlignedBoundingBox(selectedItem.Matrix);
|
|
||||||
Vector3 currentScale = new Vector3();
|
|
||||||
currentScale.x = scaledBounds.XSize / originalMeshBounds.XSize;
|
|
||||||
currentScale.y = scaledBounds.YSize / originalMeshBounds.YSize;
|
|
||||||
currentScale.z = scaledBounds.ZSize / originalMeshBounds.ZSize;
|
|
||||||
|
|
||||||
selectedItem.ExtraData.CurrentScale = currentScale;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sizeDisplay[0].SetDisplayString("---");
|
|
||||||
sizeDisplay[1].SetDisplayString("---");
|
|
||||||
sizeDisplay[2].SetDisplayString("---");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -423,20 +423,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
|
||||||
// Normal margin factory
|
// Normal margin factory
|
||||||
var normalMarginButtonFactory = ApplicationController.Instance.Theme.BreadCrumbButtonFactory;
|
var normalMarginButtonFactory = ApplicationController.Instance.Theme.BreadCrumbButtonFactory;
|
||||||
|
|
||||||
var rotateButton = new PopupButton(smallMarginButtonFactory.Generate("Rotate".Localize()))
|
|
||||||
{
|
|
||||||
PopDirection = Direction.Up,
|
|
||||||
PopupContent = new RotateControls(this, normalMarginButtonFactory, smallMarginButtonFactory)
|
|
||||||
};
|
|
||||||
doEdittingButtonsContainer.AddChild(rotateButton);
|
|
||||||
|
|
||||||
var scaleButton = new PopupButton(smallMarginButtonFactory.Generate("Scale".Localize()))
|
|
||||||
{
|
|
||||||
PopDirection = Direction.Up,
|
|
||||||
PopupContent = new ScaleControls(this, normalMarginButtonFactory)
|
|
||||||
};
|
|
||||||
doEdittingButtonsContainer.AddChild(scaleButton);
|
|
||||||
|
|
||||||
var mirrorButton = new PopupButton(smallMarginButtonFactory.Generate("Mirror".Localize()))
|
var mirrorButton = new PopupButton(smallMarginButtonFactory.Generate("Mirror".Localize()))
|
||||||
{
|
{
|
||||||
PopDirection = Direction.Up,
|
PopDirection = Direction.Up,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue