private void CreateNewLinear(IssoPoint2D pt1) { // НОВЫЙ ЛИНЕЙНЫЙ КОМПОНЕНТ // Компонент идёт в паре с двумя узлами. // Первый узел - в точке, указанной пользователем (pt1) // Если в этой точке уже есть другой узел, то берём его как начало элемента // Если тут нет узла - создаём его, и берём как стартовый // Если пользователь указал точку, лежащую на линейном компоненте - создаём в этом месте // узел, разделяя компонент на две части, и берём его как стартовый ComponentNode node = modelVM.GetNodeAtPoint(pt1); if (node == null) { IssoPoint2D pt2; ComponentBasic b = modelVM.GetComponent(pt1, out pt2); if (b?.CompType == ComponentTypes.ctLinear) { modelVM.SplitLinearAt((ComponentLinear)b, pt2); node = modelVM.GetNodeAtPoint(pt2); } node = new ComponentNode(pt1); } pt1.X += 0.1f; EditedComp = new ComponentLinear(node, new ComponentNode(pt1), RModel); EditorAction = EditorActions.NewLinearLastPoint; }
private void SetBindingValue(float dim) { ComponentBasic c = modelSurface.GetSelectedComponent(); if (c?.CompType == ComponentTypes.ctBinding) { IssoBinding b = (IssoBinding)c; bool res = false; float val = b.Value; b.Value = dim; switch (b.Type) { case IssoBindingType.Horizontal: res = modelSurface.Model.PreprocessBindingChange(b, (Math.Sign(b.Target.Location.X - b.Source.Location.X)) * dim, float.MaxValue); break; case IssoBindingType.Vertical: res = modelSurface.Model.PreprocessBindingChange(b, float.MaxValue, (Math.Sign(b.Target.Location.Y - b.Source.Location.Y)) * dim); break; } if (!res) { b.Value = val; } else { EditBinding(); } modelSurface.OnSelectedComponentChanged(); } }
private void CreateOrEditNode(IssoPoint2D pt1) { // РЕДАКТИРОВАНИЕ УЗЛА // Сначала найдём ближайший к pt1 компонент и точку на нём - // Если pt1 далека от какого-либо компонента, не делаем ничего // Если эта точка далека от существующего узла компонента, то // Создаём новый узел, разделяя компонент на две части IssoPoint2D pt2; ComponentBasic comp = modelVM.GetComponent(pt1, out pt2); // Если эта точка близка к началу или концу линейного компонента - выбираем начало или конец // Если нет - разбиваем компонент на две части if (comp?.CompType == ComponentTypes.ctLinear) { modelVM.SplitLinearAt((ComponentLinear)comp, pt2); EditedComp = new ComponentNode(pt2); RModel.CompsList.Add(EditedComp); OnComponentSelected?.Invoke(EditedComp, null); } if (comp?.CompType == ComponentTypes.ctNode) { EditedComp = comp; OnComponentSelected?.Invoke(EditedComp, null); } }
private ComponentNode GetLoadStartNode(IssoPoint2D pt1, ComponentTypes loadType) { // Если пользователь указал узел, то создаём силу, приложенную в этом узле ComponentNode node = modelVM.GetNodeAtPoint(pt1); if ((node == null) || (!modelVM.CloseEnough(pt1, node.Location))) { ComponentBasic lin = modelVM.GetComponent(pt1, out IssoPoint2D pt2); // Если же он указал линейный компонент, то создаём узел в ближайшей точке к указанной // точке компонента, а уже в нём - силу if (lin?.CompType == ComponentTypes.ctLinear) { if (loadType == ComponentTypes.ctForce) { if (lin?.CompType == ComponentTypes.ctLinear) { modelVM.SplitLinearAt((ComponentLinear)lin, pt1); } node = modelVM.GetNodeAtPoint(pt1); } else { node = new ComponentNode(pt2); } } else { node = null; } } return(node); }
internal bool DeleteSelectedObject() { ComponentBasic b = GetSelectedComponent(); if (b.CompType == ComponentTypes.ctLinear) { ComponentNode n1 = ((ComponentLinear)b).StartNode; ComponentNode n2 = ((ComponentLinear)b).EndNode; // Выясним, есть ли ещё компоненты, соединённые с этими узлами // Если нет - удаляем и узлы if (RModel.NodeSingle(n1)) { RModel.CompsList.Remove(n1); } if (RModel.NodeSingle(n2)) { RModel.CompsList.Remove(n2); } } if (b.CompType == ComponentTypes.ctNode) { // При удалении узла возникают ситуации // 1. Удаление крайнего узла. В этом случае требуется подтверждение на удаление, // поскольку удаляться должен и заканчивающийся в этом узле линейный компонент // 2. Удаление узла, в котором сходятся несколько элементов // 2.1. Если элементов два - сращиваем элементы в один // То есть, фактически удаляем один из них - тот, на котором нет распределённой нагрузки // а оставшийся улиняем до конца удалённого элемента // 2.2 TODO: В общем, слишком муторно, отложу на потом. } RModel.CompsList.Remove(b); editedComp = null; Invalidate(); return(true); }
public void EditBinding() { IsVisible = true; ComponentBasic c = modelSurface.GetSelectedComponent(); if (c?.CompType == ComponentTypes.ctBinding) { string dim = ((IssoBinding)c).Value.ToString("G0"); DimValue.Text = dim; } }
private void ButtonDelete_Pressed(object sender, EventArgs e) { ComponentBasic c = modelSurface.GetSelectedComponent(); if (c?.CompType == ComponentTypes.ctBinding) { if (modelSurface.DeleteSelectedObject()) { IsVisible = false; modelSurface.IssoAction(EditorActions.None); } } }
private void DrawComponent(ComponentBasic c, SKCanvas canvas) { if (c == null) { return; } switch (c.CompType) { case ComponentTypes.ctLinear: ComponentLinearVM.Draw((ComponentLinear)c, this, canvas); break; case ComponentTypes.ctNode: ComponentNodeVM.DrawNode((ComponentNode)c, this, canvas); break; case ComponentTypes.ctBinding: IssoBindingVM.DrawDimension((IssoBinding)c, this, canvas); break; case ComponentTypes.ctForce: ComponentLoadVM.Draw((ComponentLoad)c, this, canvas); break; case ComponentTypes.ctDistributedLoad: ComponentLoadVM.Draw((ComponentLoad)c, this, canvas); break; } }
private void CreateDistLoad(IssoPoint2D pt1) { //ComponentNode node = GetLoadStartNode(pt1, ComponentTypes.ctDistributedLoad); IssoPoint2D pt2; ComponentBasic c = modelVM.GetComponent(pt1, out pt2, ComponentTypes.ctLinear); if (c != null) { ComponentLoad load = new ComponentLoad(ComponentTypes.ctDistributedLoad, -10, (ComponentLinear)c); RModel.CompsList.Add(load); EditedComp = load; EditorAction = EditorActions.None; Invalidate(); } else { EditedComp = null; } }
private void SelectComponent(IssoPoint2D pt1) { // Если в данный момент никакой операции редактирования не выполняется, // то просто определяем, есть ли в зоне касания какой-либо компонент. // Если есть, то выбираем его if (EditorAction == EditorActions.None) { IssoPoint2D pt2; ComponentBasic comp = modelVM.GetComponent(pt1, out pt2); // НЕ НАДО) Меняем состояние ранее выбранного компонента на обычное // modelVM.DropSelection(); if (comp != null) { EditedComp = comp; EditedComp.CompState = ComponentState.csSelected; } else { EditedComp = null; } OnComponentSelected?.Invoke(EditedComp, null); Invalidate(); } }
private void MirrorElements(IssoPoint2D point, bool touched) { if (MirroAxisDefined) { return; } // Для отражения элемента надо, чтобы были предварительно выбраны // какие-нибудь элементы // Если выбран хотя бы один, пользователь должен указать отрезок, относительно которого будут // отражены выбранные объекты // Этим отрезком может быть как прямолинейный элемент, так и просто линия между двумя точками, указываемыми пользователем // Таким образом, у этой операции есть три стадии: // 1. Выбор объектов // 2. Выбор отрезка // 2.1 Если щелчок мимо каких-либо прямолинейных элементов, то начинаем рисовать ось - первую точку // 2.1.1 Ждём указания второй точки - а пока рисуем ось от первой точки до текущего положения курсора // 2.2 Если щёлкнули элемент - сразу переходим на третий шаг // 3. Подтверждение // 3.1 Отображаем цветом результат отражения // 3.2 На панели инструментов пишем текст с вопросом и кнопкой "Отразить" IssoPoint2D pointOnObject; ComponentBasic b = modelVM.GetComponent(point, out pointOnObject); // Если был щелчок, то есть два варианта: // 1. Указана первая точка // 2. Первая точка уже была задана, задаётся вторая if (touched) { if (MirrorAxis.Count == 0) { if (b?.CompType == ComponentTypes.ctLinear) { MirrorAxis.Add((b as ComponentLinear).Start); MirrorAxis.Add((b as ComponentLinear).End); MirroAxisDefined = true; } else { MirrorAxis.Add(pointOnObject); } } else { if (MirrorAxis.Count == 1) { MirrorAxis.Add(pointOnObject); } else { MirrorAxis[1] = pointOnObject; } MirroAxisDefined = true; } } else // Если щелчка не было, то // 1. Если точек тоже не было - ничего не делаем // 2. Если одна уже есть - добавляем вторую с координатами Point // 3. Если есть две - изменяем координаты второй { if (MirrorAxis.Count == 0) { return; } if (MirrorAxis.Count == 1) { MirrorAxis.Add(pointOnObject); } else { MirrorAxis[1] = pointOnObject; } } // Если ось задана, все выделенные элементы перемещаем // в список if (MirroAxisDefined) { OnMirrorConfirm?.Invoke(this, null); } }