2017-07-06 12:22:56 -07:00
/ *
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 .
* /
2017-07-07 16:50:47 -07:00
using System ;
2017-07-10 12:32:41 -07:00
using System.Linq ;
2017-07-06 12:22:56 -07:00
using MatterHackers.Agg ;
using MatterHackers.Agg.UI ;
2017-07-07 16:50:47 -07:00
using MatterHackers.GCodeVisualizer ;
2017-07-06 12:22:56 -07:00
using MatterHackers.Localizations ;
using MatterHackers.MatterControl.CustomWidgets ;
2017-07-07 16:50:47 -07:00
using MatterHackers.MatterControl.PrinterCommunication ;
using MatterHackers.MatterControl.PrinterControls ;
2017-07-06 12:22:56 -07:00
using MatterHackers.MatterControl.PrintQueue ;
using MatterHackers.MatterControl.SlicerConfiguration ;
using MatterHackers.MeshVisualizer ;
using MatterHackers.VectorMath ;
namespace MatterHackers.MatterControl.PartPreviewWindow
{
2017-08-16 22:45:46 -07:00
public class PrinterTabPage : PrinterTabBase
2017-07-06 12:22:56 -07:00
{
2017-07-10 12:23:02 -07:00
internal GCode2DWidget gcode2DWidget ;
2017-09-01 21:23:08 -07:00
PrinterConnection printerConnection ;
2017-08-16 22:45:46 -07:00
private View3DConfig gcodeOptions ;
2017-07-06 14:41:32 -07:00
private DoubleSolidSlider layerRenderRatioSlider ;
private SolidSlider selectLayerSlider ;
2017-07-07 16:50:47 -07:00
private TextWidget layerCountText ;
private TextWidget layerStartText ;
private ValueDisplayInfo currentLayerInfo ;
2017-07-10 12:32:41 -07:00
private SystemWindow parentSystemWindow ;
2017-09-01 21:23:08 -07:00
public PrinterTabPage ( PrinterConnection printerConnection , PrinterConfig printer , ThemeConfig theme , PrintItemWrapper printItem , string tabTitle )
2017-08-16 22:45:46 -07:00
: base ( printer , theme , printItem , tabTitle )
2017-07-06 12:22:56 -07:00
{
2017-09-01 21:23:08 -07:00
this . printerConnection = printerConnection ;
2017-08-17 10:52:47 -07:00
modelViewer . meshViewerWidget . EditorMode = MeshViewerWidget . EditorType . Printer ;
2017-08-16 05:55:23 -07:00
gcodeOptions = printer . Bed . RendererOptions ;
2017-07-06 14:41:32 -07:00
2017-07-10 12:23:02 -07:00
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 ;
}
} ;
2017-07-06 12:22:56 -07:00
viewControls3D . ResetView + = ( sender , e ) = >
{
2017-07-13 15:35:05 -07:00
if ( gcode2DWidget ? . Visible = = true )
2017-07-10 12:23:02 -07:00
{
gcode2DWidget . CenterPartInView ( ) ;
}
2017-07-06 12:22:56 -07:00
} ;
2017-08-16 22:45:46 -07:00
viewControls3D . ViewModeChanged + = ( s , e ) = >
2017-07-06 12:22:56 -07:00
{
2017-08-16 22:45:46 -07:00
this . ViewMode = e . ViewMode ;
2017-07-06 12:22:56 -07:00
} ;
2017-07-06 14:41:32 -07:00
int sliderWidth = ( UserSettings . Instance . IsTouchScreen ) ? 20 : 10 ;
2017-07-07 16:50:47 -07:00
layerCountText = new TextWidget ( "" , pointSize : 9 , textColor : ActiveTheme . Instance . PrimaryTextColor )
{
Visible = false ,
AutoExpandBoundsToText = true
} ;
layerStartText = new TextWidget ( "1" , pointSize : 9 , textColor : ActiveTheme . Instance . PrimaryTextColor )
{
Visible = false ,
AutoExpandBoundsToText = true
} ;
2017-09-13 15:55:12 -07:00
selectLayerSlider = new SolidSlider ( new Vector2 ( ) , sliderWidth , 0 , 1 , Orientation . Vertical )
{
VAnchor = VAnchor . Stretch ,
2017-09-13 15:59:23 -07:00
Margin = new BorderDouble ( 0 , 20 , 0 , 10 )
2017-09-13 15:55:12 -07:00
} ;
2017-07-06 14:41:32 -07:00
selectLayerSlider . ValueChanged + = ( s , e ) = >
{
2017-09-01 17:41:43 -07:00
if ( printer ? . Bed ? . RenderInfo ! = null )
{
printer . Bed . ActiveLayerIndex = ( int ) ( selectLayerSlider . Value + . 5 ) ;
}
2017-07-06 14:41:32 -07:00
2017-07-07 12:52:00 -07:00
// show the layer info next to the slider
2017-07-06 14:41:32 -07:00
this . Invalidate ( ) ;
} ;
layerRenderRatioSlider = new DoubleSolidSlider ( new Vector2 ( ) , sliderWidth ) ;
layerRenderRatioSlider . FirstValue = 0 ;
layerRenderRatioSlider . FirstValueChanged + = ( s , e ) = >
{
2017-08-16 05:55:23 -07:00
printer . Bed . RenderInfo . FeatureToStartOnRatio0To1 = layerRenderRatioSlider . FirstValue ;
printer . Bed . RenderInfo . FeatureToEndOnRatio0To1 = layerRenderRatioSlider . SecondValue ;
2017-07-06 14:41:32 -07:00
this . Invalidate ( ) ;
} ;
layerRenderRatioSlider . SecondValue = 1 ;
layerRenderRatioSlider . SecondValueChanged + = ( s , e ) = >
{
2017-09-01 17:41:43 -07:00
if ( printer ? . Bed ? . RenderInfo ! = null )
{
printer . Bed . RenderInfo . FeatureToStartOnRatio0To1 = layerRenderRatioSlider . FirstValue ;
printer . Bed . RenderInfo . FeatureToEndOnRatio0To1 = layerRenderRatioSlider . SecondValue ;
}
2017-07-06 14:41:32 -07:00
this . Invalidate ( ) ;
} ;
2017-08-16 05:53:26 -07:00
2017-08-16 22:45:46 -07:00
currentLayerInfo = new ValueDisplayInfo ( "1000" )
2017-07-06 15:04:44 -07:00
{
2017-08-16 22:45:46 -07:00
GetDisplayString = ( value ) = > $"{value + 1}"
2017-07-06 15:04:44 -07:00
} ;
2017-08-16 22:45:46 -07:00
currentLayerInfo . EditComplete + = ( s , e ) = >
2017-07-06 12:22:56 -07:00
{
2017-08-16 22:45:46 -07:00
printer . Bed . ActiveLayerIndex = ( int ) currentLayerInfo . Value - 1 ;
} ;
2017-07-06 12:22:56 -07:00
2017-08-16 22:45:46 -07:00
AddSettingsTabBar ( leftToRight , modelViewer ) ;
2017-07-06 12:22:56 -07:00
2017-07-06 14:41:32 -07:00
view3DContainer . AddChild ( layerRenderRatioSlider ) ;
view3DContainer . AddChild ( selectLayerSlider ) ;
2017-07-07 16:50:47 -07:00
view3DContainer . AddChild ( layerCountText ) ;
view3DContainer . AddChild ( layerStartText ) ;
2017-07-06 14:41:32 -07:00
2017-08-16 05:55:23 -07:00
printer . Bed . ActiveLayerChanged + = SetPositionAndValue ;
2017-07-07 16:50:47 -07:00
selectLayerSlider . MouseEnter + = SetPositionAndValue ;
2017-07-07 12:52:00 -07:00
2017-08-16 22:45:46 -07:00
printer . Bed . LoadedGCodeChanged + = BedPlate_LoadedGCodeChanged ;
this . ShowSliceLayers = false ;
2017-07-07 12:52:00 -07:00
currentLayerInfo . Visible = false ;
view3DContainer . AddChild ( currentLayerInfo ) ;
2017-08-16 22:45:46 -07:00
modelViewer . BoundsChanged + = ( s , e ) = >
{
SetSliderSizes ( ) ;
} ;
// Must come after we have an instance of View3DWidget an its undo buffer
2017-09-15 12:08:00 -07:00
topToBottom . AddChild ( new PrinterActionsBar ( printer , modelViewer , this )
2017-08-16 22:45:46 -07:00
{
Padding = theme . ToolbarPadding
} , 0 ) ;
2017-08-16 05:55:23 -07:00
printer . Bed . ActiveLayerChanged + = ActiveLayer_Changed ;
2017-07-06 12:22:56 -07:00
2017-08-16 22:45:46 -07:00
SetSliderSizes ( ) ;
}
2017-07-06 12:22:56 -07:00
2017-08-16 22:45:46 -07:00
private GCodeFile loadedGCode = > printer . Bed . LoadedGCode ;
2017-07-06 12:22:56 -07:00
2017-08-16 22:45:46 -07:00
private bool showSliceLayers ;
private bool ShowSliceLayers
{
get = > showSliceLayers ;
set
2017-07-06 12:22:56 -07:00
{
2017-08-16 22:45:46 -07:00
showSliceLayers = value ;
modelViewer . gcodeViewer . Visible = value ;
2017-07-06 12:22:56 -07:00
2017-08-16 22:45:46 -07:00
modelViewer . meshViewerWidget . IsActive = ! value ;
2017-07-06 12:22:56 -07:00
2017-08-16 22:45:46 -07:00
if ( showSliceLayers )
{
modelViewer . Scene . ClearSelection ( ) ;
}
2017-07-06 14:41:32 -07:00
2017-08-16 22:45:46 -07:00
var slidersVisible = printer . Bed . RenderInfo ! = null & & value ;
2017-07-06 12:22:56 -07:00
2017-08-16 22:45:46 -07:00
selectLayerSlider . Visible = slidersVisible ;
layerRenderRatioSlider . Visible = slidersVisible ;
2017-07-06 12:22:56 -07:00
2017-08-16 22:45:46 -07:00
modelViewer . selectedObjectPanel . Visible = ! showSliceLayers ;
}
2017-07-06 12:22:56 -07:00
}
2017-08-16 22:45:46 -07:00
private PartViewMode viewMode ;
public PartViewMode ViewMode
2017-07-07 16:50:47 -07:00
{
2017-08-16 22:45:46 -07:00
get = > viewMode ;
set
2017-07-07 16:50:47 -07:00
{
2017-08-16 22:45:46 -07:00
if ( viewMode ! = value )
{
viewMode = value ;
viewControls3D . ViewMode = viewMode ;
switch ( viewMode )
{
case PartViewMode . Layers2D :
UserSettings . Instance . set ( "LayerViewDefault" , "2D Layer" ) ;
if ( gcode2DWidget ! = null )
{
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 ( gcode2DWidget . CenterPartInView ) ;
}
this . ShowSliceLayers = true ;
break ;
case PartViewMode . Layers3D :
UserSettings . Instance . set ( "LayerViewDefault" , "3D Layer" ) ;
if ( gcode2DWidget ! = null )
{
gcode2DWidget . Visible = false ;
}
this . ShowSliceLayers = true ;
break ;
case PartViewMode . Model :
this . ShowSliceLayers = false ;
break ;
}
}
}
2017-07-07 16:50:47 -07:00
}
2017-07-06 14:41:32 -07:00
private void BedPlate_LoadedGCodeChanged ( object sender , EventArgs e )
{
2017-08-16 05:55:23 -07:00
var layerCount = printer . Bed . LoadedGCode . LayerCount ;
2017-07-07 16:50:47 -07:00
selectLayerSlider . Maximum = layerCount - 1 ;
layerCountText . Text = layerCount . ToString ( ) ;
layerCountText . Visible = true ;
layerStartText . Visible = true ;
2017-07-06 15:58:14 -07:00
// ResetRenderInfo
2017-08-16 05:55:23 -07:00
printer . Bed . RenderInfo = new GCodeRenderInfo (
2017-07-06 15:58:14 -07:00
0 ,
1 ,
Agg . Transform . Affine . NewIdentity ( ) ,
1 ,
0 ,
1 ,
new Vector2 [ ]
{
2017-09-15 12:08:00 -07:00
printer . Settings . Helpers . ExtruderOffset ( 0 ) ,
printer . Settings . Helpers . ExtruderOffset ( 1 )
2017-07-06 15:58:14 -07:00
} ,
this . GetRenderType ,
2017-07-12 14:28:43 -07:00
MeshViewerWidget . GetExtruderColor ) ;
2017-07-10 12:23:02 -07:00
// Close and remove any existing widget reference
gcode2DWidget ? . Close ( ) ;
2017-08-16 05:55:23 -07:00
var viewerVolume = printer . Bed . ViewerVolume ;
2017-08-16 05:53:26 -07:00
2017-07-10 12:23:02 -07:00
// Create and append new widget
2017-08-16 05:55:23 -07:00
gcode2DWidget = new GCode2DWidget ( new Vector2 ( viewerVolume . x , viewerVolume . y ) , printer . Bed . BedCenter )
2017-07-10 12:23:02 -07:00
{
Visible = ( this . ViewMode = = PartViewMode . Layers2D )
} ;
view3DContainer . AddChild ( gcode2DWidget ) ;
viewControls3D . Layers2DButton . Enabled = true ;
2017-07-06 15:58:14 -07:00
}
private RenderType GetRenderType ( )
{
RenderType renderType = RenderType . Extrusions ;
if ( gcodeOptions . RenderMoves )
{
renderType | = RenderType . Moves ;
}
if ( gcodeOptions . RenderRetractions )
{
renderType | = RenderType . Retractions ;
}
if ( gcodeOptions . RenderSpeeds )
{
renderType | = RenderType . SpeedColors ;
}
if ( gcodeOptions . SimulateExtrusion )
{
renderType | = RenderType . SimulateExtrusion ;
}
if ( gcodeOptions . TransparentExtrusion )
{
renderType | = RenderType . TransparentExtrusion ;
}
if ( gcodeOptions . HideExtruderOffsets )
{
renderType | = RenderType . HideExtruderOffsets ;
}
return renderType ;
2017-07-06 14:41:32 -07:00
}
2017-08-16 22:45:46 -07:00
private void SetSyncToPrintVisibility ( )
2017-07-06 12:22:56 -07:00
{
2017-09-01 21:23:08 -07:00
bool printerIsRunningPrint = printerConnection . PrinterIsPaused | | printerConnection . PrinterIsPrinting ;
2017-07-06 12:22:56 -07:00
2017-08-16 22:45:46 -07:00
if ( gcodeOptions . SyncToPrint & & printerIsRunningPrint )
2017-07-06 12:22:56 -07:00
{
2017-08-16 22:45:46 -07:00
SetAnimationPosition ( ) ;
layerRenderRatioSlider . Visible = false ;
selectLayerSlider . Visible = false ;
2017-07-06 12:22:56 -07:00
}
else
{
2017-08-16 22:45:46 -07:00
if ( layerRenderRatioSlider ! = null )
{
layerRenderRatioSlider . FirstValue = 0 ;
layerRenderRatioSlider . SecondValue = 1 ;
}
2017-07-06 12:22:56 -07:00
2017-08-16 22:45:46 -07:00
layerRenderRatioSlider . Visible = true ;
selectLayerSlider . Visible = true ;
}
2017-07-06 12:22:56 -07:00
}
2017-08-16 22:45:46 -07:00
private void SetSliderSizes ( )
2017-07-06 14:41:32 -07:00
{
2017-08-16 22:45:46 -07:00
if ( selectLayerSlider = = null | | modelViewer = = null )
2017-07-06 14:41:32 -07:00
{
2017-08-16 22:45:46 -07:00
return ;
}
2017-07-06 14:41:32 -07:00
2017-08-16 22:45:46 -07:00
selectLayerSlider . OriginRelativeParent = new Vector2 ( modelViewer . Width - 20 , 78 ) ;
selectLayerSlider . TotalWidthInPixels = modelViewer . Height - 100 ;
2017-07-06 14:41:32 -07:00
2017-08-16 22:45:46 -07:00
layerRenderRatioSlider . OriginRelativeParent = new Vector2 ( 11 , 65 ) ;
layerRenderRatioSlider . TotalWidthInPixels = modelViewer . Width - 45 ;
2017-07-06 14:41:32 -07:00
2017-08-16 22:45:46 -07:00
layerCountText . OriginRelativeParent = new Vector2 ( modelViewer . Width - 26 + ( layerCountText . Width / 2 ) , modelViewer . Height - 15 ) ;
layerStartText . OriginRelativeParent = new Vector2 ( modelViewer . Width - 26 + ( layerStartText . Width / 2 ) , 63 ) ;
2017-07-06 12:22:56 -07:00
}
2017-08-16 22:45:46 -07:00
private void SetAnimationPosition ( )
2017-07-07 06:18:58 -07:00
{
2017-09-01 21:23:08 -07:00
int currentLayer = printerConnection . CurrentlyPrintingLayer ;
2017-08-16 22:45:46 -07:00
if ( currentLayer < = 0 )
2017-07-07 06:18:58 -07:00
{
2017-08-16 22:45:46 -07:00
selectLayerSlider . Value = 0 ;
layerRenderRatioSlider . SecondValue = 0 ;
layerRenderRatioSlider . FirstValue = 0 ;
2017-07-10 12:32:41 -07:00
}
2017-08-16 22:45:46 -07:00
else
2017-07-10 12:32:41 -07:00
{
2017-08-16 22:45:46 -07:00
selectLayerSlider . Value = currentLayer - 1 ;
2017-09-01 21:23:08 -07:00
layerRenderRatioSlider . SecondValue = printerConnection . RatioIntoCurrentLayer ;
2017-08-16 22:45:46 -07:00
layerRenderRatioSlider . FirstValue = 0 ;
2017-07-10 12:32:41 -07:00
}
}
2017-08-16 22:45:46 -07:00
private void ActiveLayer_Changed ( object sender , EventArgs e )
2017-07-06 14:41:32 -07:00
{
2017-08-16 22:45:46 -07:00
if ( selectLayerSlider ! = null
& & printer . Bed . ActiveLayerIndex ! = ( int ) ( selectLayerSlider . Value + . 5 ) )
2017-07-06 14:41:32 -07:00
{
2017-08-16 22:45:46 -07:00
selectLayerSlider . Value = printer . Bed . ActiveLayerIndex ;
2017-07-06 14:41:32 -07:00
}
}
2017-08-16 22:45:46 -07:00
private void SetPositionAndValue ( object sender , EventArgs e )
2017-07-06 12:22:56 -07:00
{
2017-08-16 22:45:46 -07:00
UiThread . RunOnIdle ( ( ) = >
2017-07-10 12:32:41 -07:00
{
2017-08-16 22:45:46 -07:00
currentLayerInfo . Value = printer . Bed . ActiveLayerIndex ;
//currentLayerInfo.DebugShowBounds = true;
currentLayerInfo . OriginRelativeParent = selectLayerSlider . OriginRelativeParent
+ new Vector2 ( - currentLayerInfo . Width - 10 , selectLayerSlider . PositionPixelsFromFirstValue - currentLayerInfo . Height / 2 ) ;
currentLayerInfo . Visible = true ;
} ) ;
2017-07-06 12:22:56 -07:00
}
2017-07-06 14:41:32 -07:00
internal GuiWidget ShowGCodeOverflowMenu ( )
{
var textColor = RGBA_Bytes . Black ;
var popupContainer = new FlowLayoutWidget ( FlowDirection . TopToBottom )
{
2017-08-07 15:47:27 -07:00
HAnchor = HAnchor . Stretch ,
2017-07-06 14:41:32 -07:00
Padding = 12 ,
BackgroundColor = RGBA_Bytes . White
} ;
// put in a show grid check box
CheckBox showGrid = new CheckBox ( "Print Bed" . Localize ( ) , textColor : textColor ) ;
showGrid . Checked = gcodeOptions . RenderGrid ;
showGrid . CheckedStateChanged + = ( sender , e ) = >
{
// TODO: How (if at all) do we disable bed rendering on GCode2D?
gcodeOptions . RenderGrid = showGrid . Checked ;
} ;
popupContainer . AddChild ( showGrid ) ;
// put in a show moves checkbox
var showMoves = new CheckBox ( "Moves" . Localize ( ) , textColor : textColor ) ;
showMoves . Checked = gcodeOptions . RenderMoves ;
showMoves . CheckedStateChanged + = ( sender , e ) = >
{
gcodeOptions . RenderMoves = showMoves . Checked ;
} ;
popupContainer . AddChild ( showMoves ) ;
// put in a show Retractions checkbox
CheckBox showRetractions = new CheckBox ( "Retractions" . Localize ( ) , textColor : textColor ) ;
showRetractions . Checked = gcodeOptions . RenderRetractions ;
showRetractions . CheckedStateChanged + = ( sender , e ) = >
{
gcodeOptions . RenderRetractions = showRetractions . Checked ;
} ;
popupContainer . AddChild ( showRetractions ) ;
// Speeds checkbox
var showSpeeds = new CheckBox ( "Speeds" . Localize ( ) , textColor : textColor ) ;
showSpeeds . Checked = gcodeOptions . RenderSpeeds ;
showSpeeds . CheckedStateChanged + = ( sender , e ) = >
{
//gradientWidget.Visible = showSpeeds.Checked;
gcodeOptions . RenderSpeeds = showSpeeds . Checked ;
} ;
popupContainer . AddChild ( showSpeeds ) ;
// Extrusion checkbox
var simulateExtrusion = new CheckBox ( "Extrusion" . Localize ( ) , textColor : textColor ) ;
simulateExtrusion . Checked = gcodeOptions . SimulateExtrusion ;
simulateExtrusion . CheckedStateChanged + = ( sender , e ) = >
{
gcodeOptions . SimulateExtrusion = simulateExtrusion . Checked ;
} ;
popupContainer . AddChild ( simulateExtrusion ) ;
// Transparent checkbox
var transparentExtrusion = new CheckBox ( "Transparent" . Localize ( ) , textColor : textColor )
{
Checked = gcodeOptions . TransparentExtrusion ,
Margin = new BorderDouble ( 5 , 0 , 0 , 0 ) ,
2017-08-07 15:47:27 -07:00
HAnchor = HAnchor . Left ,
2017-07-06 14:41:32 -07:00
} ;
transparentExtrusion . CheckedStateChanged + = ( sender , e ) = >
{
gcodeOptions . TransparentExtrusion = transparentExtrusion . Checked ;
} ;
popupContainer . AddChild ( transparentExtrusion ) ;
// Extrusion checkbox
2017-09-15 12:08:00 -07:00
if ( printer . Settings . GetValue < int > ( SettingsKey . extruder_count ) > 1 )
2017-07-06 14:41:32 -07:00
{
CheckBox hideExtruderOffsets = new CheckBox ( "Hide Offsets" , textColor : textColor ) ;
hideExtruderOffsets . Checked = gcodeOptions . HideExtruderOffsets ;
hideExtruderOffsets . CheckedStateChanged + = ( sender , e ) = >
{
gcodeOptions . HideExtruderOffsets = hideExtruderOffsets . Checked ;
} ;
popupContainer . AddChild ( hideExtruderOffsets ) ;
}
// Sync To Print checkbox
{
var syncToPrint = new CheckBox ( "Sync To Print" . Localize ( ) , textColor : textColor ) ;
syncToPrint . Checked = ( UserSettings . Instance . get ( "LayerViewSyncToPrint" ) = = "True" ) ;
syncToPrint . Name = "Sync To Print Checkbox" ;
syncToPrint . CheckedStateChanged + = ( s , e ) = >
{
gcodeOptions . SyncToPrint = syncToPrint . Checked ;
SetSyncToPrintVisibility ( ) ;
} ;
popupContainer . AddChild ( syncToPrint ) ;
}
return popupContainer ;
}
2017-08-16 22:45:46 -07:00
public override void OnDraw ( Graphics2D graphics2D )
2017-07-06 14:41:32 -07:00
{
2017-09-01 21:23:08 -07:00
bool printerIsRunningPrint = printerConnection . PrinterIsPaused | | printerConnection . PrinterIsPrinting ;
2017-08-16 22:45:46 -07:00
if ( gcodeOptions . SyncToPrint
& & printerIsRunningPrint
& & modelViewer . gcodeViewer . Visible )
2017-07-06 14:41:32 -07:00
{
SetAnimationPosition ( ) ;
2017-08-16 22:45:46 -07:00
this . Invalidate ( ) ;
}
base . OnDraw ( graphics2D ) ;
}
protected override GuiWidget GetViewControls3DOverflowMenu ( )
{
if ( modelViewer . gcodeViewer . Visible )
{
return this . ShowGCodeOverflowMenu ( ) ;
2017-07-06 14:41:32 -07:00
}
else
{
2017-08-16 22:45:46 -07:00
return modelViewer . ShowOverflowMenu ( ) ;
}
}
2017-07-06 14:41:32 -07:00
2017-08-16 22:45:46 -07:00
public override void OnLoad ( EventArgs args )
{
// Find and hook the parent system window KeyDown event
if ( this . Parents < SystemWindow > ( ) . FirstOrDefault ( ) is SystemWindow systemWindow )
{
systemWindow . KeyDown + = Parent_KeyDown ;
parentSystemWindow = systemWindow ;
2017-07-06 14:41:32 -07:00
}
2017-08-16 22:45:46 -07:00
base . OnLoad ( args ) ;
2017-07-06 14:41:32 -07:00
}
2017-08-16 22:45:46 -07:00
public override void OnClosed ( ClosedEventArgs e )
2017-07-06 14:41:32 -07:00
{
2017-08-16 22:45:46 -07:00
// Find and unhook the parent system window KeyDown event
if ( parentSystemWindow ! = null )
2017-07-06 14:41:32 -07:00
{
2017-08-16 22:45:46 -07:00
parentSystemWindow . KeyDown - = Parent_KeyDown ;
2017-07-06 14:41:32 -07:00
}
2017-08-16 22:45:46 -07:00
printer . Bed . ActiveLayerChanged - = ActiveLayer_Changed ;
printer . Bed . LoadedGCodeChanged - = BedPlate_LoadedGCodeChanged ;
2017-07-06 14:41:32 -07:00
2017-08-16 22:45:46 -07:00
printer . Bed . ActiveLayerChanged - = SetPositionAndValue ;
selectLayerSlider . MouseEnter - = SetPositionAndValue ;
2017-07-07 16:50:47 -07:00
2017-08-16 22:45:46 -07:00
base . OnClosed ( e ) ;
2017-07-06 14:41:32 -07:00
}
2017-08-16 22:45:46 -07:00
private void Parent_KeyDown ( object sender , KeyEventArgs keyEvent )
2017-07-06 14:41:32 -07:00
{
2017-08-16 22:45:46 -07:00
if ( modelViewer . gcodeViewer . Visible )
2017-07-06 14:41:32 -07:00
{
2017-08-16 22:45:46 -07:00
switch ( keyEvent . KeyCode )
{
case Keys . Up :
printer . Bed . ActiveLayerIndex + = 1 ;
break ;
case Keys . Down :
printer . Bed . ActiveLayerIndex - = 1 ;
break ;
}
}
}
private void AddSettingsTabBar ( GuiWidget parent , GuiWidget widgetTodockTo )
{
var sideBar = new DockingTabControl ( widgetTodockTo , DockSide . Right , ApplicationController . Instance . Printer )
{
2017-09-01 11:44:18 +03:00
ControlIsPinned = ApplicationController . Instance . Printer . ViewState . SliceSettingsTabPinned
2017-08-16 22:45:46 -07:00
} ;
sideBar . PinStatusChanged + = ( s , e ) = >
{
2017-09-01 11:44:18 +03:00
ApplicationController . Instance . Printer . ViewState . SliceSettingsTabPinned = sideBar . ControlIsPinned ;
2017-08-16 22:45:46 -07:00
} ;
parent . AddChild ( sideBar ) ;
2017-09-15 12:08:00 -07:00
if ( printer . Settings . PrinterSelected )
2017-08-16 22:45:46 -07:00
{
2017-09-03 18:50:44 +03:00
sideBar . AddPage (
"Slice Settings" . Localize ( ) ,
new SliceSettingsWidget (
new SettingsContext (
null ,
SlicerConfiguration . NamedSettingsLayers . All ) ) ) ;
2017-07-06 14:41:32 -07:00
}
else
{
2017-09-13 22:00:28 -07:00
sideBar . AddPage ( "Slice Settings" . Localize ( ) , new SliceSettingsMissingWidget ( ) ) ;
2017-07-06 14:41:32 -07:00
}
2017-08-16 22:45:46 -07:00
2017-09-15 12:08:00 -07:00
sideBar . AddPage ( "Controls" . Localize ( ) , new ManualPrinterControls ( printer ) ) ;
2017-08-16 22:45:46 -07:00
2017-09-15 12:08:00 -07:00
sideBar . AddPage ( "Terminal" . Localize ( ) , new TerminalWidget ( printer . Connection )
2017-08-24 17:09:10 -07:00
{
VAnchor = VAnchor . Stretch ,
HAnchor = HAnchor . Stretch
} ) ;
2017-07-06 14:41:32 -07:00
}
2017-08-16 22:45:46 -07:00
}
2017-07-06 14:41:32 -07:00
2017-08-16 22:45:46 -07:00
public class PrinterTabBase : TabPage
{
internal View3DWidget modelViewer ;
private PrintItemWrapper printItem ;
protected ViewControls3D viewControls3D ;
protected PrinterConfig printer ;
protected ThemeConfig theme ;
protected GuiWidget view3DContainer ;
protected FlowLayoutWidget topToBottom ;
protected FlowLayoutWidget leftToRight ;
public PrinterTabBase ( PrinterConfig printer , ThemeConfig theme , PrintItemWrapper printItem , string tabTitle )
: base ( tabTitle )
2017-07-06 14:41:32 -07:00
{
2017-08-16 22:45:46 -07:00
this . printer = printer ;
this . theme = theme ;
this . BackgroundColor = theme . TabBodyBackground ;
this . Padding = 0 ;
viewControls3D = new ViewControls3D ( theme , printer . Bed . Scene . UndoBuffer )
2017-07-06 14:41:32 -07:00
{
2017-08-16 22:45:46 -07:00
PartSelectVisible = false ,
VAnchor = VAnchor . Top | VAnchor . Fit | VAnchor . Absolute ,
HAnchor = HAnchor . Left | HAnchor . Fit ,
Visible = true ,
Margin = new BorderDouble ( 6 , 0 , 0 , 43 )
} ;
viewControls3D . ResetView + = ( sender , e ) = >
{
if ( modelViewer . Visible )
{
this . modelViewer . ResetView ( ) ;
}
} ;
viewControls3D . OverflowButton . DynamicPopupContent = ( ) = >
{
return this . GetViewControls3DOverflowMenu ( ) ;
} ;
2017-08-17 11:18:11 -07:00
bool isPrinterType = this . GetType ( ) = = typeof ( PrinterTabPage ) ;
2017-08-16 22:45:46 -07:00
// The 3D model view
2017-09-03 11:48:08 -07:00
modelViewer = new View3DWidget ( PrinterConnection . Instance , printItem ,
2017-08-16 22:45:46 -07:00
printer ,
View3DWidget . AutoRotate . Disabled ,
viewControls3D ,
theme ,
2017-08-17 11:18:11 -07:00
View3DWidget . OpenMode . Editing ,
editorType : ( isPrinterType ) ? MeshViewerWidget . EditorType . Printer : MeshViewerWidget . EditorType . Part ) ;
2017-08-16 22:45:46 -07:00
topToBottom = new FlowLayoutWidget ( FlowDirection . TopToBottom ) ;
topToBottom . AnchorAll ( ) ;
this . AddChild ( topToBottom ) ;
leftToRight = new FlowLayoutWidget ( ) ;
leftToRight . Name = "View3DContainerParent" ;
leftToRight . AnchorAll ( ) ;
topToBottom . AddChild ( leftToRight ) ;
view3DContainer = new GuiWidget ( ) ;
view3DContainer . AnchorAll ( ) ;
view3DContainer . AddChild ( modelViewer ) ;
leftToRight . AddChild ( view3DContainer ) ;
modelViewer . BackgroundColor = ActiveTheme . Instance . TertiaryBackgroundColor ;
if ( ApplicationController . Instance . PartPreviewState . RotationMatrix = = Matrix4X4 . Identity )
{
this . modelViewer . ResetView ( ) ;
ApplicationController . Instance . PartPreviewState . RotationMatrix = modelViewer . World . RotationMatrix ;
ApplicationController . Instance . PartPreviewState . TranslationMatrix = modelViewer . World . TranslationMatrix ;
}
else
{
modelViewer . World . RotationMatrix = ApplicationController . Instance . PartPreviewState . RotationMatrix ;
modelViewer . World . TranslationMatrix = ApplicationController . Instance . PartPreviewState . TranslationMatrix ;
2017-07-06 14:41:32 -07:00
}
2017-08-16 22:45:46 -07:00
this . printItem = printItem ;
this . AddChild ( viewControls3D ) ;
this . AnchorAll ( ) ;
}
protected virtual GuiWidget GetViewControls3DOverflowMenu ( )
{
return modelViewer . ShowOverflowMenu ( ) ;
}
private async void LoadActivePrintItem ( )
{
await modelViewer . ClearBedAndLoadPrintItemWrapper ( printItem ) ;
2017-07-06 14:41:32 -07:00
}
2017-08-16 22:45:46 -07:00
public override void OnLoad ( EventArgs args )
{
ApplicationController . Instance . ActiveView3DWidget = modelViewer ;
LoadActivePrintItem ( ) ;
base . OnLoad ( args ) ;
}
public override void OnClosed ( ClosedEventArgs e )
{
// Store active transforms on close
ApplicationController . Instance . PartPreviewState . RotationMatrix = modelViewer . World . RotationMatrix ;
ApplicationController . Instance . PartPreviewState . TranslationMatrix = modelViewer . World . TranslationMatrix ;
base . OnClosed ( e ) ;
}
2017-07-06 12:22:56 -07:00
}
}