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;
        }
示例#2
0
        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);
        }
示例#6
0
        public void EditBinding()
        {
            IsVisible = true;
            ComponentBasic c = modelSurface.GetSelectedComponent();

            if (c?.CompType == ComponentTypes.ctBinding)
            {
                string dim = ((IssoBinding)c).Value.ToString("G0");
                DimValue.Text = dim;
            }
        }
示例#7
0
        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);
            }
        }