2014-02-10 17:59:57 -08:00
/ *
2014-02-15 18:06:03 -08:00
Copyright ( c ) 2014 , Lars Brubaker
2014-01-29 19:09:30 -08:00
All rights reserved .
Redistribution and use in source and binary forms , with or without
2015-04-08 15:20:10 -07:00
modification , are permitted provided that the following conditions are met :
2014-01-29 19:09:30 -08:00
1. Redistributions of source code must retain the above copyright notice , this
2015-04-08 15:20:10 -07:00
list of conditions and the following disclaimer .
2014-01-29 19:09:30 -08:00
2. Redistributions in binary form must reproduce the above copyright notice ,
this list of conditions and the following disclaimer in the documentation
2015-04-08 15:20:10 -07:00
and / or other materials provided with the distribution .
2014-01-29 19:09:30 -08:00
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
2015-04-08 15:20:10 -07:00
of the authors and should not be interpreted as representing official policies ,
2014-01-29 19:09:30 -08:00
either expressed or implied , of the FreeBSD Project .
* /
using MatterHackers.Agg ;
using MatterHackers.Agg.Font ;
2014-06-11 14:52:58 -07:00
using MatterHackers.Agg.UI ;
2014-01-29 19:09:30 -08:00
using MatterHackers.Localizations ;
2015-04-08 15:20:10 -07:00
using MatterHackers.MatterControl.CustomWidgets ;
2014-06-11 14:52:58 -07:00
using MatterHackers.MatterControl.PrinterCommunication ;
2014-06-15 09:49:03 -07:00
using MatterHackers.MatterControl.SlicerConfiguration ;
2015-04-08 15:20:10 -07:00
using MatterHackers.VectorMath ;
using System ;
using System.Collections.Generic ;
2014-01-29 19:09:30 -08:00
namespace MatterHackers.MatterControl
{
2015-04-08 15:20:10 -07:00
public abstract class TemperatureControlBase : FlowLayoutWidget
{
protected TextImageButtonFactory textImageButtonFactory = new TextImageButtonFactory ( ) ;
protected TextWidget actualTempIndicator ;
protected FlowLayoutWidget presetButtonsContainer ;
protected EditableNumberDisplay targetTemperatureDisplay ;
protected string label ;
protected string editWindowLabel ;
protected int extruderIndex0Based = 0 ;
protected TemperatureControlBase ( int extruderIndex0Based , string label , string editWindowLabel )
: base ( FlowDirection . TopToBottom )
{
this . extruderIndex0Based = extruderIndex0Based ;
this . label = label ;
this . editWindowLabel = editWindowLabel ;
SetDisplayAttributes ( ) ;
}
protected abstract double GetActualTemperature ( ) ;
protected abstract double GetTargetTemperature ( ) ;
protected abstract void SetTargetTemperature ( double targetTemp ) ;
protected abstract string GetTemperaturePresets ( ) ;
protected abstract double GetPreheatTemperature ( ) ;
protected abstract void SetTemperaturePresets ( object sender , EventArgs stringEvent ) ;
protected abstract string HelpText { get ; }
private void SetDisplayAttributes ( )
{
this . textImageButtonFactory . normalFillColor = RGBA_Bytes . Transparent ;
2016-05-06 17:56:27 -07:00
this . textImageButtonFactory . FixedWidth = 38 * GuiWidget . DeviceScale ;
this . textImageButtonFactory . FixedHeight = 20 * GuiWidget . DeviceScale ;
2015-04-08 15:20:10 -07:00
this . textImageButtonFactory . fontSize = 10 ;
this . textImageButtonFactory . borderWidth = 1 ;
this . textImageButtonFactory . normalBorderColor = new RGBA_Bytes ( ActiveTheme . Instance . PrimaryTextColor , 200 ) ;
this . textImageButtonFactory . hoverBorderColor = new RGBA_Bytes ( ActiveTheme . Instance . PrimaryTextColor , 200 ) ;
this . textImageButtonFactory . disabledTextColor = RGBA_Bytes . Gray ;
this . textImageButtonFactory . hoverTextColor = ActiveTheme . Instance . PrimaryTextColor ;
this . textImageButtonFactory . normalTextColor = ActiveTheme . Instance . SecondaryTextColor ;
this . textImageButtonFactory . pressedTextColor = ActiveTheme . Instance . PrimaryTextColor ;
this . HAnchor = HAnchor . ParentLeftRight ;
}
public override RectangleDouble LocalBounds
{
get
{
return base . LocalBounds ;
}
set
{
base . LocalBounds = value ;
}
}
2017-05-19 14:39:57 -07:00
protected FlowLayoutWidget tempEditContainer ;
2015-04-08 15:20:10 -07:00
private EditTemperaturePresetsWindow editSettingsWindow ;
protected void AddChildElements ( )
{
Button editButton ;
AltGroupBox groupBox = new AltGroupBox ( textImageButtonFactory . GenerateGroupBoxLabelWithEdit ( label , out editButton ) ) ;
editButton . Click + = ( sender , e ) = >
{
if ( editSettingsWindow = = null )
{
editSettingsWindow = new EditTemperaturePresetsWindow ( editWindowLabel , GetTemperaturePresets ( ) , SetTemperaturePresets ) ;
editSettingsWindow . Closed + = ( popupWindowSender , popupWindowSenderE ) = > { editSettingsWindow = null ; } ;
}
else
{
editSettingsWindow . BringToFront ( ) ;
}
} ;
groupBox . TextColor = ActiveTheme . Instance . PrimaryTextColor ;
groupBox . BorderColor = ActiveTheme . Instance . PrimaryTextColor ;
groupBox . HAnchor | = Agg . UI . HAnchor . ParentLeftRight ;
// make sure the client area will get smaller when the contents get smaller
groupBox . ClientArea . VAnchor = Agg . UI . VAnchor . FitToChildren ;
FlowLayoutWidget controlRow = new FlowLayoutWidget ( Agg . UI . FlowDirection . TopToBottom ) ;
2016-05-06 17:56:27 -07:00
controlRow . Margin = new BorderDouble ( top : 2 ) ;
2015-04-08 15:20:10 -07:00
controlRow . HAnchor | = HAnchor . ParentLeftRight ;
{
// put in the temperature slider and preset buttons
2017-05-19 14:39:57 -07:00
tempEditContainer = new FlowLayoutWidget ( Agg . UI . FlowDirection . TopToBottom ) ;
2015-04-08 15:20:10 -07:00
{
GuiWidget sliderLabels = GetSliderLabels ( ) ;
2017-05-19 14:39:57 -07:00
tempEditContainer . HAnchor = HAnchor . ParentLeftRight ;
tempEditContainer . AddChild ( sliderLabels ) ;
tempEditContainer . Visible = false ;
2015-04-08 15:20:10 -07:00
}
GuiWidget spacer = new GuiWidget ( 0 , 10 ) ;
spacer . HAnchor = Agg . UI . HAnchor . ParentLeftRight ;
// put in the temperature indicators
{
FlowLayoutWidget temperatureIndicator = new FlowLayoutWidget ( ) ;
temperatureIndicator . HAnchor = Agg . UI . HAnchor . ParentLeftRight ;
2016-05-06 17:56:27 -07:00
temperatureIndicator . Margin = new BorderDouble ( bottom : 0 ) ;
temperatureIndicator . Padding = new BorderDouble ( 0 , 3 ) ;
2015-04-08 15:20:10 -07:00
// put in the actual temperature controls
{
2017-01-11 06:19:19 -08:00
var extruderActualIndicator = new FlowLayoutWidget ( Agg . UI . FlowDirection . LeftToRight ) ;
2015-04-08 15:20:10 -07:00
2016-05-06 17:56:27 -07:00
extruderActualIndicator . Margin = new BorderDouble ( 3 , 0 ) ;
2017-01-11 06:19:19 -08:00
TextWidget extruderActualLabel = new TextWidget ( "Actual" . Localize ( ) + ": " , pointSize : 10 ) ;
2015-04-08 15:20:10 -07:00
extruderActualLabel . TextColor = ActiveTheme . Instance . PrimaryTextColor ;
extruderActualLabel . VAnchor = VAnchor . ParentCenter ;
2014-01-29 19:09:30 -08:00
2015-04-08 15:20:10 -07:00
actualTempIndicator = new TextWidget ( string . Format ( "{0:0.0}°C" , GetActualTemperature ( ) ) , pointSize : 12 ) ;
actualTempIndicator . AutoExpandBoundsToText = true ;
actualTempIndicator . TextColor = ActiveTheme . Instance . PrimaryTextColor ;
actualTempIndicator . VAnchor = VAnchor . ParentCenter ;
2014-01-29 19:09:30 -08:00
2015-04-08 15:20:10 -07:00
extruderActualIndicator . AddChild ( extruderActualLabel ) ;
extruderActualIndicator . AddChild ( actualTempIndicator ) ;
2014-01-29 19:09:30 -08:00
2017-01-11 06:19:19 -08:00
var extruderTargetLabel = new TextWidget ( "Target" . Localize ( ) + ": " , pointSize : 10 ) ;
2016-05-06 17:56:27 -07:00
extruderTargetLabel . Margin = new BorderDouble ( left : 10 ) ;
2015-04-08 15:20:10 -07:00
extruderTargetLabel . TextColor = ActiveTheme . Instance . PrimaryTextColor ;
extruderTargetLabel . VAnchor = VAnchor . ParentCenter ;
extruderActualIndicator . AddChild ( extruderTargetLabel ) ;
temperatureIndicator . AddChild ( extruderActualIndicator ) ;
}
// put in the target temperature controls
temperatureIndicator . AddChild ( GetTargetTemperatureDisplay ( ) ) ;
FlowLayoutWidget helperTextWidget = GetHelpTextWidget ( ) ;
LinkButtonFactory linkFactory = new LinkButtonFactory ( ) ;
linkFactory . textColor = ActiveTheme . Instance . PrimaryTextColor ;
linkFactory . fontSize = 10 ;
Button helpTextLink = linkFactory . Generate ( "?" ) ;
helpTextLink . Click + = ( sender , e ) = >
{
helperTextWidget . Visible = ! helperTextWidget . Visible ;
} ;
this . presetButtonsContainer = GetPresetsContainer ( ) ;
temperatureIndicator . AddChild ( new HorizontalSpacer ( ) ) ;
temperatureIndicator . AddChild ( presetButtonsContainer ) ;
controlRow . AddChild ( temperatureIndicator ) ;
}
}
groupBox . AddChild ( controlRow ) ;
this . AddChild ( groupBox ) ;
}
private FlowLayoutWidget GetPresetsContainer ( )
{
FlowLayoutWidget presetsContainer = new FlowLayoutWidget ( ) ;
2016-05-06 17:56:27 -07:00
presetsContainer . Margin = new BorderDouble ( 3 , 0 ) ;
2015-04-08 15:20:10 -07:00
2017-01-04 07:23:30 -08:00
string presetsLabelTxt = "Presets" . Localize ( ) ;
2015-04-08 15:20:10 -07:00
string presetsLabelTxtFull = string . Format ( "{0}: " , presetsLabelTxt ) ;
TextWidget presetsLabel = new TextWidget ( presetsLabelTxtFull , pointSize : 10 ) ;
2016-05-06 17:56:27 -07:00
presetsLabel . Margin = new BorderDouble ( right : 5 ) ;
2015-04-08 15:20:10 -07:00
presetsLabel . TextColor = ActiveTheme . Instance . PrimaryTextColor ;
presetsLabel . VAnchor = VAnchor . ParentCenter ;
//presetsContainer.AddChild(presetsLabel);
SortedDictionary < double , string > labels = GetTemperaturePresetLabels ( ) ;
foreach ( KeyValuePair < double , string > keyValue in labels )
{
Button tempButton = textImageButtonFactory . Generate ( keyValue . Value ) ;
2016-05-06 17:56:27 -07:00
tempButton . Margin = new BorderDouble ( right : 5 ) ;
2015-04-08 15:20:10 -07:00
presetsContainer . AddChild ( tempButton ) ;
// We push the value into a temp double so that the function will not point to a shared keyValue instance.
double temp = keyValue . Key ;
tempButton . Click + = ( sender , e ) = >
{
2015-06-11 12:06:40 -07:00
UiThread . RunOnIdle ( ( ) = >
2015-05-18 14:42:01 -07:00
{
SetTargetTemperature ( temp ) ;
2017-05-19 14:39:57 -07:00
tempEditContainer . Visible = false ;
2015-05-18 14:42:01 -07:00
} ) ;
2015-04-08 15:20:10 -07:00
} ;
}
2016-05-06 17:56:27 -07:00
this . textImageButtonFactory . FixedWidth = 76 * GuiWidget . DeviceScale ;
2015-04-08 15:20:10 -07:00
{
Button tempButton = textImageButtonFactory . Generate ( "Preheat" . Localize ( ) . ToUpper ( ) ) ;
2016-05-06 17:56:27 -07:00
tempButton . Margin = new BorderDouble ( right : 5 ) ;
2015-04-08 15:20:10 -07:00
presetsContainer . AddChild ( tempButton ) ;
// We push the value into a temp double so that the function will not point to a shared keyValue instance.
tempButton . Click + = ( sender , e ) = >
{
2015-06-11 12:06:40 -07:00
UiThread . RunOnIdle ( ( ) = >
2015-05-18 14:42:01 -07:00
{
2016-01-20 07:26:54 -08:00
SetTargetTemperature ( GetPreheatTemperature ( ) ) ;
2017-05-19 14:39:57 -07:00
tempEditContainer . Visible = false ;
2015-05-18 14:42:01 -07:00
} ) ;
2015-04-08 15:20:10 -07:00
} ;
}
2016-05-06 17:56:27 -07:00
this . textImageButtonFactory . FixedWidth = 38 * GuiWidget . DeviceScale ;
2015-04-08 15:20:10 -07:00
return presetsContainer ;
}
private EditableNumberDisplay GetTargetTemperatureDisplay ( )
{
targetTemperatureDisplay = new EditableNumberDisplay ( textImageButtonFactory , string . Format ( "{0:0.0}°C" , GetTargetTemperature ( ) ) , string . Format ( "{0:0.0}°C" , 240.2 ) ) ;
targetTemperatureDisplay . EditEnabled + = ( sender , e ) = >
{
2017-05-19 14:39:57 -07:00
tempEditContainer . Visible = true ;
2015-04-08 15:20:10 -07:00
} ;
targetTemperatureDisplay . EditComplete + = ( sender , e ) = >
{
SetTargetTemperature ( targetTemperatureDisplay . GetValue ( ) ) ;
} ;
return targetTemperatureDisplay ;
}
private FlowLayoutWidget GetHelpTextWidget ( )
{
FlowLayoutWidget allText = new FlowLayoutWidget ( FlowDirection . TopToBottom ) ;
2016-05-06 17:56:27 -07:00
double textRegionWidth = 260 * GuiWidget . DeviceScale ;
allText . Margin = new BorderDouble ( 3 ) ;
allText . Padding = new BorderDouble ( 3 ) ;
2015-04-08 15:20:10 -07:00
allText . HAnchor = HAnchor . ParentLeftRight ;
allText . BackgroundColor = ActiveTheme . Instance . TransparentDarkOverlay ;
double helpPointSize = 10 ;
EnglishTextWrapping wrapper = new EnglishTextWrapping ( helpPointSize ) ;
2016-07-07 11:21:35 -07:00
List < string > wrappedText = wrapper . WrapText ( HelpText , textRegionWidth - allText . Padding . Width ) ;
2015-04-08 15:20:10 -07:00
foreach ( string line in wrappedText )
{
GuiWidget helpWidget = new TextWidget ( line , pointSize : helpPointSize , textColor : RGBA_Bytes . White ) ;
allText . AddChild ( helpWidget ) ;
}
allText . MinimumSize = new Vector2 ( textRegionWidth , allText . MinimumSize . y ) ;
allText . Visible = false ;
return allText ;
}
protected SortedDictionary < double , string > GetTemperaturePresetLabels ( )
{
string sliderLabelDefinitions = GetTemperaturePresets ( ) ;
SortedDictionary < double , string > labels = new SortedDictionary < double , string > ( ) { } ;
labels . Add ( 0.0 , "OFF" ) ;
string [ ] labelItems = sliderLabelDefinitions . Split ( ',' ) ;
for ( int i = 0 ; i < labelItems . Length / 2 ; i + + )
{
string name = labelItems [ i * 2 ] ;
double temp ;
double . TryParse ( labelItems [ i * 2 + 1 ] , out temp ) ;
//Ignore temp values that already exits
if ( temp > 0 & & ! labels . ContainsKey ( temp ) )
{
labels . Add ( temp , name ) ;
}
}
return labels ;
}
protected GuiWidget GetSliderLabels ( )
{
GuiWidget sliderLabels = new GuiWidget ( ) ;
sliderLabels . HAnchor = HAnchor . ParentLeftRight ;
2016-05-06 17:56:27 -07:00
sliderLabels . Height = 20 * GuiWidget . DeviceScale ;
2015-04-08 15:20:10 -07:00
{
2016-05-06 17:56:27 -07:00
double buttonOffset = - 10 * GuiWidget . DeviceScale ;
2015-04-08 15:20:10 -07:00
var offPosition = buttonOffset ;
2014-01-29 19:09:30 -08:00
2015-04-08 15:20:10 -07:00
SortedDictionary < double , string > labels = GetTemperaturePresetLabels ( ) ;
bool firstElement = true ;
double minButtonPosition = 0 ;
foreach ( KeyValuePair < double , string > keyValue in labels )
{
if ( firstElement )
{
minButtonPosition = buttonOffset ;
firstElement = false ;
}
else
{
double wantedButtonPosition = buttonOffset ;
minButtonPosition = Math . Max ( minButtonPosition + textImageButtonFactory . FixedWidth + 3 , wantedButtonPosition ) ;
}
Button tempButton = textImageButtonFactory . Generate ( keyValue . Value ) ;
tempButton . OriginRelativeParent = new Vector2 ( minButtonPosition , 0 ) ;
sliderLabels . AddChild ( tempButton ) ;
// We push the value into a temp double so that the function will not point to a shared keyValue instance.
double temp = keyValue . Key ;
tempButton . Click + = ( sender , e ) = >
{
SetTargetTemperature ( temp ) ;
2017-05-19 14:39:57 -07:00
tempEditContainer . Visible = false ;
2015-04-08 15:20:10 -07:00
} ;
}
}
sliderLabels . HAnchor = HAnchor . FitToChildren ;
sliderLabels . VAnchor = VAnchor . FitToChildren ;
sliderLabels . MinimumSize = new Vector2 ( sliderLabels . Width , sliderLabels . Height ) ;
return sliderLabels ;
}
private double MaxTemp
{
get
{
string presets = GetTemperaturePresets ( ) ;
string [ ] list = presets . Split ( ',' ) ;
double max = 0 ;
foreach ( string item in list )
{
double value = 0 ;
double . TryParse ( item , out value ) ;
max = Math . Max ( max , value ) ;
}
return max ;
}
}
protected void onTemperatureRead ( Object sender , EventArgs e )
{
TemperatureEventArgs tempArgs = e as TemperatureEventArgs ;
if ( tempArgs ! = null & & tempArgs . Index0Based = = extruderIndex0Based )
{
actualTempIndicator . Text = string . Format ( "{0:0.0}°C" , tempArgs . Temperature ) ;
}
}
2017-05-19 14:39:57 -07:00
protected void ExtruderTemperatureSet ( Object sender , EventArgs e )
2015-04-08 15:20:10 -07:00
{
TemperatureEventArgs tempArgs = e as TemperatureEventArgs ;
if ( tempArgs ! = null & & tempArgs . Index0Based = = extruderIndex0Based )
{
2017-05-19 14:39:57 -07:00
string displayString = string . Format ( "{0:0.0}°C" , tempArgs . Temperature ) ;
targetTemperatureDisplay . SetDisplayString ( displayString ) ;
}
}
protected void BedTemperatureSet ( Object sender , EventArgs e )
{
TemperatureEventArgs tempArgs = e as TemperatureEventArgs ;
if ( tempArgs ! = null )
{
string displayString = string . Format ( "{0:0.0}°C" , tempArgs . Temperature ) ;
targetTemperatureDisplay . SetDisplayString ( displayString ) ;
2015-04-08 15:20:10 -07:00
}
}
}
public class ExtruderTemperatureControlWidget : TemperatureControlBase
{
public ExtruderTemperatureControlWidget ( )
2017-01-04 07:23:30 -08:00
: base ( 0 , "Extruder Temperature" . Localize ( ) , "Extruder Temperature Settings" . Localize ( ) )
2015-04-08 15:20:10 -07:00
{
AddChildElements ( ) ;
AddHandlers ( ) ;
}
public ExtruderTemperatureControlWidget ( int extruderIndex0Based )
2017-01-04 07:23:30 -08:00
: base ( extruderIndex0Based , string . Format ( "{0} {1}" , "Extruder Temperature" . Localize ( ) , extruderIndex0Based + 1 ) , "Extruder Temperature Settings" . Localize ( ) )
2015-04-08 15:20:10 -07:00
{
AddChildElements ( ) ;
AddHandlers ( ) ;
}
override protected string HelpText
{
get { return "Override the current extruder temperature. While printing, the extruder temperature is normally determined by the 'Slice Settings'." ; }
}
2016-12-29 06:55:12 -08:00
private EventHandler unregisterEvents ;
2015-04-08 15:20:10 -07:00
private void AddHandlers ( )
{
PrinterConnectionAndCommunication . Instance . ExtruderTemperatureRead . RegisterEvent ( onTemperatureRead , ref unregisterEvents ) ;
2017-05-19 14:39:57 -07:00
PrinterConnectionAndCommunication . Instance . ExtruderTemperatureSet . RegisterEvent ( ExtruderTemperatureSet , ref unregisterEvents ) ;
2015-04-08 15:20:10 -07:00
}
2017-02-03 13:06:08 -08:00
public override void OnClosed ( ClosedEventArgs e )
2015-04-08 15:20:10 -07:00
{
2017-01-17 14:47:04 -08:00
unregisterEvents . Invoke ( this , null ) ;
2015-04-08 15:20:10 -07:00
base . OnClosed ( e ) ;
}
protected override string GetTemperaturePresets ( )
{
string default_presets = ",0,,0,,0,250" ;
string presets ;
string presetKey = string . Format ( "Extruder{0}PresetTemps" , extruderIndex0Based + 1 ) ;
if ( UserSettings . Instance . get ( presetKey ) = = null )
{
UserSettings . Instance . set ( presetKey , default_presets ) ;
}
presets = UserSettings . Instance . get ( presetKey ) ;
return presets ;
}
protected override void SetTemperaturePresets ( object seder , EventArgs e )
{
StringEventArgs stringEvent = e as StringEventArgs ;
if ( stringEvent ! = null & & stringEvent . Data ! = null )
{
UserSettings . Instance . set ( string . Format ( "Extruder{0}PresetTemps" , extruderIndex0Based + 1 ) , stringEvent . Data ) ;
ApplicationController . Instance . ReloadAdvancedControlsPanel ( ) ;
}
}
protected override double GetPreheatTemperature ( )
{
2016-10-10 12:44:22 -07:00
return ActiveSliceSettings . Instance . Helpers . ExtruderTemperature ( extruderIndex0Based ) ;
2015-04-08 15:20:10 -07:00
}
protected override double GetTargetTemperature ( )
{
return PrinterConnectionAndCommunication . Instance . GetTargetExtruderTemperature ( extruderIndex0Based ) ;
}
protected override double GetActualTemperature ( )
{
return PrinterConnectionAndCommunication . Instance . GetActualExtruderTemperature ( extruderIndex0Based ) ;
}
protected override void SetTargetTemperature ( double targetTemp )
{
2015-06-11 12:06:40 -07:00
UiThread . RunOnIdle ( ( ) = >
2015-04-08 15:20:10 -07:00
{
2015-05-18 14:42:01 -07:00
double goalTemp = ( int ) ( targetTemp + . 5 ) ;
if ( PrinterConnectionAndCommunication . Instance . PrinterIsPrinting
& & PrinterConnectionAndCommunication . Instance . PrintingState = = PrinterConnectionAndCommunication . DetailedPrintingState . HeatingExtruder
& & goalTemp ! = PrinterConnectionAndCommunication . Instance . GetTargetExtruderTemperature ( extruderIndex0Based ) )
{
string sliceSettingsNote = "Note: Slice Settings are applied before the print actually starts. Changes while printing will not effect the active print." ;
string message = string . Format ( "The extruder is currently heating and its target temperature cannot be changed until it reaches {0}°C.\n\nYou can set the starting extruder temperature in 'Slice Settings' -> 'Filament'.\n\n{1}" , PrinterConnectionAndCommunication . Instance . GetTargetExtruderTemperature ( extruderIndex0Based ) , sliceSettingsNote ) ;
StyledMessageBox . ShowMessageBox ( null , message , "Waiting For Extruder To Heat" ) ;
}
else
{
PrinterConnectionAndCommunication . Instance . SetTargetExtruderTemperature ( extruderIndex0Based , ( int ) ( targetTemp + . 5 ) ) ;
string displayString = string . Format ( "{0:0.0}°C" , PrinterConnectionAndCommunication . Instance . GetTargetExtruderTemperature ( extruderIndex0Based ) ) ;
targetTemperatureDisplay . SetDisplayString ( displayString ) ;
}
} ) ;
2015-04-08 15:20:10 -07:00
}
}
public class BedTemperatureControlWidget : TemperatureControlBase
{
public BedTemperatureControlWidget ( )
2017-01-04 07:23:30 -08:00
: base ( 0 , "Bed Temperature" . Localize ( ) , "Bed Temperature Settings" . Localize ( ) )
2015-04-08 15:20:10 -07:00
{
AddChildElements ( ) ;
AddHandlers ( ) ;
2016-03-03 17:57:14 -08:00
this . Name = "Bed Temperature Controls Widget" ;
2015-04-08 15:20:10 -07:00
}
override protected string HelpText
{
get { return "Override the current bed temperature. While printing, the bed temperature is normally determined by the 'Slice Settings'." ; }
}
2016-12-29 06:55:12 -08:00
private EventHandler unregisterEvents ;
2015-04-08 15:20:10 -07:00
private void AddHandlers ( )
{
PrinterConnectionAndCommunication . Instance . BedTemperatureRead . RegisterEvent ( onTemperatureRead , ref unregisterEvents ) ;
2017-05-19 14:39:57 -07:00
PrinterConnectionAndCommunication . Instance . BedTemperatureSet . RegisterEvent ( BedTemperatureSet , ref unregisterEvents ) ;
2015-04-08 15:20:10 -07:00
}
2017-02-03 13:06:08 -08:00
public override void OnClosed ( ClosedEventArgs e )
2015-04-08 15:20:10 -07:00
{
if ( unregisterEvents ! = null )
{
unregisterEvents ( this , null ) ;
}
base . OnClosed ( e ) ;
}
private void onOffButtonClicked ( object sender , EventArgs e )
{
SetTargetTemperature ( 0 ) ;
}
protected override string GetTemperaturePresets ( )
{
string default_presets = ",0,,0,,0,150" ;
string presets ;
if ( UserSettings . Instance . get ( "BedPresetTemps" ) = = null )
{
UserSettings . Instance . set ( "BedPresetTemps" , default_presets ) ;
}
presets = UserSettings . Instance . get ( "BedPresetTemps" ) ;
return presets ;
}
protected override void SetTemperaturePresets ( object seder , EventArgs e )
{
StringEventArgs stringEvent = e as StringEventArgs ;
if ( stringEvent ! = null & & stringEvent . Data ! = null )
{
UserSettings . Instance . set ( "BedPresetTemps" , stringEvent . Data ) ;
ApplicationController . Instance . ReloadAdvancedControlsPanel ( ) ;
}
}
protected override double GetPreheatTemperature ( )
{
2016-06-22 17:13:05 -07:00
return ActiveSliceSettings . Instance . GetValue < double > ( SettingsKey . bed_temperature ) ;
2015-04-08 15:20:10 -07:00
}
protected override double GetActualTemperature ( )
{
return PrinterConnectionAndCommunication . Instance . ActualBedTemperature ;
}
protected override double GetTargetTemperature ( )
{
return PrinterConnectionAndCommunication . Instance . TargetBedTemperature ;
}
protected override void SetTargetTemperature ( double targetTemp )
{
double goalTemp = ( int ) ( targetTemp + . 5 ) ;
if ( PrinterConnectionAndCommunication . Instance . PrinterIsPrinting
& & PrinterConnectionAndCommunication . Instance . PrintingState = = PrinterConnectionAndCommunication . DetailedPrintingState . HeatingBed
& & goalTemp ! = PrinterConnectionAndCommunication . Instance . TargetBedTemperature )
{
string sliceSettingsNote = "Note: Slice Settings are applied before the print actually starts. Changes while printing will not effect the active print." ;
string message = string . Format ( "The bed is currently heating and its target temperature cannot be changed until it reaches {0}°C.\n\nYou can set the starting bed temperature in 'Slice Settings' -> 'Filament'.\n\n{1}" , PrinterConnectionAndCommunication . Instance . TargetBedTemperature , sliceSettingsNote ) ;
StyledMessageBox . ShowMessageBox ( null , message , "Waiting For Bed To Heat" ) ;
}
else
{
PrinterConnectionAndCommunication . Instance . TargetBedTemperature = goalTemp ;
string displayString = string . Format ( "{0:0.0}°C" , PrinterConnectionAndCommunication . Instance . TargetBedTemperature ) ;
targetTemperatureDisplay . SetDisplayString ( displayString ) ;
}
}
}
}