public SvgDocument RectangleToSVG(FigureSettings settings, int width, int height, string filepath) { SvgDocument svg = new SvgDocument(); svg.Width = width; svg.Height = height; SvgLinearGradientServer gradientFill = new SvgLinearGradientServer { ID = "lgradient" }; SvgGradientStop from = new SvgGradientStop(); from.Offset = new SvgUnit(SvgUnitType.Percentage, 0.0f); from.StopColor = new SvgColourServer(settings.ColorFrom); SvgGradientStop to = new SvgGradientStop(); to.Offset = new SvgUnit(SvgUnitType.Percentage, 100.0f); to.StopColor = new SvgColourServer(settings.ColorTo); gradientFill.Children.Add(from); gradientFill.Children.Add(to); SvgRectangle rectangle = new SvgRectangle(); rectangle.SetRectangle(new RectangleF(getTopLeft(settings, width, height), settings.Dimensions)); rectangle.Fill = gradientFill; SvgDefinitionList defs = new SvgDefinitionList(); defs.Children.Add(gradientFill); svg.Children.Add(defs); svg.Children.Add(rectangle); File.WriteAllText(filepath, svg.GetXML()); return(svg); }
public void Refresh() { foreach (Component component in _session.Mapping.Components()) { SvgText text = null; if (component.GraphicID != null && _svgElements.ContainsKey(component.GraphicID)) { text = (SvgText)_svgElements[component.GraphicID]; FindTextByID(component.GraphicID + "_NAME").Color = nominalColor; if (!component.Enabled) { FindTextByID(component.GraphicID + "_NAME").Color = disabledColor; text.Text = "N/A"; text.Color = disabledColor; continue; } } switch (component) { case PressureComponent pt: bool showAbsolute = PreferenceManager.Manager.Preferences.Visual.ShowAbsolutePressure; if (showAbsolute) { float pressure = pt.Absolute(PreferenceManager.Manager.Preferences.Fluid.TodaysPressure); text.Text = Component.ToRounded(pressure, 2) + " bara"; text.Color = pt.IsNominal(pressure) ? nominalColor : warningColor; } else { text.Text = Component.ToRounded(pt.Relative(), 2) + " barg"; text.Color = pt.IsNominal(pt.Relative()) ? nominalColor : warningColor; } break; case TemperatureComponent tc: text.Text = tc.ToDisplay() + " °C"; text.Color = tc.IsNominal(tc.Celcius()) ? nominalColor : warningColor; break; case LoadComponent load: text.Text = load.ToDisplay() + " N"; text.Color = load.IsNominal(load.Newtons()) ? nominalColor : warningColor; break; case LevelComponent level: text.Text = level.ToDisplay() + " %"; float levelGradientStop = 1 - (level.PercentageFull() / 100.0f); SvgLinearGradientServer levelGradient = (SvgLinearGradientServer)_svgElements[level.GraphicIDGradient]; levelGradient.Stops[0].Offset = 0.0f; levelGradient.Stops[1].Offset = levelGradientStop; levelGradient.Stops[2].Offset = levelGradientStop; levelGradient.Stops[3].Offset = 1.0f; break; case TankComponent tank: text.Text = tank.ToDisplay(); float gradientStop = 1 - (tank.ToPercentage() / 100.0f); SvgLinearGradientServer gradient = (SvgLinearGradientServer)_svgElements[tank.GraphicIDGradient]; gradient.Stops[0].Offset = 0.0f; gradient.Stops[1].Offset = gradientStop; gradient.Stops[2].Offset = gradientStop; gradient.Stops[3].Offset = 1.0f; break; case ServoComponent servo: text.Text = servo.ToDisplay() + " %"; break; case SolenoidComponent solenoid: text.Text = solenoid.State().ToString(); break; case VoltageComponent voltage: float volts = voltage.Volts(); text.Text = string.Format(CultureInfo.InvariantCulture, "{0} V / {1} %", volts, Math.Floor(voltage.Percentage() * 100) / 100); text.Color = voltage.IsNominal(voltage.Volts()) ? nominalColor : warningColor; break; case FlowComponent flow: text.Text = flow.ToDisplay() + " kg/s"; text.Color = flow.IsNominal(flow.MassFlow) ? nominalColor : warningColor; break; case StackHealthComponent health: bool isActive = (DateTime.Now - _session.LastReceived).TotalMilliseconds < 4000; _svgElements[health.GraphicId2].Fill = (_session.Connected && isActive && health.IsMainAlive) ? aliveColor : warningColor; _svgElements[health.GraphicId4].Fill = (_session.Connected && isActive && health.IsSensorAlive) ? aliveColor : warningColor; _svgElements[health.GraphicId3].Fill = (_session.Connected && isActive && health.IsActuatorAlive) ? aliveColor : warningColor; break; } } SvgText ofRatioText = FindTextByID("MASS_FLOW_RATIO"); FlowComponent fuelFlow = _session.Mapping.ComponentsByID()[100] as FlowComponent; FlowComponent oxidFlow = _session.Mapping.ComponentsByID()[101] as FlowComponent; if (ofRatioText != null && fuelFlow != null && oxidFlow != null) { float ofRatio = (oxidFlow.MassFlow / fuelFlow.MassFlow); ofRatioText.Text = !float.IsNaN(ofRatio) ? Component.ToRounded(oxidFlow.MassFlow / fuelFlow.MassFlow, 2) : "0.00"; } UpdateImage(); }