Пример #1
0
        private void comboBoxBPS_SelectedIndexChanged(object sender, EventArgs e)
        {
            IBinarySystem newSelectedSystem = systems[comboBoxBPS.SelectedIndex];
            if (newSelectedSystem != selectedSystem)
            {
                selectedSystem = newSelectedSystem;
                phaseDiagram = new BinaryPhaseDiagram(selectedSystem);
                phaseDiagram.CalculateTX(TStep);

                gibbsTempBar.Maximum = (int)maximalTemperature(selectedSystem);
                gibbsTempBar.Minimum = (int)minimalTemperature(selectedSystem);
                gibbsTempBar.Value = gibbsTempBar.Minimum;
                gibbsTempLabel.Text = "T = " + gibbsTempBar.Value.ToString() + " K";
            }
        }
        /// <summary>
        /// Выводит в Excel бездиффузионную диаграмму состояния
        /// </summary>
        public void drawNonDiffusionDiagramInExcel(BinaryPhaseDiagram diagram)
        {
            // Инициализация Excel
            Excel.Application excelapp = new Excel.Application();
            excelapp.Visible = true;
            Excel.Workbooks excelappworkbooks = excelapp.Workbooks;

            Excel.Workbook excelappworkbook = excelapp.Workbooks.Add(Type.Missing);

            Excel.Sheets excelsheets = excelappworkbook.Worksheets;
            Excel.Worksheet excelworksheet = (Excel.Worksheet)excelsheets.get_Item(1);

            // Объединение ячеек
            Excel.Range rng = excelworksheet.get_Range("A2", "A2");
            Excel.Range rng1 = excelworksheet.get_Range("A1", "C1");
            rng1.Merge(Type.Missing);

            // Шапка
            rng1.Value2 = "Рассчитанные массивы";
            rng1.Font.Bold = true;
            rng1.HorizontalAlignment = Excel.Constants.xlCenter;

            rng.Value2 = "T";
            rng.EntireRow.HorizontalAlignment = Excel.Constants.xlCenter;
            rng.EntireRow.Font.Bold = true;
            rng = rng.get_Offset(0, 1);
            rng.Value2 = "zjL";
            rng = rng.get_Offset(1, -1);

            // Переменные концентраций
            double zjL = 1;

            // Левая граница по концентрации
            double xLeft;
            // Правая граница по концентрации
            double xRight;

            // Выводим точку плавления чистого правого компонента
            rng.Value2 = diagram.system.rightElement.Ta_b;
            rng = rng.get_Offset(0, 1);
            rng.Value2 = 1;
            rng = rng.get_Offset(1, -1);

            // Цикл для правой части
            for (int T = (int)diagram.system.rightElement.Ta_b - 1; T > diagram.system.azeotrope.temperature; T--)
            {
                //Задаем границы расчетного интервала
                xLeft = diagram.system.azeotrope.coordinate;
                xRight = 1 - epsilon;

                // Методом дихотомии вычисляем
                zjL = diagram.dichotomySolutionZjL(xLeft, xRight, T);

                // Выводим точку zjL(T)
                rng.Value2 = T;
                rng = rng.get_Offset(0, 1);
                rng.Value2 = zjL;
                rng = rng.get_Offset(1, -1);
            }

            // Выводим точку азеотропы
            rng.Value2 = diagram.system.azeotrope.temperature;
            rng = rng.get_Offset(0, 1);
            rng.Value2 = diagram.system.azeotrope.coordinate;
            rng = rng.get_Offset(0, 1);
            rng.Value2 = diagram.system.azeotrope.coordinate;

            // Смещаем позицию на точку плавления левого компонента
            rng = rng.get_Offset((int)diagram.system.azeotrope.temperature - (int)diagram.system.leftElement.Ta_b, 0);

            // Выводим точку плавления чистого левого компонента
            rng.Value2 = 0;
            rng = rng.get_Offset(1, 0);

            // Цикл для левой части
            for (int T = (int)diagram.system.leftElement.Ta_b - 1; T > diagram.system.azeotrope.temperature; T--)
            {
                //Задаем границы расчетного интервала
                xLeft = diagram.system.azeotrope.coordinate;
                xRight = epsilon;

                zjL = diagram.dichotomySolutionZjL(xLeft, xRight, T);

                // Выводим zjL(T)
                rng.Value2 = zjL;
                rng = rng.get_Offset(1, 0);
            }

            // Строим график в Excel
            //Выделяем ячейки с данными  в таблице
            Excel.Range excelcells = excelworksheet.get_Range("A3", "C" + ((int)diagram.system.rightElement.Ta_b - diagram.system.azeotrope.temperature + 3).ToString());
            //И выбираем их
            excelcells.Select();
            //Создаем объект Excel.Chart диаграмму по умолчанию
            Excel.Chart excelchart = (Excel.Chart)excelapp.Charts.Add(Type.Missing,
             Type.Missing, Type.Missing, Type.Missing);
            //Выбираем диграмму - отображаем лист с диаграммой
            excelchart.Activate();
            excelchart.Select(Type.Missing);
            //Изменяем тип диаграммы
            excelapp.ActiveChart.ChartType = Excel.XlChartType.xlXYScatterLines;
            //Создаем надпись - Заглавие диаграммы
            excelapp.ActiveChart.HasTitle = false;
            //excelapp.ActiveChart.ChartTitle.Text
            //   = "F(N) Диаграмма";
            //Меняем шрифт, можно поменять и другие параметры шрифта
            //excelapp.ActiveChart.ChartTitle.Font.Size = 14;
            //Даем названия осей
            ((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlCategory,
                Excel.XlAxisGroup.xlPrimary)).HasTitle = true;
            ((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlCategory,
                Excel.XlAxisGroup.xlPrimary)).AxisTitle.Text = "x";
            //((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlSeriesAxis,
            //    Excel.XlAxisGroup.xlPrimary)).HasTitle = false;
            ((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlValue,
                Excel.XlAxisGroup.xlPrimary)).HasTitle = true;
            ((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlValue,
                Excel.XlAxisGroup.xlPrimary)).AxisTitle.Text = "T";
            //Координатная сетка - оставляем только крупную сетку
            ((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlCategory,
               Excel.XlAxisGroup.xlPrimary)).HasMajorGridlines = false;
            ((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlCategory,
              Excel.XlAxisGroup.xlPrimary)).HasMinorGridlines = false;
            //((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlSeriesAxis,
            //  Excel.XlAxisGroup.xlPrimary)).HasMajorGridlines = true;
            //((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlSeriesAxis,
            //  Excel.XlAxisGroup.xlPrimary)).HasMinorGridlines = false;
            ((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlValue,
              Excel.XlAxisGroup.xlPrimary)).HasMinorGridlines = false;
            ((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlValue,
              Excel.XlAxisGroup.xlPrimary)).HasMajorGridlines = true;

            ((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlCategory,
              Excel.XlAxisGroup.xlPrimary)).MaximumScale = 1;

            //((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlValue,
            //  Excel.XlAxisGroup.xlPrimary)).TickLabels.NumberFormat = "0,0E+00";
            excelapp.ActiveChart.PlotArea.Interior.Color = 14277081;

            //Будем отображать легенду и уберем строки,
            //которые отображают пустые строки таблицы
            excelapp.ActiveChart.HasLegend = true;
            //Расположение легенды
            excelapp.ActiveChart.Legend.Position
               = Excel.XlLegendPosition.xlLegendPositionLeft;
            //Можно изменить шрифт легенды и другие параметры
            ((Excel.LegendEntry)excelapp.ActiveChart.Legend.LegendEntries(1)).Font.Size = 12;
            //((Excel.LegendEntry)excelapp.ActiveChart.Legend.LegendEntries(3)).Font.Size = 12;
            //Легенда тесно связана с подписями на осях - изменяем надписи
            // - меняем легенду, удаляем чтото на оси - изменяется легенда
            Excel.SeriesCollection seriesCollection =
             (Excel.SeriesCollection)excelapp.ActiveChart.SeriesCollection(Type.Missing);
            Excel.Series series = seriesCollection.Item(1);
            series.Name = "";
            //Помним, что у нас объединенные ячейки, значит каждая второя строка - пустая
            //Удаляем их из диаграммы и из легенды
            series = seriesCollection.Item(2);
            series.Delete();

            series = seriesCollection.Item(1);

            series.MarkerStyle = Microsoft.Office.Interop.Excel.XlMarkerStyle.xlMarkerStyleNone;

            //Переименуем ось X
            int usedrange = excelworksheet.UsedRange.Rows.Count;
            Excel.Range excelcellX = excelworksheet.get_Range("B3", "B" + usedrange.ToString());
            series.XValues = excelcellX;
            Excel.Range excelcellY = excelworksheet.get_Range("A3", "A" + usedrange.ToString());
            series.Values = excelcellY;

            series = seriesCollection.Item(2);

            series.MarkerStyle = Microsoft.Office.Interop.Excel.XlMarkerStyle.xlMarkerStyleNone;

            //Переименуем ось X
            excelcellX = excelworksheet.get_Range("C3", "C" + usedrange.ToString());
            series.XValues = excelcellX;
            excelcellY = excelworksheet.get_Range("A3", "A" + usedrange.ToString());
            series.Values = excelcellY;

            //Если закончить код на этом месте то у нас Диаграммы на отдельном листе - Рис.9.
            //Строку легенды можно удалить здесь, но строка на оси не изменится
            //Поэтому мы удаляли в Excel.Series
            //((Excel.LegendEntry)excelapp.ActiveChart.Legend.LegendEntries(2)).Delete();
            //Перемещаем диаграмму на лист 1
            excelapp.ActiveChart.Location(Excel.XlChartLocation.xlLocationAsObject, "Лист1");
            //Получаем ссылку на лист 1
            excelsheets = excelappworkbook.Worksheets;
            excelworksheet = (Excel.Worksheet)excelsheets.get_Item(1);
            //Перемещаем диаграмму в нужное место
            excelworksheet.Shapes.Item(1).IncrementLeft(-201);
            excelworksheet.Shapes.Item(1).IncrementTop((float)1);
            //Задаем размеры диаграммы
            excelworksheet.Shapes.Item(1).Height = 500;
            excelworksheet.Shapes.Item(1).Width = 500;
            excelapp.ActiveChart.HasLegend = false;
        }