/// <summary>
        /// 投影
        /// </summary>
        /// <param name="m"></param>
        /// <param name="h"></param>
        /// <param name="p"></param>
        /// <param name="cameraVector"></param>
        /// <param name="mathP"></param>
        /// <returns></returns>
        public static MathVector Project(this ITriadManipulator m, swTriadManipulatorControlPoints_e h, IMathPoint p, IMathVector cameraVector, IMathUtility mathP)
        {
            IMathUtility math = mathP;

            //var zero = (IMathPoint)math.CreatePoint(new[] { 0, 0, 0 });
            //double pT, qT;
            switch (h)
            {
            case swTriadManipulatorControlPoints_e.swTriadManipulatorOrigin:
                return((MathVector)p.Subtract(m.Origin));

            case swTriadManipulatorControlPoints_e.swTriadManipulatorXAxis:

                return(ClosestPointOnAxis(m, p, cameraVector, m.XAxis));

            case swTriadManipulatorControlPoints_e.swTriadManipulatorYAxis:
                return(ClosestPointOnAxis(m, p, cameraVector, m.YAxis));

            case swTriadManipulatorControlPoints_e.swTriadManipulatorZAxis:
                return(ClosestPointOnAxis(m, p, cameraVector, m.ZAxis));

            case swTriadManipulatorControlPoints_e.swTriadManipulatorXYPlane:
                return((MathVector)p.Subtract(m.Origin));

            case swTriadManipulatorControlPoints_e.swTriadManipulatorYZPlane:
                return((MathVector)p.Subtract(m.Origin));

            case swTriadManipulatorControlPoints_e.swTriadManipulatorZXPlane:
                return((MathVector)p.Subtract(m.Origin));

            default:
                throw new ArgumentOutOfRangeException(nameof(h), h, null);
            }
        }
        private static MathVector ClosestPointOnAxis(ITriadManipulator m, IMathPoint p, IMathVector cameraVector, MathVector axis)
        {
            double pT;
            double qT;

            if (ClosestPointBetweenLines(m.Origin, axis, p, cameraVector, out pT, out qT))
            {
                return((MathVector)axis.Scale(pT));
            }
            else
            {
                return(null);
            }
        }
        private static MathVector ClosestPointOnAxis(ITriadManipulator m, IMathPoint p, IMathVector cameraVector, MathVector axis)
        {
            double pT;
            double qT;

            if (ClosestPointBetweenLines(m.Origin, axis, p, cameraVector, out pT, out qT))
            {
                return (MathVector) axis.Scale(pT);
            }
            else
            {
                return null;
            }
        }
        /// <summary>
        /// 创建变换矩阵
        /// </summary>
        /// <param name="m"></param>
        /// <param name="h"></param>
        /// <param name="math"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public static MathTransform CreateTranslationTransform
            (this ITriadManipulator m, swTriadManipulatorControlPoints_e h, IMathUtility math, double value)
        {
            MathVector translVector = null;

            switch (h)
            {
            case swTriadManipulatorControlPoints_e.swTriadManipulatorOrigin:
                break;

            case swTriadManipulatorControlPoints_e.swTriadManipulatorXAxis:
                translVector = (MathVector)math.CreateVector(new[] { value, 0, 0 });
                break;

            case swTriadManipulatorControlPoints_e.swTriadManipulatorYAxis:
                translVector = (MathVector)math.CreateVector(new[] { 0, value, 0 });
                break;

            case swTriadManipulatorControlPoints_e.swTriadManipulatorZAxis:
                translVector = (MathVector)math.CreateVector(new[] { 0, 0, value });
                break;

            case swTriadManipulatorControlPoints_e.swTriadManipulatorXYPlane:
                break;

            case swTriadManipulatorControlPoints_e.swTriadManipulatorYZPlane:
                break;

            case swTriadManipulatorControlPoints_e.swTriadManipulatorZXPlane:
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(h), h, null);
            }

            if (translVector == null)
            {
                return(null);
            }

            return(math.ComposeTransform(m.XAxis, m.YAxis, m.ZAxis, translVector, 1.0));
        }
Ejemplo n.º 5
0
 public ITriadManipulatorObject(ITriadManipulator ITriadManipulatorinstance)
 {
     ITriadManipulatorInstance = ITriadManipulatorinstance;
 }
 public TriadManipulatorTs(IModelDoc2 doc)
 {
     _Manipulator = doc.ModelViewManager.CreateManipulator((int)swManipulatorType_e.swTriadManipulator, this);
     _Impl        = (ITriadManipulator)_Manipulator.GetSpecificManipulator();
     _Impl.Cursor = (int)swManipulatorCursor_e.swManipulatorMoveCursor;
 }
 public TriadManipulatorTs(IModelDoc2 doc)
 {
     _Manipulator = doc.ModelViewManager.CreateManipulator((int) swManipulatorType_e.swTriadManipulator, this);
     _Impl = (ITriadManipulator) _Manipulator.GetSpecificManipulator();
     _Impl.Cursor = (int)swManipulatorCursor_e.swManipulatorMoveCursor;
 }