From ae93fedc46e9839c5d61fd92359ace8b482cd277 Mon Sep 17 00:00:00 2001 From: John Lewin Date: Mon, 10 Jul 2017 14:00:27 -0700 Subject: [PATCH] Move TrackballTumble and GCode viewer --- ApplicationView/ApplicationController.cs | 2 + PartPreviewWindow/PrinterTabPage.cs | 43 ++---- PartPreviewWindow/View3D/MeshViewerWidget.cs | 49 ++----- PartPreviewWindow/View3D/PrinterActionsBar.cs | 4 +- PartPreviewWindow/View3D/View3DWidget.cs | 127 +++++++++++++----- PartPreviewWindow/ViewGcodeBasic.cs | 3 +- .../MatterControl.Tests.csproj | 4 + 7 files changed, 119 insertions(+), 113 deletions(-) diff --git a/ApplicationView/ApplicationController.cs b/ApplicationView/ApplicationController.cs index 3d358b63d..9a4cdd5e5 100644 --- a/ApplicationView/ApplicationController.cs +++ b/ApplicationView/ApplicationController.cs @@ -84,6 +84,8 @@ namespace MatterHackers.MatterControl } } + public WorldView World { get; } = new WorldView(0, 0); + // TODO: Make assignment private, wire up post slicing initialization here public GCodeRenderer GCodeRenderer { get; set; } diff --git a/PartPreviewWindow/PrinterTabPage.cs b/PartPreviewWindow/PrinterTabPage.cs index a6bdb1619..050906710 100644 --- a/PartPreviewWindow/PrinterTabPage.cs +++ b/PartPreviewWindow/PrinterTabPage.cs @@ -30,6 +30,7 @@ either expressed or implied, of the FreeBSD Project. using System; using System.Linq; using MatterHackers.Agg; +using MatterHackers.Agg.OpenGlGui; using MatterHackers.Agg.UI; using MatterHackers.GCodeVisualizer; using MatterHackers.Localizations; @@ -45,8 +46,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { public class PrinterTabPage : GuiWidget { - private View3DWidget modelViewer; - internal ViewGcodeBasic gcodeViewer; + internal View3DWidget modelViewer; internal GCode2DWidget gcode2DWidget; private PrintItemWrapper printItem; @@ -121,12 +121,12 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } else if (modelViewer.Visible) { - modelViewer.meshViewerWidget.ResetView(); + this.modelViewer.ResetView(); } }; viewControls3D.OverflowButton.DynamicPopupContent = () => { - if (gcodeViewer.Visible) + if (modelViewer.gcodeViewer.Visible) { return this.ShowGCodeOverflowMenu(); } @@ -198,8 +198,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow ApplicationController.Instance.Theme, View3DWidget.OpenMode.Editing); - modelViewer.meshViewerWidget.TrackballTumbleWidget.DrawGlContent += TrackballTumbleWidget_DrawGlContent; - modelViewer.BoundsChanged += (s, e) => { SetSliderSizes(); @@ -225,16 +223,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow leftToRight.AddChild(view3DContainer); - // The slice layers view - gcodeViewer = new ViewGcodeBasic( - new Vector3(activeSettings.GetValue(SettingsKey.bed_size), buildHeight), - activeSettings.GetValue(SettingsKey.print_center), - activeSettings.GetValue(SettingsKey.bed_shape), - viewControls3D); - gcodeViewer.AnchorAll(); - this.gcodeViewer.Visible = false; - - view3DContainer.AddChild(gcodeViewer); view3DContainer.AddChild(layerRenderRatioSlider); view3DContainer.AddChild(selectLayerSlider); view3DContainer.AddChild(layerCountText); @@ -266,7 +254,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow if (ApplicationController.Instance.PartPreviewState.RotationMatrix == Matrix4X4.Identity) { - modelViewer.meshViewerWidget.ResetView(); + this.modelViewer.ResetView(); ApplicationController.Instance.PartPreviewState.RotationMatrix = modelViewer.meshViewerWidget.World.RotationMatrix; ApplicationController.Instance.PartPreviewState.TranslationMatrix = modelViewer.meshViewerWidget.World.TranslationMatrix; @@ -406,7 +394,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow set { showSliceLayers = value; - gcodeViewer.Visible = value; + modelViewer.gcodeViewer.Visible = value; modelViewer.meshViewerWidget.IsActive = !value; @@ -489,7 +477,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private void Parent_KeyDown(object sender, KeyEventArgs keyEvent) { - if (gcodeViewer.Visible) + if (modelViewer.gcodeViewer.Visible) { switch (keyEvent.KeyCode) { @@ -508,7 +496,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow bool printerIsRunningPrint = PrinterConnection.Instance.PrinterIsPaused || PrinterConnection.Instance.PrinterIsPrinting; if (gcodeOptions.SyncToPrint && printerIsRunningPrint - && gcodeViewer.Visible) + && modelViewer.gcodeViewer.Visible) { SetAnimationPosition(); this.Invalidate(); @@ -524,11 +512,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow ApplicationController.Instance.PartPreviewState.RotationMatrix = visibleWidget.World.RotationMatrix; ApplicationController.Instance.PartPreviewState.TranslationMatrix = visibleWidget.World.TranslationMatrix; - if (modelViewer?.meshViewerWidget != null) - { - modelViewer.meshViewerWidget.TrackballTumbleWidget.DrawGlContent -= TrackballTumbleWidget_DrawGlContent; - } - // Find and unhook the parent system window KeyDown event if (parentSystemWindow != null) { @@ -544,16 +527,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow base.OnClosed(e); } - private void TrackballTumbleWidget_DrawGlContent(object sender, EventArgs e) - { - if (loadedGCode == null || printer.BedPlate.GCodeRenderer == null || !gcodeViewer.Visible) - { - return; - } - - printer.BedPlate.Render3DLayerFeatures(); - } - internal GuiWidget ShowGCodeOverflowMenu() { var textColor = RGBA_Bytes.Black; diff --git a/PartPreviewWindow/View3D/MeshViewerWidget.cs b/PartPreviewWindow/View3D/MeshViewerWidget.cs index 3fab7d04d..0794aaf2a 100644 --- a/PartPreviewWindow/View3D/MeshViewerWidget.cs +++ b/PartPreviewWindow/View3D/MeshViewerWidget.cs @@ -87,11 +87,9 @@ namespace MatterHackers.MeshVisualizer public double SnapGridDistance { get; set; } = 1; - private TrackballTumbleWidget trackballTumbleWidget; - private int volumeIndexWithMouseDown = -1; - public MeshViewerWidget(Vector3 displayVolume, Vector2 bedCenter, BedShape bedShape, string startingTextMessage = "") + public MeshViewerWidget(Vector3 displayVolume, Vector2 bedCenter, BedShape bedShape, TrackballTumbleWidget trackballTumbleWidget, WorldView worldView, string startingTextMessage = "") { Scene.SelectionChanged += (sender, e) => { @@ -104,17 +102,8 @@ namespace MatterHackers.MeshVisualizer BedColor = new RGBA_Floats(.8, .8, .8, .7).GetAsRGBA_Bytes(); BuildVolumeColor = new RGBA_Floats(.2, .8, .3, .2).GetAsRGBA_Bytes(); - trackballTumbleWidget = new TrackballTumbleWidget(this.World); - trackballTumbleWidget.DrawRotationHelperCircle = false; - trackballTumbleWidget.DrawGlContent += trackballTumbleWidget_DrawGlContent; - trackballTumbleWidget.TransformState = TrackBallController.MouseDownType.Rotation; - - AddChild(trackballTumbleWidget); - CreatePrintBed(displayVolume, bedCenter, bedShape); - trackballTumbleWidget.AnchorAll(); - partProcessingInfo = new PartProcessingInfo(startingTextMessage); GuiWidget labelContainer = new GuiWidget(); @@ -125,9 +114,14 @@ namespace MatterHackers.MeshVisualizer SetMaterialColor(1, ActiveTheme.Instance.PrimaryAccentColor); this.AddChild(labelContainer); + + this.trackballTumbleWidget = trackballTumbleWidget; + this.trackballTumbleWidget.DrawGlContent += this.trackballTumbleWidget_DrawGlContent; + + this.World = worldView; } - public WorldView World { get; } = new WorldView(0, 0); + public WorldView World { get; } public event EventHandler LoadDone; @@ -256,14 +250,6 @@ namespace MatterHackers.MeshVisualizer } } - public TrackballTumbleWidget TrackballTumbleWidget - { - get - { - return trackballTumbleWidget; - } - } - public static void AssertDebugNotDefined() { #if DEBUG @@ -492,14 +478,6 @@ namespace MatterHackers.MeshVisualizer { base.OnMouseDown(mouseEvent); - if (trackballTumbleWidget.MouseCaptured) - { - if (trackballTumbleWidget.TransformState == TrackBallController.MouseDownType.Rotation || mouseEvent.Button == MouseButtons.Right) - { - trackballTumbleWidget.DrawRotationHelperCircle = true; - } - } - int volumeHitIndex; Ray ray = this.World.GetRayForLocalBounds(mouseEvent.Position); IntersectInfo info; @@ -563,7 +541,6 @@ namespace MatterHackers.MeshVisualizer public override void OnMouseUp(MouseEventArgs mouseEvent) { - trackballTumbleWidget.DrawRotationHelperCircle = false; Invalidate(); if(SuppressUiVolumes) @@ -598,17 +575,6 @@ namespace MatterHackers.MeshVisualizer base.OnMouseUp(mouseEvent); } - public void ResetView() - { - trackballTumbleWidget.ZeroVelocity(); - - this.World.Reset(); - this.World.Scale = .03; - this.World.Translate(-new Vector3(BedCenter)); - this.World.Rotate(Quaternion.FromEulerAngles(new Vector3(0, 0, MathHelper.Tau / 16))); - this.World.Rotate(Quaternion.FromEulerAngles(new Vector3(-MathHelper.Tau * .19, 0, 0))); - } - private void CreateCircularBedGridImage(int linesInX, int linesInY, int increment = 1) { Vector2 bedImageCentimeters = new Vector2(linesInX, linesInY); @@ -736,6 +702,7 @@ namespace MatterHackers.MeshVisualizer } private string progressReportingPrimaryTask = ""; + private TrackballTumbleWidget trackballTumbleWidget; public void BeginProgressReporting(string taskDescription) { diff --git a/PartPreviewWindow/View3D/PrinterActionsBar.cs b/PartPreviewWindow/View3D/PrinterActionsBar.cs index bea87d49b..cf6eb8944 100644 --- a/PartPreviewWindow/View3D/PrinterActionsBar.cs +++ b/PartPreviewWindow/View3D/PrinterActionsBar.cs @@ -118,13 +118,13 @@ namespace MatterHackers.MatterControl.PartPreviewWindow await SlicingQueue.SliceFileAsync(printItem, sliceProgressReporter); - ApplicationController.Instance.Printer.BedPlate.LoadGCode(printItem.GetGCodePathAndFileName(), printerTabPage.gcodeViewer.LoadProgress_Changed); + ApplicationController.Instance.Printer.BedPlate.LoadGCode(printItem.GetGCodePathAndFileName(), printerTabPage.modelViewer.gcodeViewer.LoadProgress_Changed); sliceProgressReporter.EndReporting(); printerTabPage.ViewMode = PartViewMode.Layers3D; // HACK: directly fire method which previously ran on SlicingDone event on PrintItemWrapper - UiThread.RunOnIdle(printerTabPage.gcodeViewer.CreateAndAddChildren); + UiThread.RunOnIdle(printerTabPage.modelViewer.gcodeViewer.CreateAndAddChildren); } catch (Exception ex) { diff --git a/PartPreviewWindow/View3D/View3DWidget.cs b/PartPreviewWindow/View3D/View3DWidget.cs index b1d98d792..87b67b9b5 100644 --- a/PartPreviewWindow/View3D/View3DWidget.cs +++ b/PartPreviewWindow/View3D/View3DWidget.cs @@ -39,6 +39,7 @@ using System.Threading.Tasks; using MatterHackers.Agg; using MatterHackers.Agg.Image; using MatterHackers.Agg.ImageProcessing; +using MatterHackers.Agg.OpenGlGui; using MatterHackers.Agg.PlatformAbstract; using MatterHackers.Agg.Transform; using MatterHackers.Agg.UI; @@ -129,7 +130,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private void View3DWidget_AfterDraw(object sender, DrawEventArgs e) { - if (view3DWidget?.meshViewerWidget?.TrackballTumbleWidget != null) + if (view3DWidget?.HasBeenClosed == false) { AxisAlignedBoundingBox bounds = trackingObject.GetAxisAlignedBoundingBox(Matrix4X4.Identity); Vector3 renderPosition = bounds.Center; @@ -233,22 +234,38 @@ namespace MatterHackers.MatterControl.PartPreviewWindow private ThemeConfig theme; + private PrinterConfig printer; + + // TODO: Make dynamic + public WorldView World { get; } = ApplicationController.Instance.Printer.BedPlate.World; + + public TrackballTumbleWidget TrackballTumbleWidget { get; } + + private Vector2 bedCenter; + + internal ViewGcodeBasic gcodeViewer; + public View3DWidget(PrintItemWrapper printItemWrapper, Vector3 viewerVolume, Vector2 bedCenter, BedShape bedShape, WindowMode windowType, AutoRotate autoRotate, ViewControls3D viewControls3D, ThemeConfig theme, OpenMode openMode = OpenMode.Viewing) { + this.printer = ApplicationController.Instance.Printer; + this.bedCenter = bedCenter; + + this.TrackballTumbleWidget = new TrackballTumbleWidget(ApplicationController.Instance.Printer.BedPlate.World) + { + DrawRotationHelperCircle = false, + TransformState = TrackBallController.MouseDownType.Rotation + }; + this.TrackballTumbleWidget.AnchorAll(); + this.viewControls3D = viewControls3D; this.theme = theme; this.openMode = openMode; allowAutoRotate = (autoRotate == AutoRotate.Enabled); - meshViewerWidget = new MeshViewerWidget(viewerVolume, bedCenter, bedShape); + meshViewerWidget = new MeshViewerWidget(viewerVolume, bedCenter, bedShape, this.TrackballTumbleWidget, this.World); this.printItemWrapper = printItemWrapper; ActiveSliceSettings.SettingChanged.RegisterEvent(CheckSettingChanged, ref unregisterEvents); ApplicationController.Instance.AdvancedControlsPanelReloading.RegisterEvent(CheckSettingChanged, ref unregisterEvents); - } - - public override void Initialize() - { - base.Initialize(); this.windowType = windowType; autoRotating = allowAutoRotate; @@ -265,9 +282,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow VAnchor = VAnchor.Max_FitToChildren_ParentHeight }; - var centerPartPreviewAndControls = new FlowLayoutWidget(FlowDirection.LeftToRight) + var centerPartPreviewAndControls = new GuiWidget() { - Name = "centerPartPreviewAndControls" + Name = "centerPartPreviewAndControls", }; centerPartPreviewAndControls.AnchorAll(); @@ -278,6 +295,18 @@ namespace MatterHackers.MatterControl.PartPreviewWindow meshViewerWidget.AnchorAll(); centerPartPreviewAndControls.AddChild(meshViewerWidget); + // The slice layers view + gcodeViewer = new ViewGcodeBasic( + viewerVolume, + bedCenter, + bedShape, + viewControls3D); + gcodeViewer.AnchorAll(); + this.gcodeViewer.Visible = false; + + centerPartPreviewAndControls.AddChild(gcodeViewer); + centerPartPreviewAndControls.AddChild(this.TrackballTumbleWidget); + mainContainerTopToBottom.AddChild(centerPartPreviewAndControls); var buttonBottomPanel = new FlowLayoutWidget(FlowDirection.LeftToRight) @@ -449,7 +478,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow this.AnchorAll(); - meshViewerWidget.TrackballTumbleWidget.TransformState = TrackBallController.MouseDownType.Rotation; + this.TrackballTumbleWidget.TransformState = TrackBallController.MouseDownType.Rotation; selectedObjectPanel = new SelectedObjectPanel() { @@ -500,7 +529,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow meshViewerWidget.AfterDraw += AfterDraw3DContent; - meshViewerWidget.TrackballTumbleWidget.DrawGlContent += TrackballTumbleWidget_DrawGlContent; + this.TrackballTumbleWidget.DrawGlContent += TrackballTumbleWidget_DrawGlContent; } private void ViewControls3D_TransformStateChanged(object sender, TransformStateChangedEventArgs e) @@ -508,19 +537,19 @@ namespace MatterHackers.MatterControl.PartPreviewWindow switch (e.TransformMode) { case ViewControls3DButtons.Rotate: - meshViewerWidget.TrackballTumbleWidget.TransformState = TrackBallController.MouseDownType.Rotation; + this.TrackballTumbleWidget.TransformState = TrackBallController.MouseDownType.Rotation; break; case ViewControls3DButtons.Translate: - meshViewerWidget.TrackballTumbleWidget.TransformState = TrackBallController.MouseDownType.Translation; + this.TrackballTumbleWidget.TransformState = TrackBallController.MouseDownType.Translation; break; case ViewControls3DButtons.Scale: - meshViewerWidget.TrackballTumbleWidget.TransformState = TrackBallController.MouseDownType.Scale; + this.TrackballTumbleWidget.TransformState = TrackBallController.MouseDownType.Scale; break; case ViewControls3DButtons.PartSelect: - meshViewerWidget.TrackballTumbleWidget.TransformState = TrackBallController.MouseDownType.None; + this.TrackballTumbleWidget.TransformState = TrackBallController.MouseDownType.None; break; } } @@ -563,6 +592,13 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { // This shows the BVH as rects around the scene items //Scene?.TraceData().RenderBvhRecursive(0, 3); + + if (gcodeViewer?.loadedGCode == null || printer.BedPlate.GCodeRenderer == null || !gcodeViewer.Visible) + { + return; + } + + printer.BedPlate.Render3DLayerFeatures(); } public override void OnKeyDown(KeyEventArgs keyEvent) @@ -774,6 +810,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow meshViewerWidget.AfterDraw -= AfterDraw3DContent; } + this.TrackballTumbleWidget.DrawGlContent -= TrackballTumbleWidget_DrawGlContent; + unregisterEvents?.Invoke(this, null); base.OnClosed(e); } @@ -1074,7 +1112,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow for (int i = 0; i < 3; i++) { Vector3 bottomStartPosition = Vector3.Transform(tri.GetVertex(i), x.TransformToWorld); - traceBottoms[i] = meshViewerWidget.World.GetScreenPosition(bottomStartPosition); + traceBottoms[i] = this.World.GetScreenPosition(bottomStartPosition); } for (int i = 0; i < 3; i++) @@ -1092,10 +1130,10 @@ namespace MatterHackers.MatterControl.PartPreviewWindow for (int i = 0; i < 4; i++) { Vector3 bottomStartPosition = Vector3.Transform(x.Bvh.GetAxisAlignedBoundingBox().GetBottomCorner(i), x.TransformToWorld); - traceBottoms[i] = meshViewerWidget.World.GetScreenPosition(bottomStartPosition); + traceBottoms[i] = this.World.GetScreenPosition(bottomStartPosition); Vector3 topStartPosition = Vector3.Transform(x.Bvh.GetAxisAlignedBoundingBox().GetTopCorner(i), x.TransformToWorld); - traceTops[i] = meshViewerWidget.World.GetScreenPosition(topStartPosition); + traceTops[i] = this.World.GetScreenPosition(topStartPosition); } RectangleDouble.OutCode allPoints = RectangleDouble.OutCode.Inside; @@ -1132,16 +1170,16 @@ namespace MatterHackers.MatterControl.PartPreviewWindow for (int i = 0; i < 4; i++) { Vector3 bottomStartPosition = Vector3.Transform(x.Bvh.GetAxisAlignedBoundingBox().GetBottomCorner(i), x.TransformToWorld); - var bottomStartScreenPos = meshViewerWidget.World.GetScreenPosition(bottomStartPosition); + var bottomStartScreenPos = this.World.GetScreenPosition(bottomStartPosition); Vector3 bottomEndPosition = Vector3.Transform(x.Bvh.GetAxisAlignedBoundingBox().GetBottomCorner((i + 1) % 4), x.TransformToWorld); - var bottomEndScreenPos = meshViewerWidget.World.GetScreenPosition(bottomEndPosition); + var bottomEndScreenPos = this.World.GetScreenPosition(bottomEndPosition); Vector3 topStartPosition = Vector3.Transform(x.Bvh.GetAxisAlignedBoundingBox().GetTopCorner(i), x.TransformToWorld); - var topStartScreenPos = meshViewerWidget.World.GetScreenPosition(topStartPosition); + var topStartScreenPos = this.World.GetScreenPosition(topStartPosition); Vector3 topEndPosition = Vector3.Transform(x.Bvh.GetAxisAlignedBoundingBox().GetTopCorner((i + 1) % 4), x.TransformToWorld); - var topEndScreenPos = meshViewerWidget.World.GetScreenPosition(topEndPosition); + var topEndScreenPos = this.World.GetScreenPosition(topEndPosition); e.graphics2D.Line(bottomStartScreenPos, bottomEndScreenPos, RGBA_Bytes.Black); e.graphics2D.Line(topStartScreenPos, topEndScreenPos, RGBA_Bytes.Black); @@ -1155,7 +1193,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { var vertexPos = tri.GetVertex(i); var screenCenter = Vector3.Transform(vertexPos, x.TransformToWorld); - var screenPos = meshViewerWidget.World.GetScreenPosition(screenCenter); + var screenPos = this.World.GetScreenPosition(screenCenter); e.graphics2D.Circle(screenPos, 3, RGBA_Bytes.Red); } @@ -1164,7 +1202,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { var center = x.Bvh.GetCenter(); var worldCenter = Vector3.Transform(center, x.TransformToWorld); - var screenPos2 = meshViewerWidget.World.GetScreenPosition(worldCenter); + var screenPos2 = this.World.GetScreenPosition(worldCenter); e.graphics2D.Circle(screenPos2, 3, RGBA_Bytes.Yellow); e.graphics2D.DrawString($"{x.Depth},", screenPos2.x + 12 * x.Depth, screenPos2.y); } @@ -1192,6 +1230,14 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public override void OnMouseDown(MouseEventArgs mouseEvent) { + if (this.TrackballTumbleWidget.MouseCaptured) + { + if (TrackballTumbleWidget.TransformState == TrackBallController.MouseDownType.Rotation || mouseEvent.Button == MouseButtons.Right) + { + TrackballTumbleWidget.DrawRotationHelperCircle = true; + } + } + // Show transform override if (activeButtonBeforeMouseOverride == null && mouseEvent.Button == MouseButtons.Right) { @@ -1213,13 +1259,13 @@ namespace MatterHackers.MatterControl.PartPreviewWindow autoRotating = false; base.OnMouseDown(mouseEvent); - if (meshViewerWidget.TrackballTumbleWidget.UnderMouseState == UnderMouseState.FirstUnderMouse) + if (this.TrackballTumbleWidget.UnderMouseState == UnderMouseState.FirstUnderMouse) { if (mouseEvent.Button == MouseButtons.Left && (ModifierKeys == Keys.Shift || ModifierKeys == Keys.Control) || ( - meshViewerWidget.TrackballTumbleWidget.TransformState == TrackBallController.MouseDownType.None + this.TrackballTumbleWidget.TransformState == TrackBallController.MouseDownType.None && ModifierKeys != Keys.Control && ModifierKeys != Keys.Alt)) { @@ -1333,7 +1379,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow // Translate to local Vector2 localPosition = this.TransformFromScreenSpace(screenSpacePosition); - Ray ray = meshViewerWidget.World.GetRayForLocalBounds(localPosition); + Ray ray = this.World.GetRayForLocalBounds(localPosition); return CurrentSelectInfo.HitPlane.GetClosestIntersection(ray); } @@ -1341,7 +1387,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public void DragSelectedObject(Vector2 localMousePostion) { Vector2 meshViewerWidgetScreenPosition = meshViewerWidget.TransformFromParentSpace(this, localMousePostion); - Ray ray = meshViewerWidget.World.GetRayForLocalBounds(meshViewerWidgetScreenPosition); + Ray ray = this.World.GetRayForLocalBounds(meshViewerWidgetScreenPosition); IntersectInfo info = CurrentSelectInfo.HitPlane.GetClosestIntersection(ray); if (info != null) @@ -1425,7 +1471,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow // AcceptDrop anytime a DropSource has been queued mouseEvent.AcceptDrop = this.DragDropSource != null; - if (CurrentSelectInfo.DownOnPart && meshViewerWidget.TrackballTumbleWidget.TransformState == TrackBallController.MouseDownType.None) + if (CurrentSelectInfo.DownOnPart && this.TrackballTumbleWidget.TransformState == TrackBallController.MouseDownType.None) { DragSelectedObject(new Vector2(mouseEvent.X, mouseEvent.Y)); } @@ -1467,8 +1513,23 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } } + public void ResetView() + { + this.TrackballTumbleWidget.ZeroVelocity(); + + var world = this.World; + + world.Reset(); + world.Scale = .03; + world.Translate(-new Vector3(bedCenter)); + world.Rotate(Quaternion.FromEulerAngles(new Vector3(0, 0, MathHelper.Tau / 16))); + world.Rotate(Quaternion.FromEulerAngles(new Vector3(-MathHelper.Tau * .19, 0, 0))); + } + public override void OnMouseUp(MouseEventArgs mouseEvent) { + this.TrackballTumbleWidget.DrawRotationHelperCircle = false; + if (mouseEvent.DragFiles?.Count > 0) { if (AllowDragDrop() && mouseEvent.DragFiles.Count == 1) @@ -1488,7 +1549,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } } - if (meshViewerWidget.TrackballTumbleWidget.TransformState == TrackBallController.MouseDownType.None) + if (this.TrackballTumbleWidget.TransformState == TrackBallController.MouseDownType.None) { if (CurrentSelectInfo.DownOnPart && CurrentSelectInfo.LastMoveDelta != Vector3.Zero) @@ -1641,7 +1702,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow Quaternion rotateAboutZ = Quaternion.FromEulerAngles(new Vector3(0, 0, .01)); rotateAboutZ = invertedRotation * rotateAboutZ * currentRotation; - meshViewerWidget.World.Rotate(rotateAboutZ); + this.World.Rotate(rotateAboutZ); Invalidate(); } } @@ -1802,7 +1863,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow Vector3 boundsCenter = selectedBounds.Center; Vector3 centerTop = new Vector3(boundsCenter.x, boundsCenter.y, selectedBounds.maxXYZ.z); - Vector2 centerTopScreenPosition = meshViewerWidget.World.GetScreenPosition(centerTop); + Vector2 centerTopScreenPosition = this.World.GetScreenPosition(centerTop); centerTopScreenPosition = meshViewerWidget.TransformToParentSpace(this, centerTopScreenPosition); //graphics2D.Circle(screenPosition.x, screenPosition.y, 5, RGBA_Bytes.Cyan); @@ -2513,7 +2574,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow protected IObject3D FindHitObject3D(Vector2 screenPosition, ref IntersectInfo intersectionInfo) { Vector2 meshViewerWidgetScreenPosition = meshViewerWidget.TransformFromParentSpace(this, screenPosition); - Ray ray = meshViewerWidget.World.GetRayForLocalBounds(meshViewerWidgetScreenPosition); + Ray ray = this.World.GetRayForLocalBounds(meshViewerWidgetScreenPosition); intersectionInfo = Scene.TraceData().GetClosestIntersection(ray); if (intersectionInfo != null) diff --git a/PartPreviewWindow/ViewGcodeBasic.cs b/PartPreviewWindow/ViewGcodeBasic.cs index a047031bc..95b6ccb84 100644 --- a/PartPreviewWindow/ViewGcodeBasic.cs +++ b/PartPreviewWindow/ViewGcodeBasic.cs @@ -95,7 +95,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow ApplicationController.Instance.AdvancedControlsPanelReloading.RegisterEvent((s, e) => printer.BedPlate.GCodeRenderer?.Clear3DGCode(), ref unregisterEvents); } - private GCodeFile loadedGCode => printer.BedPlate.LoadedGCode; + internal GCodeFile loadedGCode => printer.BedPlate.LoadedGCode; internal void CreateAndAddChildren() { @@ -174,7 +174,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow } } - internal void LoadProgress_Changed((double progress0To1, string processingState) progress, CancellationTokenSource continueProcessing) { SetProcessingMessage(string.Format("{0} {1:0}%...", gcodeLoading, progress.progress0To1 * 100)); diff --git a/Tests/MatterControl.Tests/MatterControl.Tests.csproj b/Tests/MatterControl.Tests/MatterControl.Tests.csproj index 10a4483f4..97e48cefd 100644 --- a/Tests/MatterControl.Tests/MatterControl.Tests.csproj +++ b/Tests/MatterControl.Tests/MatterControl.Tests.csproj @@ -110,6 +110,10 @@ {74F6BB6C-9D02-4512-A59A-21940E35C532} Gui + + {C958F745-156E-4BDC-A24A-3721C7BE7B8A} + OpenGlGui + {3E4AABA8-D85F-4922-88C6-5C1B2D2308FB} PlatformAbstract