Список использованных источников. 1. Виды поточных линий [Электронный ресурс]
1. Виды поточных линий [Электронный ресурс]. URL: http://studopedia.ru/3_206285_vidi-potochnih-liniy.html (дата обращения 25.03.2016).
2. Коэффициент технической готовности [Электронный ресурс]. URL: http://www.ngpedia.ru/id115310p2.html (дата обращения 25.03.2016).
3. Определение надежности лесозаготовительных систем [Электронный ресурс]. URL: http://science-bsea.narod.ru/2008/leskomp_2008/zaikin_opred.htm (дата обращения 25.03.2016).
4. Технологические связи и их виды [Электронный ресурс]. URL: http://studopedia.ru/4_21107_tehnologicheskie-svyazi-i-ih-vidi.html (дата обращения 27.03.2016).
5. C# для вундеркиндов. Часть 4. Базы данных и XML. [Электронный ресурс] URL: https://msdn.microsoft.com/ru-ru/library/bb297402(v=vs.80).aspx (дата обращения 25.03.2016).
Приложение А
Листинг файла MainWindow.xaml.cs
namespace ceh
{
/// <summary>
/// </summary>
public partial class MainWindow : Window
{
private double WheelSensetiveCoef = 0.0005; // % of 120
ModelView context {
get { return (ModelView)DataContext; }
}
public MainWindow()
{
InitializeComponent();
context.Drweng = new DrawEngine(canvas);
context.Drweng.Min = -1;
context.Drweng.Max = 1;
context.Drweng.Step = 1;
context.Drweng.Tools.Offset.Offset(-5, -3);
context.PropertyChanged += Context_PropertyChanged;
}
private void Context_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == nameof(context.MachinesGraph)) Redraw();
}
private void Redraw()
{
context.Drweng.Refresh((cnx) => // context
{
var uielements = new List<Shape>();
double Min = cnx.Min,
Max = cnx.Max,
Step = cnx.Step;
#region OXY плоскость
uielements.AddRange(cnx.ConstructVerticalLines(Min, Max, Step));
uielements.AddRange(cnx.ConstructHorizontalLines(Min, Max, Step));
uielements.Add(new Polyline() //OX
{
Points = { new Point(0, cnx.Tools.ToScreenY(0)), new Point(cnx.Canvas.ActualWidth, cnx.Tools.ToScreenY(0)) },
Stroke = Brushes.Black,
StrokeThickness = 1
});
uielements.Add(new Polyline() //OY
{
Points = { new Point(cnx.Tools.ToScreenX(0), 0), new Point(cnx.Tools.ToScreenX(0), cnx.Canvas.ActualHeight) },
Stroke = Brushes.Black,
StrokeThickness = 1
});
#endregion OXY
uielements.AddRange(cnx.ConstructProductionLine(context.Nodes.ToUintArray()));
return uielements.ToArray();
});
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Redraw();
}
//private void txbx_To_TextChanged(object sender, TextChangedEventArgs e)
//{
// Redraw();
//}
//private void txbx_Step_TextChanged(object sender, TextChangedEventArgs e)
//{
// Redraw();
//}
//private void txbx_From_TextChanged(object sender, TextChangedEventArgs e)
//{
// Redraw();
//}
//private void txbx_From_MouseWheel(object sender, MouseWheelEventArgs e)
//{
// if (sender is TextBox)
// {
// TextBox txbx = (TextBox)sender;
// double num;
// if (double.TryParse(txbx.Text, out num))
// {
// string s = string.Format("{0}", num + e.Delta * WheelSensetiveCoef);
// txbx.Text = s;
// }
// }
//}
//private void slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
//{
// if (IsLoaded)
// {
// context.Drweng.Tools.Scale.X = (e.NewValue > 0) ? e.NewValue / 10.0 : ((Slider)sender).Minimum;
// context.Drweng.Tools.Scale.Y = (e.NewValue > 0) ? e.NewValue / 10.0 : ((Slider)sender).Minimum;
// Redraw();
// }
//}
//private void slider_MouseWheel(object sender, MouseWheelEventArgs e)
//{
// if (sender is Slider)
// {
// Slider sl = (Slider)sender;
// sl.Value += e.Delta * WheelSensetiveCoef * 10;
// }
//}
private void canvas_SizeChanged(object sender, SizeChangedEventArgs e)
{
Redraw();
}
private void button_Click(object sender, RoutedEventArgs e)
{
context.EvaluateSysOperab();
Redraw();
}
}
}
Листинг файла ModelView.cs
namespace ceh
{
public class ModelView: INotifyPropertyChanged
{
private ObservableCollection<WorkNode> _nodes = new ObservableCollection<WorkNode>();
public ObservableCollection<WorkNode> Nodes {
get { return _nodes; }
set {
if (value != _nodes)
{
_nodes = value;
SendPropertyChanged(nameof(Nodes));
}
}
}
private string _machinesGraphString;
public DrawEngine Drweng { get; set; }
public float Zs { get; set; }
public float Zg { get; set; }
private float _sysOperab;
public float SysOperability
{
get { return _sysOperab; }
set
{
if (_sysOperab != value)
{
_sysOperab = value;
SendPropertyChanged(nameof(SysOperability));
}
}
}
public string MachinesGraph
{
get
{
return _machinesGraphString;
}
set
{
if (_machinesGraphString != value)
{
_machinesGraphString = value;
var ls = Nodes.ToList();
var parsed = ParseMachines(MachinesGraph).ToWorkNodeArray();
if ( parsed.Count > ls.Count)
ls.AddRange(parsed.Skip(ls.Count));
else
ls.RemoveRange(parsed.Count, ls.Count - parsed.Count);
for (int i = 0; i < parsed.Count; i++)
{
ls[i].GroupID = parsed[i].GroupID;
ls[i].ID = parsed[i].ID;
}
Nodes = new ObservableCollection<WorkNode>(ls);
SendPropertyChanged(nameof(MachinesGraph));
}
}
}
public uint[] ParseMachines(string machines)
{
return machines.Split(new[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries)
.Select(n =>
{
uint result;
return uint.TryParse(n, out result) ? (uint?)result : null;
}).Where(n => n.HasValue).Cast<uint>().ToArray();
}
public void EvaluateSysOperab()
{
double sysOperab = 1.0, groupOperability=1.0;
foreach (var group in Nodes.GroupBy(g => g.GroupID))
{
foreach (var item in group)
groupOperability *= 1 - item.Operability;
sysOperab *= 1 - groupOperability*(1-Zg)*(1-Zs); ;
}
SysOperability = (float)sysOperab;
}
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
private void SendPropertyChanged(String propertyName)
{
if (PropertyChanged == null) throw new ArgumentNullException("propertyName", "ModelView");
PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
#endregion
}
}