Example #1
0
        public static void ShowFaceDirection(TopoDSFace face, Document Document)
        {
            var p1 = new gpPnt();
            var v1 = new gpVec();
            var v2 = new gpVec();

            var sf = new BRepAdaptorSurface(face, true);
            var u  = sf.FirstUParameter;
            var x  = sf.LastUParameter;

            if (Precision.IsInfinite(u))
            {
                u = (Precision.IsInfinite(x)) ? 0.0 : x;
            }
            else if (!Precision.IsInfinite(x))
            {
                u = (u + x) / 2.0;
            }

            var v = sf.FirstVParameter;

            x = sf.LastVParameter;
            if (Precision.IsInfinite(v))
            {
                v = (Precision.IsInfinite(x)) ? 0.0 : x;
            }
            else if (!Precision.IsInfinite(x))
            {
                v = (v + x) / 2.0;
            }

            sf.D1(u, v, p1, v1, v2);
            var vector = v1.Crossed(v2);

            x = vector.Magnitude;

            // The direction vector length
            const double length = 70.0;

            if (x > 0.0000001)
            {
                vector.Multiply(length / x);
            }
            else
            {
                vector.SetCoord(length / 2.0, 0, 0);
            }

            var p2 = new gpPnt(p1.X, p1.Y, p1.Z);

            p2.Translate(vector);

            if (p1.IsEqual(p2, Precision.Confusion))
            {
                return;
            }

            DrawArrow(Document, p1, p2, face.Orientation());
        }
        /// <summary>
        ///   Calculates the computer radiuses knowing the center position and two points located on the two axis
        /// </summary>
        public static bool ComputeEllipseRadiuses(Point3D center, Point3D secondPoint, Point3D thirdPoint,
                                                  out double minorRadius, out double majorRadius,
                                                  out bool reversed, ref gpDir dirX, ref gpDir dirY)
        {
            // Calculate the major radius
            majorRadius = center.GpPnt.Distance(secondPoint.GpPnt);
            // Calculate also the axis/direction of the major radus
            var vecX = new gpVec(center.GpPnt, secondPoint.GpPnt);

            dirX = new gpDir(vecX);
            var line = new gpLin(center.GpPnt, dirX);

            // Calculate the minor radius
            minorRadius = line.Distance(thirdPoint.GpPnt);
            reversed    = false;
            if (minorRadius < Precision.Confusion || majorRadius < Precision.Confusion)
            {
                return(false);
            }
            // Calculate also the axis/direction of the major radus
            var vecY = new gpVec(center.GpPnt, thirdPoint.GpPnt);
            // We want the direction to be perpendicular on the direction of the major radius
            var vecZ = vecX.Crossed(vecY);

            vecY = vecX.Crossed(vecZ);
            dirY = new gpDir(vecY);

            // Major radius must be bigger than minor radius

            if (minorRadius > majorRadius)
            {
                var aux = majorRadius;
                majorRadius = minorRadius;
                minorRadius = aux;
                reversed    = true;
            }
            return(true);
        }
Example #3
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);
        }
Example #4
0
        // The rectangle is like the following:
        //   vertex2------vertex3
        //   vertex1------vertex4
        public override gpAx2 GetPointLocation(int index)
        {
            var firstPoint  = Dependency[0].TransformedPoint3D;
            var secondPoint = Dependency[1].TransformedPoint3D;
            var thirdPoint  = Dependency[2].TransformedPoint3D;

            var vectorV2V1               = new gpVec(secondPoint.GpPnt, firstPoint.GpPnt);
            var vectorV2V3               = new gpVec(secondPoint.GpPnt, thirdPoint.GpPnt);
            var rectangleNormalVector    = vectorV2V1.Crossed(vectorV2V3);
            var rectangleNormalDirection = new gpDir(rectangleNormalVector);

            var rectangleCenter = new gpPnt((firstPoint.X + thirdPoint.X) / 2, (firstPoint.Y + thirdPoint.Y) / 2,
                                            (firstPoint.Z + thirdPoint.Z) / 2);

            vectorV2V3.Normalize();
            vectorV2V1.Normalize();
            vectorV2V3.Multiply(DistanceToObject);
            vectorV2V1.Multiply(DistanceToObject);

            var leftArrowVector   = vectorV2V3.Reversed;
            var leftArrowMidPoint = GeomUtils.ComputeMidPoint(firstPoint, secondPoint);
            var leftArrowPoint    = GeomUtils.BuildTranslation(leftArrowMidPoint, leftArrowVector);
            var leftArrowAxis     = new gpAx2(leftArrowPoint.GpPnt, rectangleNormalDirection)
            {
                XDirection = (new gpDir(leftArrowVector))
            };

            var topArrowVector   = vectorV2V1.Reversed;
            var topArrowMidPoint = GeomUtils.ComputeMidPoint(secondPoint, thirdPoint);
            var topArrowPoint    = GeomUtils.BuildTranslation(topArrowMidPoint, topArrowVector);
            var topArrowAxis     = new gpAx2(topArrowPoint.GpPnt, rectangleNormalDirection);

            topArrowAxis.XDirection = (new gpDir(topArrowVector));

            var bottomArrowPoint = new gpPnt(2 * rectangleCenter.X - topArrowPoint.X,
                                             2 * rectangleCenter.Y - topArrowPoint.Y,
                                             2 * rectangleCenter.Z - topArrowPoint.Z);
            var bottomArrowAxis = new gpAx2(bottomArrowPoint, rectangleNormalDirection);

            bottomArrowAxis.XDirection = (new gpDir(topArrowVector.Reversed));

            var rightArrowPoint = new gpPnt(2 * rectangleCenter.X - leftArrowPoint.X,
                                            2 * rectangleCenter.Y - leftArrowPoint.Y,
                                            2 * rectangleCenter.Z - leftArrowPoint.Z);
            var rightArrowAxis = new gpAx2(rightArrowPoint, rectangleNormalDirection);

            rightArrowAxis.XDirection = new gpDir(leftArrowVector.Reversed);

            var pointLocation = new gpAx2();

            pointLocation.Direction = rectangleNormalDirection;

            switch (index)
            {
            case 0:
                pointLocation.Location   = (firstPoint.GpPnt);
                pointLocation.XDirection = (new gpDir(vectorV2V3));
                return(pointLocation);

            case 1:
                pointLocation.Location   = (thirdPoint.GpPnt);
                pointLocation.XDirection = (new gpDir(vectorV2V3));
                return(pointLocation);

            case 2:
                return(leftArrowAxis);

            case 3:
                return(topArrowAxis);

            case 4:
                return(rightArrowAxis);

            case 5:
                return(bottomArrowAxis);

            default:
                return(null);
            }
        }
Example #5
0
        public override void UpdatePointPosition(int index, Mouse3DPosition vertex)
        {
            var firstPoint  = Dependency[0].TransformedPoint3D;
            var secondPoint = Dependency[1].TransformedPoint3D;
            var thirdPoint  = Dependency[2].TransformedPoint3D;

            if (firstPoint.IsEqual(vertex.Point) || secondPoint.IsEqual(vertex.Point) ||
                thirdPoint.IsEqual(vertex.Point))
            {
                return;
            }

            if (firstPoint.IsEqual(new Point3D(0, 0, 0)))
            {
                var projectionOnP1P2 = GeomUtils.ProjectPointOnLine(firstPoint,
                                                                    new gpDir(new gpVec(firstPoint.GpPnt,
                                                                                        secondPoint.GpPnt)),
                                                                    vertex.Point);
                if (projectionOnP1P2 != null)
                {
                    if (projectionOnP1P2.Value.Distance(firstPoint) < Precision.Confusion)
                    {
                        return;
                    }
                }
                var projectionOnP2P3 = GeomUtils.ProjectPointOnLine(secondPoint,
                                                                    new gpDir(new gpVec(secondPoint.GpPnt,
                                                                                        thirdPoint.GpPnt)),
                                                                    vertex.Point);
                if (projectionOnP2P3 != null)
                {
                    if (projectionOnP2P3.Value.Distance(secondPoint) < Precision.Confusion)
                    {
                        return;
                    }
                }
            }

            var vectorV2V1 = new gpVec(secondPoint.GpPnt, firstPoint.GpPnt);
            var vectorV2V3 = new gpVec(secondPoint.GpPnt, thirdPoint.GpPnt);

            if (vectorV2V1.IsParallel(vectorV2V3, Precision.Angular))
            {
                return;
            }

            var rectangleNormalVector = vectorV2V1.Crossed(vectorV2V3);

            if (rectangleNormalVector.Magnitude < Precision.Confusion)
            {
                return;
            }

            switch (index)
            {
            case 0:
                SetFirstPointDraggingHandle(thirdPoint, vertex);
                break;

            case 1:
                SetSecondPointDraggingHandle(vectorV2V1, vertex, secondPoint);
                break;

            case 2:
                SetLeftArrowDraggingHandle(firstPoint, vertex, thirdPoint);
                break;

            case 3:
                SetTopArrowDraggingHandle(thirdPoint, vertex, firstPoint);
                break;

            case 4:
                SetRightArrowDraggingHandle(vertex);
                break;

            case 5:
                SetBottomArrowDraggingHandle(firstPoint, vertex);
                break;
            }
        }