Example #1
0
        void PolylineEditManipulantor_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            if ((System.Windows.Forms.Control.ModifierKeys & System.Windows.Forms.Keys.Control) == 0)
            {
                return;
            }

            if (_poly == null)
            {
                return;
            }
            var gridMan = ((Views.SchemaView)_view).GridManager;

            for (int i = 0; i < _poly.Points.Count - 1; i++)
            {
                // Hit test
                var lg = new LineGeometry(_poly.Points[i], _poly.Points[i + 1]);
                var eg = new EllipseGeometry(gridMan.GetMousePos(), gridMan.GridDelta, gridMan.GridDelta);
                var id = eg.FillContainsWithDetail(lg);
                if (id == IntersectionDetail.Intersects)
                {
                    // Insert point to the polyline
                    _poly.Points.Insert(i + 1, gridMan.GetMousePos());
                    // Rendering (new thumbs)
                    AddThumb(gridMan.GetMousePos());
                    e.Handled = true;
                    break;
                }
            }
            InvalidateVisual();
        }
        private bool HitTestDrawing(GeometryDrawing drawing, Geometry geomDisplay, IntersectionDetail detail)
        {
            Pen   pen   = drawing.Pen;
            Brush brush = drawing.Brush;

            if (pen != null && brush == null)
            {
                if (drawing.Geometry.StrokeContainsWithDetail(pen, geomDisplay) == detail)
                {
                    return(true);
                }
                Geometry geometry = drawing.Geometry;

                LineGeometry      line      = null;
                EllipseGeometry   ellipse   = null;
                RectangleGeometry rectangle = null;
                PathGeometry      path      = null;
                if (TryCast.Cast(geometry, out path))
                {
                    PathFigureCollection pathFigures = path.Figures;
                    int itemCount = pathFigures.Count;
                    if (itemCount == 1)
                    {
                        if (pathFigures[0].IsClosed && path.FillContainsWithDetail(geomDisplay) == detail)
                        {
                            return(true);
                        }
                    }
                    else
                    {
                        for (int f = 0; f < itemCount; f++)
                        {
                            PathFigure pathFigure = pathFigures[f];
                            if (pathFigure.IsClosed)
                            {
                                PathFigureCollection testFigures = new PathFigureCollection();
                                testFigures.Add(pathFigure);

                                PathGeometry testPath = new PathGeometry();
                                testPath.Figures = testFigures;

                                if (testPath.FillContainsWithDetail(geomDisplay) == detail)
                                {
                                    return(true);
                                }
                            }
                        }
                    }
                }
                else if (TryCast.Cast(geometry, out line))
                {
                    if (line.FillContainsWithDetail(geomDisplay) == detail)
                    {
                        return(true);
                    }
                }
                else if (TryCast.Cast(geometry, out ellipse))
                {
                    if (ellipse.FillContainsWithDetail(geomDisplay) == detail)
                    {
                        return(true);
                    }
                }
                else if (TryCast.Cast(geometry, out rectangle))
                {
                    if (rectangle.FillContainsWithDetail(geomDisplay) == detail)
                    {
                        return(true);
                    }
                }
            }
            else if (brush != null && drawing.Geometry.FillContainsWithDetail(geomDisplay) == detail)
            {
                return(true);
            }

            return(false);
        }