// Обновление визуального отображения геометрической фигуры при изменении положения контрола public override void UpdateShapeGeometryByControl(string controlName, Point endLocation) { string[] str = controlName.Split('_'); if (str[1].Substring(0, 5) != "Point") { MessageBox.Show("The name of the control is unknown in UpdateGeometryShapeByControl()!"); return; } int controlPointNumber = int.Parse(str[1].Substring(5, str[1].Length - 5)); if (controlPointNumber < 1 || controlPointNumber > GeometricParams.Count) { MessageBox.Show("Control has an incorrect index in UpdateGeometryShapeByControl()!"); return; } controlPointNumber--; ((PolyLineSegment)((PathFigure)((PathGeometry)((Path)shapeBase).Data).Figures[0]).Segments[0]).Points[controlPointNumber] = endLocation; if (controlPointNumber == 0) { ((PathFigure)((PathGeometry)((Path)shapeBase).Data).Figures[0]).StartPoint = endLocation; } GeometricParams.RemoveAt(controlPointNumber); namedParameter param = new namedParameter(); param.ParamName = paramNames[controlPointNumber]; param.ParamValue = endLocation; GeometricParams.Insert(controlPointNumber, param); _List_tBox[controlPointNumber].Text = endLocation.X.ToString() + " " + endLocation.Y.ToString(); }
// Парсинг текстовых полей ввода координат public override void Parse(List <TextBox> list_tBox) { if (list_tBox != null) { if (list_tBox.Count == 2) { if (GeometricParams.Count > 0) { GeometricParams.RemoveRange(0, GeometricParams.Count); } namedParameter param1 = new namedParameter(); param1.ParamName = paramNames[0]; param1.ParamValue = pointParser(list_tBox[0].Text); namedParameter param2 = new namedParameter(); param2.ParamName = paramNames[1]; param2.ParamValue = pointParser(list_tBox[1].Text); GeometricParams.Add(param1); GeometricParams.Add(param2); } else { throw new System.ApplicationException("There should be two text boxes for entering the coordinates of the Line !"); } } else { throw new System.ApplicationException("There is no list of text fields for entering coordinates of the Line !"); } }
// Обновление визуального отображения геометрической фигуры при изменении положения контрола public override void UpdateShapeGeometryByControl(string controlName, Point endLocation) { string[] str = controlName.Split('_'); string controlPointType = str[1]; switch (controlPointType) { case "StartPoint": ((LineGeometry)((Path)shapeBase).Data).StartPoint = endLocation; GeometricParams.RemoveAt(0); namedParameter param1 = new namedParameter(); param1.ParamName = paramNames[0]; param1.ParamValue = endLocation; GeometricParams.Insert(0, param1); _List_tBox[0].Text = endLocation.X.ToString() + " " + endLocation.Y.ToString(); break; case "EndPoint": ((LineGeometry)((Path)shapeBase).Data).EndPoint = endLocation; GeometricParams.RemoveAt(1); namedParameter param2 = new namedParameter(); param2.ParamName = paramNames[1]; param2.ParamValue = endLocation; GeometricParams.Insert(1, param2); _List_tBox[1].Text = endLocation.X.ToString() + " " + endLocation.Y.ToString(); break; default: throw new System.ApplicationException("Error: Incorrect controlpoint type, '" + controlPointType + "' in UpdateGeometryShapeByControl()"); } }
public Model() { GeometricParams = new GeometricParams(); MaterialParams = new MaterialParams(); ProcessParams = new ProcessParams(); EmpiricCoeffs = new EmpiricCoeffs(); SolveMethodParams = new SolveMethodParams(); }
/// <summary> /// Создаёт модель с указаными параметрами /// </summary> /// <param name="W">Ширина, м</param> /// <param name="H">Глубина, м</param> /// <param name="L">Длина, м</param> /// <param name="ro">Плотность, кг/м^3</param> /// <param name="c">Средняя удельная теплоемкость, Дж/(кг*С)</param> /// <param name="T_0">Температура плавления, С</param> /// <param name="V_u">Скорость крышки, м/с</param> /// <param name="T_u">Температура крышки, C</param> /// <param name="mu_0">Коэффициент консистенции материала при температуре приведения, Па*с^n</param> /// <param name="b">Температурный коэффициент вязкости материала, 1/C</param> /// <param name="T_r">Температура приведения, С</param> /// <param name="n">Индекс течения материала</param> /// <param name="alpha_u">Коэффициент теплоотдачи от крышки канала к материалу, Вт/(м^2*С)</param> /// <param name="delta_z">Шаг расчета по длине канала, м</param> public Model(double W, double H, double L, double ro, double c, double T_0, double V_u, double T_u, double mu_0, double b, double T_r, double n, double alpha_u, double delta_z) { GeometricParams = new GeometricParams(W, H, L); MaterialParams = new MaterialParams(ro, c, T_0); ProcessParams = new ProcessParams(V_u, T_u); EmpiricCoeffs = new EmpiricCoeffs(mu_0, b, T_r, n, alpha_u); SolveMethodParams = new SolveMethodParams(delta_z); }
// Добавление новой вершины в фигуру public override void AddGeometryPoint(Point point) { paramNames.Add("Point" + (GeometricParams.Count + 1).ToString()); // Добавим название параметра в список с названиями параметров paramTypes.Add("Point"); // Добавим название типа параметра в список с названиями типов параметров namedParameter param = new namedParameter(); param.ParamName = paramNames[GeometricParams.Count]; param.ParamValue = point; GeometricParams.Add(param); }
public void SetGeometricCoords(Point pnt) // Установка координат точки по структуре Point { if (GeometricParams.Count > 0) { GeometricParams.RemoveRange(0, GeometricParams.Count); } namedParameter param = new namedParameter(); param.ParamName = paramNames[0]; param.ParamValue = pnt; GeometricParams.Add(param); }
//--- Варианты установки координат точки public void SetGeometricCoords(string str) // Установка координат точки по строке с координатами { if (GeometricParams.Count > 0) { GeometricParams.RemoveRange(0, GeometricParams.Count); } namedParameter param = new namedParameter(); param.ParamName = paramNames[0]; param.ParamValue = pointParser(str); GeometricParams.Add(param); }
// Парсинг текстовых полей ввода координат public override void Parse(List <TextBox> list_tBox) { if (list_tBox != null) { int parse_count; if (IsCreateWithMouse) { parse_count = 2; IsCreateWithMouse = false; } else { parse_count = list_tBox.Count; } if (parse_count >= 2) { if (GeometricParams.Count > 0) { GeometricParams.RemoveRange(0, GeometricParams.Count); paramNames.RemoveRange(0, paramNames.Count); paramTypes.RemoveRange(0, paramTypes.Count); } for (int i = 0; i < parse_count; i++) { AddGeometryPoint(pointParser(list_tBox[i].Text)); } if (visualControler != null && visualControler.ControlPoints != null && !_Editor.IsMouseDraws) { if (visualControler.ControlPoints.Count < GeometricParams.Count) { visualControler.AddControls(); } else if (visualControler.ControlPoints.Count > GeometricParams.Count) { visualControler.RemoveControls(); } } } else { throw new System.ApplicationException("Polygon.Parse(): There should be minimum two text boxes for entering the coordinates of the Polygon!"); } } else { throw new System.ApplicationException("Polygon.Parse(): There is no list of text fields for entering coordinates of the Polygon!"); } }
// Обновление Фигуры-Полигон по кординатам заданным в поле ввода public override void UpdateShapeGeometryByTextCoords() { // Создаем копию параметров фигуры до изменения(на случай обратного отката) List <Point> points = new List <Point>(); for (int i = 0; i < GeometricParams.Count; i++) { Point p = new Point(); p.X = ((Point)GeometricParams[i].ParamValue).X; p.Y = ((Point)GeometricParams[i].ParamValue).Y; points.Add(p); } Parse(_List_tBox); // Проверим заполнение текстовых полей и возьмем из них координаты фигуры if (_Editor.prop_service.properties.SelfIntersectionCheck) // Если надо проверять самопересечение, { if (IsSelfIntersection()) // Если есть самопересечение, то { // Стираем "новые" значения if (GeometricParams.Count > 0) { GeometricParams.RemoveRange(0, GeometricParams.Count); paramNames.RemoveRange(0, paramNames.Count); paramTypes.RemoveRange(0, paramTypes.Count); } // восстанавливаем старые значения for (int i = 0; i < points.Count; i++) { AddGeometryPoint(points[i]); } visualControler.RemoveControls(); visualControler.UpdateAllControlsCoords(); // Приведем в сответствие контролы фигуры return; } } ((Path)shapeBase).Data = CreateShapeGeometry(); // Создадим геометрию фигуры shapeBase.StrokeThickness = StrokeWeight = _Editor.ShapeStrokeWidth; // Зададим толшину обводки фигуры StrokeColor = _Editor.ShapeStrokeColor.ToString(); // Установим текстовое значение цвета обводки фигуры SolidColorBrush scb = new SolidColorBrush(); // Зададим цвет обводки фигуры scb.Color = _Editor.ShapeStrokeColor; shapeBase.Stroke = scb; visualControler.UpdateAllControlsCoords(); // Приведем в сответствие контролы фигуры }
// Парсинг текстового поля ввода координат фигуры public override void Parse(List <TextBox> list_tBox) { if (list_tBox != null && list_tBox.Count > 0) { if (GeometricParams.Count > 0) { GeometricParams.RemoveRange(0, GeometricParams.Count); } namedParameter param = new namedParameter(); param.ParamName = paramNames[0]; param.ParamValue = pointParser(list_tBox[0].Text); GeometricParams.Add(param); } }
// Обновление визуального отображения фигуры при изменении положения на заданный вектор public override void UpdateShapeGeometryByVector(Vector locationChange) { for (int i = 0; i < GeometricParams.Count; i++) { namedParameter param = new namedParameter(); Point p = new Point(); p.X = ((Point)GeometricParams[i].ParamValue).X + locationChange.X; p.Y = ((Point)GeometricParams[i].ParamValue).Y + locationChange.Y; param.ParamValue = p; param.ParamName = GeometricParams[i].ParamName; GeometricParams.RemoveAt(i); GeometricParams.Insert(i, param); } ((Path)shapeBase).Data = CreateShapeGeometry(); // Создадим геометрию фигуры visualControler.UpdateAllControlsCoords(); UpdateTextCoords(); }
// Обновление визуального отображения геометрической фигуры при изменении положения контрола public override void UpdateShapeGeometryByControl(string controlName, Point endLocation) { string[] str = controlName.Split('_'); string controlPointType = str[1]; switch (controlPointType) { case "Center": ((EllipseGeometry)((Path)shapeBase).Data).Center = endLocation; GeometricParams.RemoveAt(0); namedParameter param = new namedParameter(); param.ParamName = paramNames[0]; param.ParamValue = endLocation; GeometricParams.Insert(0, param); //shapeBase.ToolTip = shapeBase.Name + " {" + endLocation.ToString() + "}"; _List_tBox[0].Text = endLocation.X.ToString() + " " + endLocation.Y.ToString(); break; default: throw new System.ApplicationException("Error: Incorrect controlpoint type, '" + controlPointType + "' in UpdateGeometryShapeByControl()"); } }
// Добавление новой вершины в фигуру public void RemoveLastGeometryPoint() { GeometricParams.RemoveAt(GeometricParams.Count - 1); paramNames.RemoveAt(GeometricParams.Count - 1); paramTypes.RemoveAt(GeometricParams.Count - 1); }
public OPERATION_OBJECT_TYPE?opObjType; // К какому типу объектов относится полигон при булеевых операциях с полигонами //--- Создание фигуры-линии по параметрам заданным в текстовых полях ввода public ShapePolygon( object params_source, // Источник координат для построения фигуры EditorModel editor) // Ссылка на экземляр модели редактора : base(editor) { if (params_source is List <TextBox> ) // Если источник параметров для создания фигуры - текстовые поля, { _List_tBox = (List <TextBox>)params_source; // Задаем список текстовых полей ввода параметров фигуры ShapeName = "Polygon" + _Editor.PolygonsCount; // Присвоим фигуре название StrokeWeight = _Editor.ShapeStrokeWidth; // Зададим толшину обводки фигуры StrokeColor = _Editor.ShapeStrokeColor.ToString(); // Установим текстовое значение цвета обводки фигуры FillColor = editor.ShapeFillColor.ToString(); // Зададим цвет заливки внутренней области фигуры } else if (params_source is ShapeParams) // Если источник параметров для создания фигуры - загрузочная информация, { ClearTextCoords(); // Очищаем текст-боксы на панели ввода параметров и удаляем лишние SetTextCoords((ShapeParams)params_source); // Заполняем текст-боксы полученной информацией о геометрических параметрах ShapeName = ((ShapeParams)params_source).ShapeName; // Зададаем остальные свойства фигуры.... StrokeWeight = ((ShapeParams)params_source).StrokeWeight; StrokeColor = ((ShapeParams)params_source).StrokeColor; FillColor = ((ShapeParams)params_source).FillColor; } else // Иначе ... { throw new System.ApplicationException("ShapePolygon.ShapePolygon(): Unknow param_source type!"); } for (int i = (editor.IsMouseDraws ? 2 : _List_tBox.Count); i > -1; i--) { paramNames.Add("Point" + (i + 1).ToString()); // Добавим название параметра в список с названиями параметров paramTypes.Add("Point"); // Добавим название типа параметра в список с названиями типов параметров } shapeType = SHAPE_TYPE.Polygon; // Установим тип фигуры - Полигон ShapeType = shapeType.ToString(); IsCreateWithMouse = _Editor.IsMouseDraws; // Создание фигуры начато при помощи мыши или иначе IsCreated = !_Editor.IsMouseDraws; // Фигура находится в состоянии рисования или иначе Parse(_List_tBox); // Проверяем правильность ввода параметров в текстовых полях и переводим эти параметры данные для построения фигуры if (params_source is List <TextBox> && _Editor.prop_service.properties.SelfIntersectionCheck) // Если источник параметров для создания фигуры - текстовые поля и надо проверять самопересечение, { if (IsSelfIntersection()) // Если есть самопересечение, то { GeometricParams.RemoveRange(0, GeometricParams.Count); // чистим ресурсы фигуры и выходим paramNames.RemoveRange(0, paramNames.Count); paramTypes.RemoveRange(0, paramTypes.Count); return; } } shapeBase = new Path(); // Cоздаем экземпляр фигуры ((Path)shapeBase).Data = CreateShapeGeometry(); // Создадим геометрию фигуры //shapeBase.Name = ShapeName; shapeBase.StrokeLineJoin = PenLineJoin.Round; // закругление в месте пересечения линий shapeBase.StrokeStartLineCap = PenLineCap.Round; // закругление в начале линии shapeBase.StrokeEndLineCap = PenLineCap.Round; // закругление в конце линии //RenderOptions.SetEdgeMode(shapeBase, EdgeMode.Aliased); // Прорисовка линии без визуального сглаживания пикселей SolidColorBrush scb = new SolidColorBrush(); // Зададим цвет заливки фигуры scb.Color = (Color)ColorConverter.ConvertFromString(FillColor); shapeBase.Fill = scb; SolidColorBrush scb2 = new SolidColorBrush(); // Зададим цвет обводки фигуры scb2.Color = (Color)ColorConverter.ConvertFromString(StrokeColor); shapeBase.Stroke = scb2; shapeBase.StrokeThickness = StrokeWeight; // Зададим толщину обводки фигуры shapeBase.ToolTip = ShapeName; // Установим "подсказку" о названии фигуры ContextMenu context_menu = new ContextMenu(); // Установим для фигуры контекстное меню context_menu.Items.Add(new MenuItem() { Header = "RenameShape", Command = new ShapeContextMenuViewModel(_Editor, this).ShapeRename }); context_menu.Items.Add(new MenuItem() { Header = "DeleteShape", Command = new ShapeContextMenuViewModel(_Editor, this).ShapeDelete }); shapeBase.ContextMenu = context_menu; _Editor.DrawPanel.Children.Add(shapeBase); // Добавим фигуру на панель рисования редактора _Editor.PolygonsCount++; // Фигур-полигонов в редакторе стало на одну больше if (_Editor.IsMouseDraws) // Если фигура создается при помощи мыши, { _Editor.IsPrompt = true; // Выводим подсказку как завершить создание фигуры ControlPointsCount = 2; // Количество контролов пока 2 } else { ControlPointsCount = _List_tBox.Count; // Количество контролов равно кол-ву текстовых полей } visualControler = new VisualControler(_Editor, this, ControlPointsCount); // Добавим к фигуре контроллер управления ее параметрами if (_Editor.IsMouseDraws) // Если фигура создается при помощи мыши, { ((Ellipse)visualControler.ControlPoints[0]).Name = shapeBase.Name + "_Point1"; // Зададим название первому контролу ((Ellipse)visualControler.ControlPoints[1]).Name = shapeBase.Name + "_Point2"; // и второму контролу } else { for (int i = 0; i < _List_tBox.Count; i++) // Зададим название всем контролам { ((Ellipse)visualControler.ControlPoints[i]).Name = shapeBase.Name + "_Point" + (i + 1).ToString(); } } }