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 void SelectByFrame(IssoPoint2D pt1, bool over)
 {
     if (!SelectionStarted)
     {
         SelectionStarted     = true;
         SelectionRect.Left   = pt1.X;
         SelectionRect.Top    = pt1.Y;
         SelectionRect.Right  = SelectionRect.Left;
         SelectionRect.Bottom = SelectionRect.Top;
     }
     else
     {
         SelectionRect.Right  = pt1.X;
         SelectionRect.Bottom = pt1.Y;
     }
     if (over)
     {
         if (modelVM.SelectElementsByRect(SelectionRect) > 0)
         {
             OnComponentSelected?.Invoke(modelVM.FirstSelectedBeam, null);
         }
         SelectionStarted = false;
         EditorAction     = EditorActions.None;
         CancelAction();
         Invalidate();
     }
     ;
 }
 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();
     }
 }