/// <summary> /// Detects paralellism with axis /// </summary> /// <param name = "currentPoint"></param> /// <param name = "initialPosition"></param> /// <returns></returns> public SolverPreviewObject AxisParallel(Point3D currentPoint, Point3D initialPosition) { var direction = new gpDir(new gpVec(initialPosition.GpPnt, currentPoint.GpPnt)); var axisDirection = _oxDir; if (axisDirection.IsParallel(direction, _precision)) { var point = GetOtherPoint(initialPosition, currentPoint, axisDirection); if (point == null) { return(null); } var solverPoint = new SolverEdgeTwoPointsResult(point.Value, initialPosition, Color.Red) { Type = "Parallel X" }; return(solverPoint); } axisDirection = _oyDir; if (axisDirection.IsParallel(direction, _precision)) { //return ProjectPointOnDirection(initialPosition, currentPoint, axisDirection, Color.Green); var point = GetOtherPoint(initialPosition, currentPoint, axisDirection); if (point == null) { return(null); } var solverPoint = new SolverEdgeTwoPointsResult(point.Value, initialPosition, Color.Red) { Type = "Parallel Y" }; return(solverPoint); } axisDirection = _ozDir; if (axisDirection.IsParallel(direction, _precision)) { //return ProjectPointOnDirection(initialPosition, currentPoint, axisDirection, Color.Blue); var point = GetOtherPoint(initialPosition, currentPoint, axisDirection); if (point == null) { return(null); } var solverPoint = new SolverEdgeTwoPointsResult(point.Value, initialPosition, Color.Red) { Type = "Parallel Z" }; return(solverPoint); } return(null); }
public override SolverPreviewObject InterestingShapeAroundPoint(gpPln planeOfTheView, Point3D currentPoint, Point3D initialPosition) { if (currentPoint.IsEqual(initialPosition)) { return(null); } var qosLock = QosFactory.Instance.Get(QosNames.ParallelLineLock); qosLock.Begin(); var vec = new gpVec(initialPosition.GpPnt, currentPoint.GpPnt); foreach (var solverGeometricObject in Geometry) { if (solverGeometricObject.ParallelAxis.Count == 0) { continue; } foreach (var axis in solverGeometricObject.ParallelAxis) { if (vec.IsNormal(axis.Vector, _precision)) { var planeNormal = vec.Crossed(axis.Vector); var planeNormalAxis = new gpAx1(initialPosition.GpPnt, new gpDir(planeNormal)); gpVec v2 = axis.Vector.Normalized; v2.Rotate(planeNormalAxis, Math.PI / 2.0); var parallelLine = new gceMakeLin(initialPosition.GpPnt, new gpDir(v2)).Value; var geomLine = new GeomLine(parallelLine); var projectionPoint = new GeomAPIProjectPointOnCurve(currentPoint.GpPnt, geomLine); if (projectionPoint.NbPoints <= 0) { return(null); } var secondPoint = new Point3D(projectionPoint.NearestPoint); var solverPoint = new SolverEdgeTwoPointsResult(secondPoint, initialPosition, Color.Black) { Type = "Perpendicular Line" }; return(solverPoint); } } } qosLock.End(); return(null); }
/// <summary> /// Calculates the projection of the second line point on the direction so that the line created from /// [first point, projection] is parallel with direction. /// </summary> /// <param name = "firstLinePoint"></param> /// <param name = "secondLinePoint"></param> /// <param name = "direction"></param> /// <param name = "color"></param> /// <returns></returns> public static SolverPreviewObject ProjectPointOnDirection(Point3D firstLinePoint, Point3D secondLinePoint, gpDir direction, Color color) { // Make a parallel line with this line starting from the initial point var parallelLine = new gceMakeLin(firstLinePoint.GpPnt, direction).Value; var geomLine = new GeomLine(parallelLine); var projectionPoint = new GeomAPIProjectPointOnCurve(secondLinePoint.GpPnt, geomLine); if (projectionPoint.NbPoints <= 0) { return(null); } var firstParallelPoint = new Point3D(projectionPoint.NearestPoint); var secondParallelPoint = firstLinePoint; var solverPoint = new SolverEdgeTwoPointsResult(firstParallelPoint, secondParallelPoint, color) { Type = "Parallel Line" }; return(solverPoint); }
public override List <SolverPreviewObject> InterestingShapeAroundPoint(gpPln planeOfTheView, Point3D point) { //var qosLock = QosFactory.Instance.Get(QosNames.SameCoordinateMatchLock); var zoom = CoreGlobalPreferencesSingleton.Instance.ZoomLevel * _precision; //qosLock.Begin(); var axis = new gpAx2(); axis.Axis = (planeOfTheView.Axis); var pointOnPlane = GeomUtils.Point3DTo2D(axis, point); var solutions = new SortedDictionary <double, SolverEdgeTwoPointsResult>(); foreach (var geometricObject in LastGeometry) { foreach (var pnt in geometricObject.Points) { var result = GeomUtils.ProjectPointOnPlane(pnt.Point.GpPnt, planeOfTheView, Precision.Confusion); if (Math.Abs(result.X - pnt.Point.GpPnt.X) > Precision.Confusion || Math.Abs(result.Y - pnt.Point.GpPnt.Y) > Precision.Confusion || Math.Abs(result.Z - pnt.Point.GpPnt.Z) > Precision.Confusion) { continue; } var planePnt = GeomUtils.Point3DTo2D(axis, pnt.Point); var xDistance = Math.Abs(pointOnPlane.X - planePnt.X); var solutionPointOnPlane = new gpPnt2d(pointOnPlane.X, pointOnPlane.Y); var solutionPoint = new Point3D(point.GpPnt); if (xDistance <= zoom) { solutionPointOnPlane.X = (planePnt.X); solutionPoint = new Point3D(GeomUtils.Point2DTo3D(axis, solutionPointOnPlane)); solutions[xDistance] = new SolverEdgeTwoPointsResult(solutionPoint, pnt.Point, Color.Blue) { Type = "Same coordinate match" }; } else { var yDistance = Math.Abs(pointOnPlane.Y - planePnt.Y); if (yDistance <= zoom) { solutionPointOnPlane.Y = (planePnt.Y); solutionPoint = new Point3D(GeomUtils.Point2DTo3D(axis, solutionPointOnPlane)); solutions[yDistance] = new SolverEdgeTwoPointsResult(solutionPoint, pnt.Point, Color.Blue) { Type = "Same coordinate match" }; } } } } //qosLock.End(); if (solutions.Count == 0) { return(new List <SolverPreviewObject>()); } var SolverPreviewObjects = new List <SolverPreviewObject>(); foreach (var s in solutions) { SolverPreviewObjects.Add(s.Value); } return(SolverPreviewObjects); }