Move 2D layer view to same context as siblings views

This commit is contained in:
John Lewin 2017-07-10 12:23:02 -07:00
parent c5363aa077
commit b2c898be6c
3 changed files with 68 additions and 56 deletions

View file

@ -46,6 +46,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{
private View3DWidget modelViewer;
internal ViewGcodeBasic gcodeViewer;
internal GCode2DWidget gcode2DWidget;
private PrintItemWrapper printItem;
private ViewControls3D viewControls3D;
@ -61,6 +63,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
private ValueDisplayInfo currentLayerInfo;
private Vector3 viewerVolume;
private Vector2 bedCenter;
public PrinterTabPage(PrinterSettings activeSettings, PrintItemWrapper printItem)
{
printer = ApplicationController.Instance.Printer;
@ -85,9 +90,36 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
this.ViewMode = e.ViewMode;
};
viewControls3D.TransformStateChanged += (s, e) =>
{
switch (e.TransformMode)
{
case ViewControls3DButtons.Translate:
if (gcode2DWidget != null)
{
gcode2DWidget.TransformState = GCode2DWidget.ETransformState.Move;
}
break;
case ViewControls3DButtons.Scale:
if (gcode2DWidget != null)
{
gcode2DWidget.TransformState = GCode2DWidget.ETransformState.Scale;
}
break;
}
};
viewControls3D.ResetView += (sender, e) =>
{
modelViewer.meshViewerWidget.ResetView();
if (gcode2DWidget.Visible)
{
gcode2DWidget.CenterPartInView();
}
else if (modelViewer.Visible)
{
modelViewer.meshViewerWidget.ResetView();
}
};
viewControls3D.OverflowButton.DynamicPopupContent = () =>
{
@ -149,10 +181,13 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
SetSliderSizes();
this.viewerVolume = new Vector3(activeSettings.GetValue<Vector2>(SettingsKey.bed_size), buildHeight);
this.bedCenter = activeSettings.GetValue<Vector2>(SettingsKey.print_center);
// The 3D model view
modelViewer = new View3DWidget(printItem,
new Vector3(activeSettings.GetValue<Vector2>(SettingsKey.bed_size), buildHeight),
activeSettings.GetValue<Vector2>(SettingsKey.print_center),
this.viewerVolume,
this.bedCenter,
activeSettings.GetValue<BedShape>(SettingsKey.bed_shape),
View3DWidget.WindowMode.Embeded,
View3DWidget.AutoRotate.Disabled,
@ -286,6 +321,18 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
},
this.GetRenderType,
MeshViewerWidget.GetMaterialColor);
// Close and remove any existing widget reference
gcode2DWidget?.Close();
// Create and append new widget
gcode2DWidget = new GCode2DWidget( new Vector2(viewerVolume.x, viewerVolume.y), this.bedCenter)
{
Visible = (this.ViewMode == PartViewMode.Layers2D)
};
view3DContainer.AddChild(gcode2DWidget);
viewControls3D.Layers2DButton.Enabled = true;
}
private RenderType GetRenderType()
@ -390,21 +437,21 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{
case PartViewMode.Layers2D:
UserSettings.Instance.set("LayerViewDefault", "2D Layer");
if (gcodeViewer.gcode2DWidget != null)
if (gcode2DWidget != null)
{
gcodeViewer.gcode2DWidget.Visible = true;
gcode2DWidget.Visible = true;
// HACK: Getting the Layer2D view to show content only works if CenterPartInView is called after the control is visible and after some cycles have passed
UiThread.RunOnIdle(gcodeViewer.gcode2DWidget.CenterPartInView);
UiThread.RunOnIdle(gcode2DWidget.CenterPartInView);
}
this.ShowSliceLayers = true;
break;
case PartViewMode.Layers3D:
UserSettings.Instance.set("LayerViewDefault", "3D Layer");
if (gcodeViewer.gcode2DWidget != null)
if (gcode2DWidget != null)
{
gcodeViewer.gcode2DWidget.Visible = false;
gcode2DWidget.Visible = false;
}
this.ShowSliceLayers = true;
break;

View file

@ -69,6 +69,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
private RadioButton scaleButton;
private RadioButton partSelectButton;
public RadioButton Layers2DButton;
private EventHandler unregisterEvents;
private ViewControls3DButtons activeTransformState = ViewControls3DButtons.Rotate;
@ -222,14 +224,15 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
}
iconPath = Path.Combine("ViewTransformControls", "2d.png");
var layers2DButton = buttonFactory.GenerateRadioButton("", StaticData.Instance.LoadIcon(iconPath, 32, 32));
layers2DButton.SiblingRadioButtonList = buttonGroupB;
layers2DButton.Name = "Layers2D Button";
layers2DButton.ToolTipText = "2D Layers".Localize();
layers2DButton.Margin = 3;
layers2DButton.Click += SwitchModes_Click;
buttonGroupB.Add(layers2DButton);
this.AddChild(layers2DButton);
Layers2DButton = buttonFactory.GenerateRadioButton("", StaticData.Instance.LoadIcon(iconPath, 32, 32));
Layers2DButton.SiblingRadioButtonList = buttonGroupB;
Layers2DButton.Name = "Layers2D Button";
Layers2DButton.ToolTipText = "2D Layers".Localize();
Layers2DButton.Enabled = false;
Layers2DButton.Margin = 3;
Layers2DButton.Click += SwitchModes_Click;
buttonGroupB.Add(Layers2DButton);
this.AddChild(Layers2DButton);
OverflowButton = new OverflowDropdown(allowLightnessInvert: false)
{

View file

@ -45,7 +45,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
public class ViewGcodeBasic : GuiWidget
{
private TextWidget gcodeProcessingStateInfoText;
internal GCode2DWidget gcode2DWidget;
private PrintItemWrapper printItem => ApplicationController.Instance.ActivePrintItem;
private GuiWidget gcodeDisplayWidget;
@ -132,7 +131,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{
CloseAllChildren();
gcode2DWidget = null;
gcodeProcessingStateInfoText = null;
var mainContainerTopToBottom = new FlowLayoutWidget(FlowDirection.TopToBottom)
@ -154,15 +152,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
bool isGCode = Path.GetExtension(printItem.FileLocation).ToUpper() == ".GCODE";
string gcodeFilePath = isGCode ? printItem.FileLocation : printItem.GetGCodePathAndFileName();
if (File.Exists(gcodeFilePath))
{
gcode2DWidget = new GCode2DWidget(new Vector2(viewerVolume.x, viewerVolume.y), bedCenter)
{
Visible = (activeViewMode == PartViewMode.Layers2D)
};
gcodeDisplayWidget.AddChild(gcode2DWidget);
}
else
if (!File.Exists(gcodeFilePath))
{
SetProcessingMessage(string.Format("{0}\n'{1}'", fileNotFoundMessage, printItem.Name));
}
@ -172,37 +162,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
this.AddChild(mainContainerTopToBottom);
viewControls3D.ResetView += (sender, e) =>
{
if (gcodeDisplayWidget.Visible)
{
gcode2DWidget.CenterPartInView();
}
};
viewControls3D.TransformStateChanged += (s, e) =>
{
switch (e.TransformMode)
{
case ViewControls3DButtons.Translate:
if (gcode2DWidget != null)
{
gcode2DWidget.TransformState = GCode2DWidget.ETransformState.Move;
}
break;
case ViewControls3DButtons.Scale:
if (gcode2DWidget != null)
{
gcode2DWidget.TransformState = GCode2DWidget.ETransformState.Scale;
}
break;
}
};
// *************** AddGCodeFileControls ***************
SetProcessingMessage("");
if (gcode2DWidget != null
&& loadedGCode == null)
if (loadedGCode == null)
{
// If we have finished loading the gcode and the source file exists but we don't have any loaded gcode it is because the loader decided to not load it.
if (File.Exists(printItem.FileLocation))