public static List <Point3D> GetIntersectionPoints(List <SolverPreviewObject> _solverGeometry, Document _document)
        {
            var edgeSuggestions = new List <SolverGeometricObject>();
            var intersections   = new List <Point3D>();

            for (int i = 0; i < _solverGeometry.Count; i++)
            {
                if (_solverGeometry[i] is SolverEdgeTwoPointsResult)
                {
                    var nb         = TreeUtils.AddLineToNode(_document, (_solverGeometry[i]).Point, ((SolverEdgeTwoPointsResult)_solverGeometry[i]).SecondPoint);
                    var suggestion = SolverConstraintFactory.Instance.ExtractGeometry(nb.Node);
                    if (suggestion == null)
                    {
                        continue;
                    }
                    edgeSuggestions.Add(suggestion);
                }
            }

            foreach (var geomObj in edgeSuggestions)
            {
                if (geomObj == null)
                {
                    continue;
                }
                var edges = GeomUtils.ExtractEdges(geomObj.Builder.Shape);
                geomObj.Edges.Add(new SolverEdge(edges[0]));
            }

            // we have more than one solution - move the point to the intersection
            if (edgeSuggestions.Count >= 2)
            {
                intersections = SolverExtractLogic.GetIntersectionsPointList(edgeSuggestions);
            }
            return(intersections);
        }
Beispiel #2
0
        private void OnMouseData(DataPackage data)
        {
            var mouseData = data.Get <Mouse3DPosition>();

            //if (_solverSuspended)
            //    return;

            // Pass the coordinates through the solver
            // Check if there are any magic points around

            mouseData.Point = ApplyCoordinateIncrements(mouseData.Point);
            gpPln sketchPlane     = null;
            var   eventsPipePlane = Inputs[InputNames.Mouse3DEventsPipe].GetData(NotificationNames.GetPlane);

            if (eventsPipePlane != null)
            {
                sketchPlane = ((gpPln)eventsPipePlane.Data);
            }
            if (sketchPlane == null)
            {
                sketchPlane = GeomUtils.PlaneOfTheView(ViewItems.View);
            }
            //      var viewPlane = GeomUtils.PlaneOfTheView(ViewItems.View);
            _solverGeometry = _previousPoint != null
                                  ? Solver.GetInterestingCloseGeometry(sketchPlane, mouseData.Point,
                                                                       (Point3D)_previousPoint)
                                  : Solver.GetInterestingCloseGeometry(sketchPlane, mouseData.Point);

            _solverDrawer.Transact();

            var _document = _solverDrawer.Document;

            _document.Transact();
            var edgeSuggestions = new List <SolverGeometricObject>();

            for (int i = 0; i < _solverGeometry.Count; i++)
            {
                if (_solverGeometry[i] is SolverEdgeTwoPointsResult)
                {
                    var nb         = TreeUtils.AddLineToNode(_document, (_solverGeometry[i]).Point, ((SolverEdgeTwoPointsResult)_solverGeometry[i]).SecondPoint, ObjectVisibility.Hidden);
                    var suggestion = SolverConstraintFactory.Instance.ExtractGeometry(nb.Node);
                    if (suggestion == null)
                    {
                        continue;
                    }
                    edgeSuggestions.Add(suggestion);
                    nb.Visibility = ObjectVisibility.Hidden;
                }
            }

            foreach (var geomObj in edgeSuggestions)
            {
                if (geomObj == null)
                {
                    continue;
                }
                var edges = GeomUtils.ExtractEdges(geomObj.Builder.Shape);
                geomObj.Edges.Add(new SolverEdge(edges[0]));
            }
            var mousePoint = mouseData.Point;

            if (_solverGeometry.Count > 0)
            {
                mousePoint = _solverGeometry[0].Point;
            }
            else
            {
                var clear = new SolverNoResult(mousePoint)
                {
                    Text = string.Empty
                };
                _solverGeometry.Add(clear);
            }

            // we have more than one solution - move the point to the intersection
            if (edgeSuggestions.Count >= 2)
            {
                var intersections = SolverExtractLogic.GetIntersectionsPointList(edgeSuggestions);
                // if there is more than one intersection point, we need to choose the closest one
                if (intersections.Count > 0)
                {
                    if (intersections.Count == 1)
                    {
                        mousePoint = intersections[0];
                    }
                    else
                    {
                        mousePoint = GeomUtils.GetClosestPoint(intersections, mouseData.Point);
                    }
                }
            }

            //  _document.Revert();

            for (int index = 0; index < _solverGeometry.Count; index++)
            {
                // show all hinter lines
                var solverPreviewObject = ShowSolverGeometry(index);
                UpdateLayerPos(solverPreviewObject, mouseData);
            }

            mouseData.Axis.Location = (mousePoint.GpPnt);
            var mouse3DPosition = new Mouse3DPosition(mousePoint, mouseData.Axis, mouseData.MouseDown,
                                                      mouseData.ShiftDown,
                                                      mouseData.ControlDown, mouseData.Initial2Dx, mouseData.Initial2Dy);

            AddData(mouse3DPosition);
            ShowHinter(_document, _solverGeometry, mouse3DPosition, sketchPlane);
            // If it is a click store the coordinate of it
            if (mouseData.MouseDown && mouseData.MouseDown != PreviousMouseDown)
            {
                _previousPoint = mousePoint;
            }

            PreviousMouseDown = mouseData.MouseDown;

            ViewRedraw();
        }