public TransformationMaxtrix InverseTransformationMatrix(TransformationMaxtrix transform)
        {
            var swTransform = m_MathUtils.CreateTransFormTransformationMaxtrix(transform);

            swTransform = swTransform.IInverse();
            return(swTransform.ToTransformationMaxtrix());
        }
        private void TestDisplayOnBody(TransformationMaxtrix transform, string fileName, string bodyName,
                                       IEnumerable <Point> points = null)
        {
            Sw.App.WithDocument <object>(fileName,
                                         m =>
            {
                var body = Sw.Doc.GetBodyByName(m as IPartDoc, bodyName);

                var mathTx = (Sw.SldWorks.IGetMathUtility() as IMathUtility).CreateTransFormTransformationMaxtrix(transform);

                var tempBody = body.ICopy();
                tempBody.ApplyTransform(mathTx as MathTransform);

                ManualDisposeToken pointsDispToken = null;

                if (points != null)
                {
                    pointsDispToken = Sw.Doc.TempDisplayPoints(m, points.Select(p => p.ToArray()));
                }

                Sw.Doc.TempDisplayBody(tempBody, m, new SyncFormDisposeToken());

                if (pointsDispToken != null)
                {
                    pointsDispToken.Dispose();
                }

                return(null);
            });
        }
        public Point TransformPoint(Point point, TransformationMaxtrix transform)
        {
            IMathPoint mathPt      = m_MathUtils.CreatePoint(point.ToArray()) as IMathPoint;
            var        swTransform = m_MathUtils.CreateTransFormTransformationMaxtrix(transform);

            mathPt = mathPt.MultiplyTransform(swTransform) as IMathPoint;
            return(new Point(mathPt.ArrayData as double[]));
        }
        public Vector TransformVector(Vector vector, TransformationMaxtrix transform)
        {
            IMathVector vec         = m_MathUtils.CreateVector(vector.ToArray()) as IMathVector;
            var         swTransform = m_MathUtils.CreateTransFormTransformationMaxtrix(transform);

            vec = vec.MultiplyTransform(swTransform) as IMathVector;
            return(new Vector(vec.ArrayData as double[]));
        }
        private double GetHeight(IGeometry geom, Vector dir, TransformationMaxtrix alignTransform,
                                 out Vector newDir, out Point rootPt)
        {
            Point endPt;

            dir = GetExtremePointsAligned(geom, dir, alignTransform, out rootPt, out endPt);

            double height = Math.Abs(endPt.Y - rootPt.Y);

            //direction might change depending on root point so recalculating the direction to be towards geometry
            newDir = new Vector(0, endPt.Y - rootPt.Y, 0);

            return(height);
        }
        public static IMathTransform CreateTransFormTransformationMaxtrix(
            this IMathUtility mathUtils, TransformationMaxtrix transform)
        {
            var arrData = new double[]
            {
                transform.Rotation.M11, transform.Rotation.M12, transform.Rotation.M13,
                transform.Rotation.M21, transform.Rotation.M22, transform.Rotation.M23,
                transform.Rotation.M31, transform.Rotation.M32, transform.Rotation.M33,
                transform.Translation.X, transform.Translation.Y, transform.Translation.Z,
                transform.Scale,
                0, 0, 0
            };

            return(mathUtils.CreateTransform(arrData) as IMathTransform);
        }
        private Vector GetExtremePointsAligned(IGeometry geom, Vector dir,
                                               TransformationMaxtrix alignTransform, out Point rootPt, out Point endPt)
        {
            if (alignTransform != null)
            {
                dir = m_VecMathServ.TransformVector(dir, alignTransform);
            }

            geom.GetExtremePoints(dir, out rootPt, out endPt);

            if (alignTransform != null)
            {
                rootPt = m_VecMathServ.TransformPoint(rootPt, alignTransform);
                endPt  = m_VecMathServ.TransformPoint(endPt, alignTransform);
            }

            return(dir);
        }
        public CylinderParams GetStockParameters(IGeometry geom, Vector heightDirection)
        {
            var yAxis = m_DefaultVectors[VectorType_e.Y];

            bool isAligned = yAxis.IsSame(heightDirection);

            TransformationMaxtrix alignTransform = null;

            if (!isAligned)
            {
                var origin = new Point(0, 0, 0);

                alignTransform = m_VecMathServ.GetTransformBetweenVectorsAroundPoint(
                    heightDirection, yAxis, origin);
            }

            Vector dir;
            Point  rootPt;
            var    height = GetHeight(geom, yAxis, alignTransform, out dir, out rootPt);

            Debug.Assert(height != 0);

            var perPoints = GetPerimeterPoints(geom, alignTransform).ConvertAll(p => new Nayuki.Point(p.X, p.Z));

            var enclosingCirc = Nayuki.SmallestEnclosingCircle.MakeCircle(perPoints);

            var circCenter = new Point(enclosingCirc.c.x, rootPt.Y, enclosingCirc.c.y);

            if (!isAligned)
            {
                var inversedAlignTransform = m_VecMathServ.InverseTransformationMatrix(alignTransform);

                circCenter = m_VecMathServ.TransformPoint(circCenter, inversedAlignTransform);
                dir        = m_VecMathServ.TransformVector(dir, inversedAlignTransform);
            }

            double radius = enclosingCirc.r;

            return(new CylinderParams(height, circCenter, dir, radius));
        }
        private List <Point> GetPerimeterPoints(IGeometry geom, TransformationMaxtrix alignTransform)
        {
            var perPoints = new List <Point>();

            var vectors = new Vector[]
            {
                m_DefaultVectors[VectorType_e.X],
                m_DefaultVectors[VectorType_e.Y],
                m_DefaultVectors[VectorType_e.Z]
            };

            foreach (var vec in vectors)
            {
                Point startPt;
                Point endPt;

                GetExtremePointsAligned(geom, vec, alignTransform, out startPt, out endPt);

                perPoints.Add(startPt);
                perPoints.Add(endPt);
            }

            return(perPoints);
        }
        public void TestTransformPoint()
        {
            var comp = new DoubleEqualityComparerWithTolerance();

            var mathServ = new SwVectorMathService(Sw.SldWorks.IGetMathUtility());

            var transform = new TransformationMaxtrix(
                new RotationMatrix(-0.356591604687574, -0.860646213105648, -0.363497624934811,
                                   0.860646213105648, -0.45399049973947, 0.230609457770521,
                                   -0.363497624934811, -0.230609457770521, 0.902601104948104), new Vector(0, 0, 0), 1);

            var pts = new Point[6];

            pts[0] = new Point(-0.110883845818614, 0.0605238203210351, -0.0239825852813666);
            pts[1] = new Point(-0.0412497473005035, 0.179859854385059, 0.0275862063054218);
            pts[2] = new Point(-0.142959784835457, 0.106453187928056, 0.00530736214458289);
            pts[3] = new Point(-0.0405325336202925, 0.171216718860278, 0.0419248817887173);
            pts[4] = new Point(-0.13321429487189, 0.0821558975737544, 0.0167696845654225);
            pts[5] = new Point(-0.0104076774276791, 0.149982352301203, -0.0286994667274928);

            var ptsTransf = new Point[6];

            for (int i = 0; i < pts.Length; i++)
            {
                ptsTransf[i] = mathServ.TransformPoint(pts[i], transform);
            }

            //TestDisplayOnBody(transform, "Data\\t2.sldprt", "Body-Move/Copy2", ptsTransf);

            Assert.IsTrue(ptsTransf[0].ToArray().SequenceEqual(new double[] { 0.100347458065948, 0.0734851335523633, 0.0326166720106647 }, comp));
            Assert.IsTrue(ptsTransf[1].ToArray().SequenceEqual(new double[] { 0.159477495676095, -0.0525148664476371, 0.0813709089599175 }, comp));
            Assert.IsTrue(ptsTransf[2].ToArray().SequenceEqual(new double[] { 0.140667578609346, 0.0734851335523624, 0.0813050851309728 }, comp));
            Assert.IsTrue(ptsTransf[3].ToArray().SequenceEqual(new double[] { 0.146570986957314, -0.0525148664476372, 0.092059119028498 }, comp));
            Assert.IsTrue(ptsTransf[4].ToArray().SequenceEqual(new double[] { 0.112114520796401, 0.073485133552363, 0.082505342603813 }, comp));
            Assert.IsTrue(ptsTransf[5].ToArray().SequenceEqual(new double[] { 0.143225221928054, -0.0525148664476371, 0.0124663445857203 }, comp));
        }