//时间：20200610
//作者：郝爽
//功能：六孔坐标位置
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FileManager;
using System.Xml;

namespace MeasureData
{
    //六轴坐标系统
    public class SemPosition : ISlo
    {
        private float m_x, m_y, m_z, m_r, m_t, m_m;

        #region X
        //限定范围
        const float Xmax = 100;
        const float Xmin = 0;

        public float X
        {
            get { return this.m_x; }
            set => this.m_x = rangeCheckedX(value);
        }

        private static float rangeCheckedX(float x)
        {
            if (x > Xmax) x = Xmax;
            else if (x < Xmin) x = Xmin;

            return x;
        }
        #endregion

        #region Y
        //限定范围
        const float Ymax = 100;
        const float Ymin = 0;

        public float Y
        {
            get { return this.m_y; }
            set => this.m_y = rangeCheckedY(value);
        }

        private static float rangeCheckedY(float y)
        {
            if (y > Ymax) y = Ymax;
            else if (y < Ymin) y = Ymin;

            return y;
        }
        #endregion

        #region Z
        //限定范围
        const float Zmax = 100;
        const float Zmin = (float)0.005;

        public float Z
        {
            get { return this.m_z; }
            set => this.m_z = rangeCheckedZ(value);
        }

        private static float rangeCheckedZ(float z)
        {
            if (z > Zmax) z = Zmax;
            else if (z < Zmin) z = Zmin;

            return z;
        }
        #endregion

        #region R
        //限定范围
        const float Rmax = 360;
        const float Rmin = 0;

        public float R
        {
            get { return this.m_r; }
            set => this.m_r = rangeCheckedR(value);
        }

        private static float rangeCheckedR(float r)
        {
            if (r > Rmax) r = Rmax;
            else if (r < Rmin) r = Rmin;

            return r;
        }
        #endregion

        #region T
        //限定范围
        const float Tmax = 180;
        const float Tmin = 0;

        public float T
        {
            get { return this.m_t; }
            set => this.m_t = rangeCheckedT(value);
        }

        private static float rangeCheckedT(float t)
        {
            if (t > Tmax) t = Tmax;
            else if (t < Tmin) t = Tmin;

            return t;
        }
        #endregion

        #region M
        //限定范围
        const float Mmax = 100;
        const float Mmin = 0;

        public float M
        {
            get { return this.m_m; }
            set => this.m_m = rangeCheckedM(value);
        }

        private static float rangeCheckedM(float m)
        {
            if (m > Mmax) m = Mmax;
            else if (m < Mmin) m = Mmin;

            return m;
        }
        #endregion

        #region WD

        private float m_wd;

        public float WD
        {
            get { return m_wd; }
            set { this.m_wd = value; }
        }
        #endregion

        #region BeamShiftX

        private float beamShiftX;

        public float BeamShiftX
        {
            get { return beamShiftX; }
            set { this.beamShiftX = value; }
        }
        #endregion

        #region BeamShiftY

        private float beamShiftY;
        public float BeamShiftY
        {
            get { return beamShiftY; }
            set { this.beamShiftY = value; }
        }
        #endregion

        public SemPosition()
        {
            m_x = 0;
            m_y = 0;
            m_z = 0;
            m_r = 0;
            m_t = 0;
            m_m = 0;
            m_wd = 0;
            BeamShiftX = 0;
            BeamShiftY = 0;
        }


        public override void Serialize(bool isStoring, XmlDocument xml, XmlNode rootNode)
        {
            Slo slo_sp = new Slo();

            xDouble ptx = new xDouble();
            ptx.AssignValue(this.X);
            slo_sp.Register("X", ptx);

            xDouble pty = new xDouble();
            pty.AssignValue(this.Y);
            slo_sp.Register("Y", pty);

            xDouble ptz = new xDouble();
            ptz.AssignValue(this.Z);
            slo_sp.Register("Z", ptz);

            xDouble ptt = new xDouble();
            ptt.AssignValue(this.T);
            slo_sp.Register("T", ptt);

            xDouble ptr = new xDouble();
            ptr.AssignValue(this.R);
            slo_sp.Register("R", ptr);

            xDouble ptm = new xDouble();
            ptm.AssignValue(this.M);
            slo_sp.Register("M", ptm);

            xDouble ptwd = new xDouble();
            ptm.AssignValue(this.WD);
            slo_sp.Register("WD", ptwd);

            xDouble ptbsx = new xDouble();
            ptm.AssignValue(this.beamShiftX);
            slo_sp.Register("BeamShiftX", ptbsx);

            xDouble ptbsy = new xDouble();
            ptm.AssignValue(this.beamShiftY);
            slo_sp.Register("BeamShiftY", ptbsy);

            if (isStoring)
            {
                slo_sp.Serialize(true, xml, rootNode);
            }
            else
            {
                slo_sp.Serialize(false, xml, rootNode);
                this.X = (float)ptx.value();
                this.Y = (float)pty.value();
                this.Z = (float)ptz.value();
                this.T = (float)ptt.value();
                this.R = (float)ptr.value();
                this.M = (float)ptm.value();
                this.WD = (float)ptwd.value();
                this.BeamShiftX = (float)ptbsx.value();
                this.BeamShiftY = (float)ptbsy.value();
            }
        }
    }

}
