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); }
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(); }