/// <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; }
/// <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; }