/// <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);
        }
Esempio n. 2
0
        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);
        }