Ejemplo n.º 1
0
 /// <summary>
 /// Переводит блок WPF в форму для сохранения
 /// </summary>
 /// <param name="procedure"></param>
 /// <returns></returns>
 public static SaveProcedure ToSave(ProcedureWPF procedure, bool IsProc = false, Guid child = new Guid())
 {
     return(new SaveProcedure()
     {
         Id = Guid.NewGuid(),
         IsProcess = IsProc,
         ChildBlockID = child,
         Model = procedure.BlockModel,
         Position = procedure.Position
     });
 }
Ejemplo n.º 2
0
        // Загрузка связи с ресурсами
        private ResConnectionWPF LoadResConnection(SaveResourceConnection connectres, Dictionary <Guid, ProcedureWPF> worksavelistproc, Dictionary <Guid, ResourceWPF> worksavelistres)
        {
            ProcedureWPF proc = worksavelistproc[connectres.StartID];
            ResourceWPF  res  = worksavelistres[connectres.EndID];

            ResConnectionWPF connection = new ResConnectionWPF(proc, res);

            proc.AddResPutConnection(connection);
            res.AddResPutConnection(connection);

            return(connection);
        }
Ejemplo n.º 3
0
        private void AnalizeToken()
        {
            var list = _collector.GetHistory();                    // Получаем список токенов

            list = list.OrderBy(x => x.ProcessStartTime).ToList(); // Выстраиваем по времени начала

            try
            {
                MinDuration = list.Min(x => x.ProcessEndTime - x.ProcessStartTime); // Находим минимальную продолжительность
            }
            catch (InvalidOperationException ex)
            {
                throw new InvalidOperationException("TokenViewer: список токенов содержит 0 токенов");
            }

            // Проставляем блоки
            foreach (var l in list)
            {
                AddBlock(l);
            }

            // Проставляем связи (так как пока нет параллельности, идут друг за другом)
            int count = MainWindow.Children.Count; // Смотрим количество блоков из которых пойдёт связь

            this.Width = (count + 1) * ProcedureWPF.DEFAULT_WIDTH;

            for (int i = 0; i < count; i++)
            {
                if (i < count - 1)
                {
                    // Берём начальный и конечный блоки
                    ProcedureWPF Start = MainWindow.Children[i] as ProcedureWPF;
                    ProcedureWPF End   = MainWindow.Children[i + 1] as ProcedureWPF;

                    // Создаём связь
                    ProcConnectionWPF connectionWPF = new ProcConnectionWPF(Start, End, new Point(ProcedureWPF.DEFAULT_WIDTH, ProcedureWPF.DEFAULT_HEIGHT / 2), new Point(ProcedureWPF.DEFAULT_WIDTH, ProcedureWPF.DEFAULT_HEIGHT / 2));

                    // Добавляем связь к ресурсам
                    Start.AddOutPutConnection(connectionWPF);
                    End.AddInPutConnection(connectionWPF);

                    // Добавляем связь на область
                    MainWindow.Children.Add(connectionWPF);
                }
            }
        }
Ejemplo n.º 4
0
        // Загрузка связи с процедурами
        private ProcConnectionWPF LoadProcConnection(SaveProcedureConnection connectproc, Dictionary <Guid, ProcedureWPF> worksavelistproc, StartBlockWPF startBlock, EndBlockWPF endBlock)
        {
            ProcedureWPF procStart = null;
            ProcedureWPF procEnd   = null;

            if (connectproc.StartID.CompareTo(new Guid()) != 0)
            {
                procStart = worksavelistproc[connectproc.StartID];
            }

            if (connectproc.EndID.CompareTo(new Guid()) != 0)
            {
                procEnd = worksavelistproc[connectproc.EndID];
            }

            ProcConnectionWPF connection = null;

            if (procStart != null && procEnd != null)
            {
                connection = new ProcConnectionWPF(procStart, procEnd, connectproc.RelativeStartPosition, connectproc.RelativeEndPosition, connectproc.StartPort, connectproc.EndPort);

                procStart.AddOutPutConnection(connection);
                procEnd.AddInPutConnection(connection);
            }
            else
            {
                if (procStart == null)
                {
                    connection = new ProcConnectionWPF(startBlock, procEnd, connectproc.RelativeStartPosition, connectproc.RelativeEndPosition, connectproc.StartPort, connectproc.EndPort);
                    procEnd.AddInPutConnection(connection);
                    startBlock.AddOutPutConnection(connection);
                }

                if (procEnd == null)
                {
                    connection = new ProcConnectionWPF(procStart, endBlock, connectproc.RelativeStartPosition, connectproc.RelativeEndPosition, connectproc.StartPort, connectproc.EndPort);
                    procStart.AddOutPutConnection(connection);
                    endBlock.AddInPutConnection(connection);
                }
            }

            return(connection);
        }
Ejemplo n.º 5
0
        private void AddBlock(Token block)
        {
            // Смотрим длительность
            double duration = (block.ProcessEndTime - block.ProcessStartTime);

            if (duration == 0)
            {
                duration = 1;
            }

            if (MinDuration == 0)
            {
                MinDuration = 1;
            }
            int count = Convert.ToInt32(duration / MinDuration); // Количество блоков, которые создадим (чтобы отобразить длительность)

            if (count > 5)
            {
                count = 5;            // Чтобы не выводить миллиард блоков
            }
            for (int i = 0; i < count; i++)
            {
                //Создаём блок
                ProcedureWPF wpf = new ProcedureWPF(new Point(this.baseX + i * ProcedureWPF.DEFAULT_WIDTH, this.baseY), block.ProcessedByBlock)
                {
                    IsSelectable = false
                };
                wpf.Freeze();
                // Добавляем на рабочую область
                MainWindow.Children.Add(wpf);
                wpf.IsSelectable = false;
            }

            // Передвигаем следующий
            baseX += count * ProcedureWPF.DEFAULT_WIDTH + 15;
            baseY += ProcedureWPF.DEFAULT_HEIGHT + 15;
        }
Ejemplo n.º 6
0
        public ParametersDialog(Dictionary <string, double> paramsPairs, string _progressFunction, string title,
                                double?_minQuality, double?_maxQuality, ProcedureWPF procedure)
        {
            InitializeComponent();

            DataContext = this;

            parameters       = new Dictionary <string, double>();
            textBoxes        = new Dictionary <string, TextBox>();
            progressFunction = _progressFunction;
            titleBlock.Text  = title;
            Procedure        = procedure;

            if (procedure != null && procedure.BlockName == "Логическое разветвление")
            {
                functionBox = new TextBox
                {
                    Name   = "functionBox",
                    Text   = "1",
                    Width  = 400,
                    Margin = new Thickness(5, 0, 0, 4)
                };

                var inputsCount = new TextBox();
                inputsCount.Text              = "1";
                inputsCount.PreviewTextInput += MinQualityTextBox_PreviewTextInput;
                inputsCount.IsReadOnly        = true;
                inputsCount.Width             = 400;
                inputsCount.Margin            = new Thickness(5, 0, 0, 4);

                var inputsLabel = new Label();
                inputsLabel.Content    = "Число входов";
                inputsLabel.Width      = 400;
                inputsLabel.Margin     = new Thickness(0, 0, 0, 2);
                inputsLabel.FontWeight = FontWeights.Bold;

                wrapPanel.Children.Add(inputsLabel);
                wrapPanel.Children.Add(inputsCount);

                var outputsCount = new TextBox();
                outputsCount.Text              = 1.ToString();
                outputsCount.PreviewTextInput += MinQualityTextBox_PreviewTextInput;
                outputsCount.Width             = 400;
                outputsCount.Margin            = new Thickness(5, 0, 0, 4);
                outputsCount.TextChanged      += (s, e) =>
                {
                    var textBox = s as TextBox;
                    procedure.OutputCount = int.Parse(textBox.Text.Length > 0 ? textBox.Text : "1");
                };

                var outputsLabel = new Label();
                outputsLabel.Content    = "Число выходов";
                outputsLabel.Width      = 400;
                outputsLabel.Margin     = new Thickness(0, 0, 0, 2);
                outputsLabel.FontWeight = FontWeights.Bold;

                wrapPanel.Children.Add(outputsLabel);
                wrapPanel.Children.Add(outputsCount);
            }
            else if (procedure != null && procedure.BlockName == "Логическое слияние")
            {
                functionBox = new TextBox
                {
                    Name   = "functionBox",
                    Text   = "1",
                    Width  = 400,
                    Margin = new Thickness(5, 0, 0, 4)
                };

                var inputsCount = new TextBox();
                inputsCount.Text              = "1";
                inputsCount.PreviewTextInput += MinQualityTextBox_PreviewTextInput;
                inputsCount.Width             = 400;
                inputsCount.Margin            = new Thickness(5, 0, 0, 4);
                inputsCount.TextChanged      += (s, e) =>
                {
                    var textBox = s as TextBox;
                    procedure.InputCount = int.Parse(textBox.Text.Length > 0 ? textBox.Text : "1");
                };

                var inputsLabel = new Label();
                inputsLabel.Content    = "Число входов";
                inputsLabel.Width      = 400;
                inputsLabel.Margin     = new Thickness(0, 0, 0, 2);
                inputsLabel.FontWeight = FontWeights.Bold;

                wrapPanel.Children.Add(inputsLabel);
                wrapPanel.Children.Add(inputsCount);

                var outputsCount = new TextBox();
                outputsCount.Text              = 1.ToString();
                outputsCount.PreviewTextInput += MinQualityTextBox_PreviewTextInput;
                outputsCount.Width             = 400;
                outputsCount.IsReadOnly        = true;
                outputsCount.Margin            = new Thickness(5, 0, 0, 4);

                var outputsLabel = new Label();
                outputsLabel.Content    = "Число выходов";
                outputsLabel.Width      = 400;
                outputsLabel.Margin     = new Thickness(0, 0, 0, 2);
                outputsLabel.FontWeight = FontWeights.Bold;

                wrapPanel.Children.Add(outputsLabel);
                wrapPanel.Children.Add(outputsCount);
            }
            else
            {
                functionBox = new TextBox
                {
                    Name          = "functionBox",
                    Text          = _progressFunction,
                    Width         = 400,
                    Height        = 150,
                    TextWrapping  = TextWrapping.Wrap,
                    AcceptsReturn = true,
                    Margin        = new Thickness(5, 0, 0, 4)
                };

                if (_progressFunction != null)
                {
                    wrapPanel.Children.Add(new Label
                    {
                        Content    = "Формула зависимости времени от параметров",
                        Width      = 400,
                        Margin     = new Thickness(0, 0, 0, 2),
                        FontWeight = FontWeights.Bold
                    });
                    wrapPanel.Children.Add(functionBox);
                }

                foreach (var paramsPair in paramsPairs)
                {
                    var textBox = new TextBox();
                    textBox.Text   = string.IsNullOrEmpty(paramsPair.Value.ToString()) ? "0" : paramsPair.Value.ToString();
                    textBox.Width  = 400;
                    textBox.Margin = new Thickness(5, 0, 0, 4);
                    textBoxes.Add(paramsPair.Key, textBox);

                    var label = new Label();
                    label.Content    = paramsPair.Key;
                    label.Width      = 400;
                    label.Margin     = new Thickness(0, 0, 0, 2);
                    label.FontWeight = FontWeights.Bold;

                    wrapPanel.Children.Add(label);
                    wrapPanel.Children.Add(textBox);
                }
            }

            if (_minQuality.HasValue && _maxQuality.HasValue)
            {
                minQuality = _minQuality.Value;
                maxQuality = _maxQuality.Value;

                var minQualityTextBox = new TextBox();
                minQualityTextBox.Text              = _minQuality.ToString();
                minQualityTextBox.PreviewTextInput += MinQualityTextBox_PreviewTextInput;
                minQualityTextBox.Width             = 400;
                minQualityTextBox.Margin            = new Thickness(5, 0, 0, 4);
                minQualityTextBox.Visibility        = procedure.BlockName == "Логическое слияние" ? Visibility.Hidden : Visibility.Visible;
                this.minQualityTextBox              = minQualityTextBox;

                var minQualityLabel = new Label();
                minQualityLabel.Content    = "Минимальное качество";
                minQualityLabel.Width      = 400;
                minQualityLabel.Margin     = new Thickness(0, 0, 0, 2);
                minQualityLabel.FontWeight = FontWeights.Bold;
                minQualityLabel.Visibility = procedure.BlockName == "Логическое слияние" ? Visibility.Hidden : Visibility.Visible;

                wrapPanel.Children.Add(minQualityLabel);
                wrapPanel.Children.Add(minQualityTextBox);

                var maxQualityTextBox = new TextBox();
                maxQualityTextBox.Text              = _maxQuality.ToString();
                maxQualityTextBox.Width             = 400;
                maxQualityTextBox.PreviewTextInput += MinQualityTextBox_PreviewTextInput;
                maxQualityTextBox.Margin            = new Thickness(5, 0, 0, 4);
                maxQualityTextBox.Visibility        = procedure.BlockName == "Логическое разветвление" ? Visibility.Hidden : Visibility.Visible;
                this.maxQualityTextBox              = maxQualityTextBox;

                var maxQualityLabel = new Label();
                maxQualityLabel.Content    = "Максимальное качество";
                maxQualityLabel.Width      = 400;
                maxQualityLabel.Margin     = new Thickness(0, 0, 0, 2);
                maxQualityLabel.FontWeight = FontWeights.Bold;
                maxQualityLabel.Visibility = procedure.BlockName == "Логическое разветвление" ? Visibility.Hidden : Visibility.Visible;

                wrapPanel.Children.Add(maxQualityLabel);
                wrapPanel.Children.Add(maxQualityTextBox);
            }

            /*
             * У разветвления только Qвх
             * У слияния только Qвых
             */
        }