Exemple #1
0
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="TModepath"></param>
        /// <param name="Tcolor"></param>
        /// <param name="RModepath"></param>
        /// <param name="Rcolor"></param>
        /// <param name="posarray"></param>
        /// <param name="TModescale"></param>
        /// <param name="RModescale"></param>
        /// <param name="sysname"></param>
        /// <param name="Radarangle"></param>
        /// <param name="Rpitch"></param>
        public SARSYS(
            string TModepath,
            Color Tcolor,
            string RModepath,
            Color Rcolor,
            double[] posarray,
            double TModescale = 1, 
            double RModescale = 1, 
            string sysname = "newSARSYS",
            double Radarangle = 5,
            double Rpitch=30
            )
        {
            #region 一些简单基本属性赋值

            int ii;
            SYSname =sysname;
            radarangle=Radarangle;
            Tscancolor=Tcolor;
            Rscancolor=Rcolor;
            Receivepitch = Rpitch;

            //检查名字是否重复
            do
            {
                for (ii = 0; ii < SARSYS.SARsyslist.Count;ii++ )
                {
                    if(((SARSYS)(SARSYS.SARsyslist[ii])).SYSname==this.SYSname )//发现重名
                    {
                        this.SYSname += "-new";
                        break;
                    }
                }
            } while (ii < SARSYS.SARsyslist.Count);

            #endregion

            #region 创建group
            //创建group
            groupid = sgworld.ProjectTree.CreateGroup(SYSname);
            sgworld.ProjectTree.SetClientData(groupid, "isSARSYS", "yes");//表示这是一个planeradar类
            sgworld.ProjectTree.SetClientData(groupid, "Tthemecolor", (Tscancolor.ToArgb()).ToString());
            sgworld.ProjectTree.SetClientData(groupid, "Rthemecolor", (Rscancolor.ToArgb()).ToString());
            sgworld.ProjectTree.SetClientData(groupid, "radarangle", radarangle.ToString());
            sgworld.ProjectTree.SetClientData(groupid, "Receivepitch", Receivepitch.ToString());

            groupdepid = sgworld.ProjectTree.CreateGroup(SYSname + "dep", groupid);

            #endregion

            #region 创建动态3d实体(发射机)

            //创建动态3d实体(发射机)
            IRouteWaypoint65 tmpwaypoint;

            Tplaneobj = sgworld.Creator.CreateDynamicObject(
                0,//IRouteWaypoints65 型,然而此参数并没有什么 用
                DynamicMotionStyle.MOTION_AIRPLANE,
                DynamicObjectType.DYNAMIC_3D_MODEL,
                TModepath, //3d文件
                TModescale,//缩放倍数
                AltitudeTypeCode.ATC_TERRAIN_RELATIVE,//高度模式
                groupid, //在信息树中处于什么group下
                SYSname + "Tplane");//在信息树中的名字

            Tplaneobj.CircularRoute = false;
            //Tplaneobj.Pause = true;
            //根据传进来的数组设定waypoints
            for (ii = 0; ii < posarray.Length; ii += 3)
            {
                tmpwaypoint = sgworld.Creator.CreateRouteWaypoint(posarray[ii], posarray[ii + 1], posarray[ii + 2]);
                Tplaneobj.Waypoints.AddWaypoint(tmpwaypoint);
            }

            #endregion

            #region 创建动态3d实体(接收机)
            //创建动态3d实体(接收机)
            Rplaneobj = sgworld.Creator.CreateDynamicObject(
                0,//IRouteWaypoints65 型,然而此参数并没有什么 用
                DynamicMotionStyle.MOTION_AIRPLANE,
                DynamicObjectType.DYNAMIC_3D_MODEL,
                RModepath, //3d文件
                RModescale,//缩放倍数
                AltitudeTypeCode.ATC_TERRAIN_RELATIVE,//高度模式
                groupid, //在信息树中处于什么group下
                SYSname + "Rplane");//在信息树中的名字

            Rplaneobj.CircularRoute = false;
            //Rplaneobj.Pause = true;
            //根据传进来的数组设定waypoints
            for (ii = 0; ii < posarray.Length; ii += 3)
            {
                tmpwaypoint = sgworld.Creator.CreateRouteWaypoint(posarray[ii]+0.03, posarray[ii + 1], posarray[ii + 2]);
                Rplaneobj.Waypoints.AddWaypoint(tmpwaypoint);
            }
            #endregion

            #region 创建scancircle
            //创建scancircle,scancircle与Rplane挂钩

            double Rradardistance = Rplaneobj.Position.Altitude / Math.Sin(Math.Abs(Receivepitch) / 180 * Math.PI);
            IPosition65 tmpposition = Rplaneobj.Position.Move(Rradardistance, Rplaneobj.Position.Yaw, -Receivepitch);

            scancircle = sgworld.Creator.CreateCircle(
               tmpposition,
               Rradardistance * Math.Tan(radarangle / 180 * Math.PI),
               Rscancolor,
               Rscancolor,
               groupdepid,
               SYSname + "scancircle"
               );
            scancircle.Position.Altitude = 1;
            scancircle.FillStyle.Color.SetAlpha(0.4);
            #endregion

            #region 创建wholescanarea
            //创建wholescanarea,平时不可见,演示时可见。
            //总扫描区域可以在每次plane到达一个waypoint时更新一次(或新建一个),以保证scanarea总是可以是条状。演示时更新放在到达waypoint事件中。
            //先开发两点waypoint的演示,即只需一条scanarea,即wholescanarea数组长度为1;
            wholescanarea = new ITerrainPolygon65[Rplaneobj.Waypoints.Count-1];

            initradararea(0);
            wholescanarea[0].Visibility.Show = false;//演示时再可见

            #endregion

            #region 创建尾迹(发射机)
            //一条polyline,平时不可见,演示时可见,每帧更新一次
            //先做只有一条直线飞行的轨迹

            Ttrackarray[0] = Tplaneobj.Position.X;
            Ttrackarray[1] = Tplaneobj.Position.Y;
            Ttrackarray[2] = Tplaneobj.Position.Altitude;

            Ttrackarray[3] = Tplaneobj.Position.X;
            Ttrackarray[4] = Tplaneobj.Position.Y;
            Ttrackarray[5] = Tplaneobj.Position.Altitude;

            Tplanetrack = sgworld.Creator.CreatePolylineFromArray(
                Ttrackarray,
                Tscancolor,
                AltitudeTypeCode.ATC_TERRAIN_RELATIVE,
                groupdepid,
                SYSname + "Ttrack"
                );
            Tplanetrack.LineStyle.Width = 10;
            Tplanetrack.Visibility.Show = false;

            #endregion

            #region 创建尾迹(接收机)
            //一条polyline,平时不可见,演示时可见,每帧更新一次
            //先做只有一条直线飞行的轨迹
            Rtrackarray[0] = Rplaneobj.Position.X;
            Rtrackarray[1] = Rplaneobj.Position.Y;
            Rtrackarray[2] = Rplaneobj.Position.Altitude;

            Rtrackarray[3] = Rplaneobj.Position.X;
            Rtrackarray[4] = Rplaneobj.Position.Y;
            Rtrackarray[5] = Rplaneobj.Position.Altitude;

            Rplanetrack = sgworld.Creator.CreatePolylineFromArray(
                Rtrackarray,
                Rscancolor,
                AltitudeTypeCode.ATC_TERRAIN_RELATIVE,
                groupdepid,
                SYSname + "Rtrack"
                );
            Rplanetrack.LineStyle.Width = 10;
            Rplanetrack.Visibility.Show = false;
            #endregion

            #region 创建雷达波束脉冲(发射机)

            double Tradardistance = Tplaneobj.Position.DistanceTo(scancircle.Position);
            for (ii = 0; ii < wavenum; ii++)
            {
                double wavedistance = Tradardistance * ii / wavenum;
                tmpposition = Tplaneobj.Position.MoveToward(scancircle.Position, wavedistance);
                Twave[ii] = sgworld.Creator.CreateCircle(
                   tmpposition,
                   scancircle.Radius * ii *1.32/ wavenum,
                   Tscancolor,
                   Tscancolor,
                   groupdepid,
                   SYSname + "Twave"+ii.ToString()
                   );
                Twave[ii].FillStyle.Color.SetAlpha(0.5);
            }
            #endregion

            #region 创建雷达波束脉冲(接收机)
            for (ii = 0; ii < wavenum; ii++)
            {
                double wavedistance = Rradardistance * (ii+1) / wavenum;
                tmpposition = Rplaneobj.Position.MoveToward(scancircle.Position, wavedistance);
                Rwave[ii] = sgworld.Creator.CreateCircle(
                   tmpposition,
                   scancircle.Radius * (ii+1) *1.1/ wavenum,
                   Rscancolor,
                   Rscancolor,
                   groupdepid,
                   SYSname + "Rwave" + ii.ToString()
                   );
                Rwave[ii].FillStyle.Color.SetAlpha(0.5);
            }
            #endregion

            #region 创建waveshape(发射机)
            //创建waveshape(发射机)
            double[] shapearray = new double[3 * 3];
            for (ii = 0; ii < wavesidenum; ii++)
            {

                tmpposition = scancircle.Position.Move(scancircle.Radius * 1.2, Tplaneobj.Position.Yaw + 360 * ii / wavesidenum, 0);
                shapearray[0] = tmpposition.X;
                shapearray[1] = tmpposition.Y;
                shapearray[2] = 0;

                tmpposition = scancircle.Position.Move(scancircle.Radius * 1.2, Tplaneobj.Position.Yaw + 360 * (ii + 1) / wavesidenum, 0);
                shapearray[3] = tmpposition.X;
                shapearray[4] = tmpposition.Y;
                shapearray[5] = 0;

                shapearray[6] = Tplaneobj.Position.X;
                shapearray[7] = Tplaneobj.Position.Y;
                shapearray[8] = Tplaneobj.Position.Altitude;

                //ILinearRing tmpgeo = sgworld.Creator.GeometryCreator.CreateLinearRingGeometry(shapearray);
                Tradarwaveshape[ii] = sgworld.Creator.CreatePolygon(
                    sgworld.Creator.GeometryCreator.CreateLinearRingGeometry(shapearray),
                    Tscancolor,
                    Tscancolor,
                    AltitudeTypeCode.ATC_TERRAIN_RELATIVE,
                    groupdepid,
                    SYSname + "Twaveshape" + ii.ToString()
                    );
                Tradarwaveshape[ii].FillStyle.Color.SetAlpha(0.4);
            }
            #endregion

            #region 创建waveshape(接收机)
            //创建waveshape(接收机)
            for (ii = 0; ii < wavesidenum; ii++)
            {

                tmpposition = scancircle.Position.Move(scancircle.Radius, Rplaneobj.Position.Yaw + 360 * ii / wavesidenum, 0);
                shapearray[0] = tmpposition.X;
                shapearray[1] = tmpposition.Y;
                shapearray[2] = 0;

                tmpposition = scancircle.Position.Move(scancircle.Radius, Rplaneobj.Position.Yaw + 360 * (ii + 1) / wavesidenum, 0);
                shapearray[3] = tmpposition.X;
                shapearray[4] = tmpposition.Y;
                shapearray[5] = 0;

                shapearray[6] = Rplaneobj.Position.X;
                shapearray[7] = Rplaneobj.Position.Y;
                shapearray[8] = Rplaneobj.Position.Altitude;

                //ILinearRing tmpgeo = sgworld.Creator.GeometryCreator.CreateLinearRingGeometry(shapearray);
                Rradarwaveshape[ii] = sgworld.Creator.CreatePolygon(
                    sgworld.Creator.GeometryCreator.CreateLinearRingGeometry(shapearray),
                    Rscancolor,
                    Rscancolor,
                    AltitudeTypeCode.ATC_TERRAIN_RELATIVE,
                    groupdepid,
                    SYSname + "Rwaveshape" + ii.ToString()
                    );
                Rradarwaveshape[ii].FillStyle.Color.SetAlpha(0.4);
            }
            #endregion

            sgworld.OnProjectTreeAction += this.groupdel;
            sgworld.OnObjectAction += this.planeedit;//绑定对象编辑完成事件
            wavemovestarttime = DateTime.Now;
            sgworld.OnFrame+=sgworld_OnFrame_wave;
            SARsyslist.Add(this);
            SARSYS.sarsysnumchanged(SARSYS.SARsyslist.IndexOf(this));//产生新建事件

            creatflag = true;
            sgworld.OnFrame += sgworld_OnFrame;
        }
Exemple #2
0
        /// <summary>
        /// 构造函数
        /// 通过现有的group创建SARSYS实例
        /// 此版本先不对group做检查,默认传递进来时已做好检测检查
        /// </summary>
        /// <param name="Groupid"></param>
        public SARSYS(string Groupid)
        {
            groupid = Groupid;
            SYSname = sgworld.ProjectTree.GetItemName(groupid);

            groupdepid = sgworld.ProjectTree.FindItem(SYSname + "\\" + SYSname + "dep");

            Tscancolor = Color.FromArgb(int.Parse(sgworld.ProjectTree.GetClientData(groupid, "Tthemecolor")));
            Rscancolor = Color.FromArgb(int.Parse(sgworld.ProjectTree.GetClientData(groupid, "Rthemecolor")));
            radarangle = double.Parse(sgworld.ProjectTree.GetClientData(groupid, "radarangle"));
            Receivepitch = double.Parse(sgworld.ProjectTree.GetClientData(groupid, "Receivepitch"));

            Tplaneobj = (ITerrainDynamicObject65)sgworld.ProjectTree.GetObject(sgworld.ProjectTree.FindItem(SYSname + "\\" + SYSname + "Tplane"));
            Tplaneobj.RestartRoute();
            Tplaneobj.CircularRoute = false;
            //Tplaneobj.Pause = true;

            Rplaneobj = (ITerrainDynamicObject65)sgworld.ProjectTree.GetObject(sgworld.ProjectTree.FindItem(SYSname + "\\" + SYSname + "Rplane"));
            Rplaneobj.RestartRoute();
            Rplaneobj.CircularRoute = false;
            //Rplaneobj.Pause = true;

            scancircle = (ITerrainRegularPolygon65)sgworld.ProjectTree.GetObject(sgworld.ProjectTree.FindItem(SYSname + "\\" + SYSname+"dep\\" + SYSname + "scancircle"));
            int ii;
            for (ii = 0; ii < wavenum; ii++)
            {
                Twave[ii] = (ITerrainRegularPolygon65)sgworld.ProjectTree.GetObject(sgworld.ProjectTree.FindItem(SYSname + "\\" + SYSname + "dep\\" + SYSname + "Twave" + ii.ToString()));
                Rwave[ii] = (ITerrainRegularPolygon65)sgworld.ProjectTree.GetObject(sgworld.ProjectTree.FindItem(SYSname + "\\" + SYSname + "dep\\" + SYSname + "Rwave" + ii.ToString()));

            }

            for (ii = 0; ii < wavesidenum; ii++)
            {
                Rradarwaveshape[ii] = (ITerrainPolygon65)sgworld.ProjectTree.GetObject(sgworld.ProjectTree.FindItem(SYSname + "\\" + SYSname + "dep\\" + SYSname + "Rwaveshape" + ii.ToString()));
                Tradarwaveshape[ii] = (ITerrainPolygon65)sgworld.ProjectTree.GetObject(sgworld.ProjectTree.FindItem(SYSname + "\\" + SYSname + "dep\\" + SYSname + "Twaveshape" + ii.ToString()));
            }
            wholescanarea = new ITerrainPolygon65[Rplaneobj.Waypoints.Count - 1];
            wholescanarea[0] = (ITerrainPolygon65)sgworld.ProjectTree.GetObject(sgworld.ProjectTree.FindItem(SYSname + "\\" + SYSname + "dep\\" + SYSname + "wholescanarea" + "0"));
            wholescanarea[0].Visibility.Show = false;

            IPosition65 tmpposition;
            tmpposition = scancircle.Position.Move(scancircle.Radius, Rplaneobj.Position.Yaw + 90, 0);
            scanareaarray[0] = tmpposition.X;
            scanareaarray[1] = tmpposition.Y;
            scanareaarray[2] = 0;
            tmpposition = scancircle.Position.Move(scancircle.Radius, Rplaneobj.Position.Yaw + 180, 0);
            scanareaarray[3] = tmpposition.X;
            scanareaarray[4] = tmpposition.Y;
            scanareaarray[5] = 0;
            tmpposition = scancircle.Position.Move(scancircle.Radius, Rplaneobj.Position.Yaw - 90, 0);
            scanareaarray[6] = tmpposition.X;
            scanareaarray[7] = tmpposition.Y;
            scanareaarray[8] = 0;

            Tplanetrack = (ITerrainPolyline65)sgworld.ProjectTree.GetObject(sgworld.ProjectTree.FindItem(SYSname + "\\" + SYSname + "dep\\" + SYSname + "Ttrack"));
            Tplanetrack.Visibility.Show = false;
            Ttrackarray[0] = Tplaneobj.Position.X;
            Ttrackarray[1] = Tplaneobj.Position.Y;
            Ttrackarray[2] = Tplaneobj.Position.Altitude;

            Rplanetrack = (ITerrainPolyline65)sgworld.ProjectTree.GetObject(sgworld.ProjectTree.FindItem(SYSname + "\\" + SYSname + "dep\\" + SYSname + "Rtrack"));
            Rplanetrack.Visibility.Show = false;
            Rtrackarray[0] = Rplaneobj.Position.X;
            Rtrackarray[1] = Rplaneobj.Position.Y;
            Rtrackarray[2] = Rplaneobj.Position.Altitude;

            sgworld.OnProjectTreeAction += this.groupdel;
            sgworld.OnObjectAction += this.planeedit;//绑定对象编辑完成事件
            wavemovestarttime = DateTime.Now;
            sgworld.OnFrame += sgworld_OnFrame_wave;
            SARsyslist.Add(this);
            creatflag = true;
            sgworld.OnFrame += sgworld_OnFrame;
        }