Example #1
1
		public ScriptPlayer(String scriptFile, IGlobe globe)
		{
			System.Diagnostics.Debug.Assert(globe != null);
			System.Diagnostics.Debug.Assert(scriptFile != null);
			System.Diagnostics.Debug.Assert(!scriptFile.Equals(String.Empty));

			System.IO.FileInfo fi = new System.IO.FileInfo(scriptFile);
			if (!fi.Exists)
				throw new TimelineException("Specified script does not exist.");

			Script script = new Script(fi);
			System.Collections.IList atElements = script.AtElements;
			if (atElements == null || atElements.Count < 1)
				throw new TimelineException("Script file " + scriptFile
					+ " has no At elements.");

			this.globe = globe;
			this.timesToRepeat = script.RepeatCount;
			this.timelines = new Timelines(atElements);

			this.timer = new System.Timers.Timer(15);
			this.timer.AutoReset = true;
			this.timer.Elapsed += new System.Timers.ElapsedEventHandler(timerTickHandler);

			this.createPlayers();
		}
        /// <summary>
        /// Occurs when this command is created
        /// </summary>
        /// <param name="hook">Instance of the application</param>
        public override void OnCreate(object hook)
        {
            //Instantiate the hook helper
            if (null == m_globeHookHelper)
            {
                m_globeHookHelper = new GlobeHookHelperClass();
            }

            //set the hook
            m_globeHookHelper.Hook = hook;

            //get the relevant members
            IGlobe globe = m_globeHookHelper.Globe;

            m_scene         = globe as IScene;
            m_globeDsp      = m_globeHookHelper.GlobeDisplay;
            m_globeViewUtil = m_globeHookHelper.Camera as IGlobeViewUtil;

            //connect to the ZipCodes featureclass
            string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

            path = System.IO.Path.Combine(path, @"ArcGIS\data\USZipCodeData");
            if (!Directory.Exists(path))
            {
                throw new Exception(string.Format("Fix code to point to your sample data: {0} was not found", path));
            }

            IWorkspaceFactory wf = new ShapefileWorkspaceFactoryClass() as IWorkspaceFactory;
            IWorkspace        ws = wf.OpenFromFile(path, 0);
            IFeatureWorkspace fw = ws as IFeatureWorkspace;

            m_featureClass = fw.OpenFeatureClass("US_ZipCodes");
        }
        public Task InitActorTransitionAsync(IGlobe globe, ISector sector, IActor actor,
                                             SectorTransition transition)
        {
            if (globe is null)
            {
                throw new ArgumentNullException(nameof(globe));
            }

            if (sector is null)
            {
                throw new ArgumentNullException(nameof(sector));
            }

            if (actor is null)
            {
                throw new ArgumentNullException(nameof(actor));
            }

            if (transition is null)
            {
                throw new ArgumentNullException(nameof(transition));
            }

            return(ProcessInternalAsync(globe, sector, actor, transition));
        }
Example #4
0
 private static async Task RunGlobeIteration(IGlobe globe)
 {
     for (var i = 0; i < GlobeMetrics.OneIterationLength; i++)
     {
         await globe.UpdateAsync().ConfigureAwait(false);
     }
 }
Example #5
0
        private static bool PlayerPersonIsNotInTransitionPool(IGlobe globe, IPerson person)
        {
            var globeNodeWithPerson   = GetSectorNode(globe, person);
            var isPlayerPersonInGlobe = globeNodeWithPerson != null;

            return(isPlayerPersonInGlobe);
        }
        /// <summary>
        /// Occurs when this command is created
        /// </summary>
        /// <param name="hook">Instance of the application</param>
        public override void OnCreate(object hook)
        {
            //Instantiate the hook helper
            if (null == m_globeHookHelper)
            {
                m_globeHookHelper = new GlobeHookHelperClass();
            }

            //set the hook
            m_globeHookHelper.Hook = hook;

            //get the relevant members
            IGlobe globe = m_globeHookHelper.Globe;

            m_scene         = globe as IScene;
            m_globeDsp      = m_globeHookHelper.GlobeDisplay;
            m_globeViewUtil = m_globeHookHelper.Camera as IGlobeViewUtil;

            //connect to the ZipCodes featureclass
            //get the ArcGIS path from the registry
            String      versionNumber = RuntimeManager.ActiveRuntime.Version;
            RegistryKey key           = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\ESRI\ArcObjectsSdk" + versionNumber);
            string      path          = Convert.ToString(key.GetValue("InstallDir"));

            path = System.IO.Path.Combine(path, @"Samples\data\USZipCodeData");

            IWorkspaceFactory wf = new ShapefileWorkspaceFactoryClass() as IWorkspaceFactory;
            IWorkspace        ws = wf.OpenFromFile(path, 0);
            IFeatureWorkspace fw = ws as IFeatureWorkspace;

            m_featureClass = fw.OpenFeatureClass("US_ZipCodes");
        }
Example #7
0
        public static double ReturnProjectDistance(IGlobe pGlobe, double dFromX, double dFromY, double dFromZ, double dToX, double dToY, double dToZ)
        {
            IPoint pPnt1 = new Point();
            IPoint pPnt2 = new Point();

            pPnt1.X = dFromX;
            pPnt1.Y = dFromY;
            MakeZAware(pPnt1);
            pPnt1.Z = dFromZ * 1000;
            pPnt1.SpatialReference = pGlobe.GlobeDisplay.Scene.SpatialReference;
            if (pPnt1.SpatialReference is IGeographicCoordinateSystem)
            {
                pPnt1 = ProjectGeometry(pPnt1) as IPoint;
            }

            pPnt2.X = dToX;
            pPnt2.Y = dToY;
            MakeZAware(pPnt2);
            pPnt2.Z = dToZ * 1000;
            pPnt2.SpatialReference = pGlobe.GlobeDisplay.Scene.SpatialReference;
            if (pPnt2.SpatialReference is IGeographicCoordinateSystem)
            {
                pPnt2 = ProjectGeometry(pPnt2) as IPoint;
            }

            IProximityOperator3D pProximityOperator3D = pPnt1 as IProximityOperator3D;

            return(pProximityOperator3D.ReturnDistance3D(pPnt2));
        }
        private void Form1_Load(object sender, System.EventArgs e)
        {
            //check and load if the animation file is present...
            m_AnimFilePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            m_AnimFilePath = Path.Combine(m_AnimFilePath, @"ArcGIS\data\Globe\AnimationSample.aga");
            var filePath = new DirectoryInfo(m_AnimFilePath);

            System.Diagnostics.Debug.WriteLine(string.Format("File path for data root: {0} [{1}]", filePath.FullName, Directory.GetCurrentDirectory()));
            if (!File.Exists(m_AnimFilePath))
            {
                throw new Exception(string.Format("Fix code to point to your sample data: {0} [{1}] was not found", filePath.FullName, Directory.GetCurrentDirectory()));
            }

            if (System.IO.File.Exists(m_AnimFilePath))
            {
                //Load the sample animation file into the animation file into the doc...
                IGlobe      globe      = axGlobeControl1.Globe;
                IBasicScene basicScene = (IBasicScene)globe;
                basicScene.LoadAnimation(m_AnimFilePath);
            }
            else
            {
                //Disable Animation Player controls...
                OptDuration.Enabled  = false;
                OptIteration.Enabled = false;
                txtDuration.Enabled  = false;
                TxtFrequency.Enabled = false;
                TxtFrequency.Enabled = false;
                CmdPlay.Enabled      = false;
            }
            Icon = null;
        }
        public Task <IEnumerable <IPerson> > CreateStartPersonsAsync(IGlobe globe)
        {
            var person = CreateStartPerson(PERSON_SCHEME_SID, _personFactory, Fractions.MainPersonFraction);

            _player.BindPerson(globe, person);
            return(Task.FromResult(new[] { person }.AsEnumerable()));
        }
Example #10
0
        /// <summary>
        /// 内插中间贞函数,只需给出第一帧和最后一帧的状态信息,即可内插出中间帧状态
        /// </summary>
        /// <param name="pGlobe"></param>
        /// <param name="doubleX1_Tar">第一帧目标点X坐标</param>
        /// <param name="doubleY1_Tar">第一帧目标点Y坐标</param>
        /// <param name="doubleZ1_Tar">第一帧目标点Z坐标</param>
        /// <param name="doubleX1_Obs">第一帧观察点X坐标</param>
        /// <param name="doubleY1_Obs">第一帧观察点Y坐标</param>
        /// <param name="doubleZ1_Obs">第一帧观察点Z坐标</param>
        /// <param name="doubleX2_Tar">第二帧目标点X坐标</param>
        /// <param name="doubleY2_Tar">第二帧目标点Y坐标</param>
        /// <param name="doubleZ2_Tar">第二帧目标点Z坐标</param>
        /// <param name="doubleX2_Obs">第二帧观察点X坐标</param>
        /// <param name="doubleY2_Obs">第二帧观察点Y坐标</param>
        /// <param name="doubleZ2_Obs">第二帧观察点Z坐标</param>
        /// <returns></returns>
        private static IKeyframe CreateMiddleKeyframe(IGlobe pGlobe, double doubleX1_Tar, double doubleY1_Tar, double doubleZ1_Tar,
                                                      double doubleX1_Obs, double doubleY1_Obs, double doubleZ1_Obs,
                                                      double doubleX2_Tar, double doubleY2_Tar, double doubleZ2_Tar,
                                                      double doubleX2_Obs, double doubleY2_Obs, double doubleZ2_Obs)
        {
            IUnitConverter         unitConverter         = new UnitConverterClass();
            IGlobeDisplayRendering globeDisplayRendering = (IGlobeDisplayRendering)pGlobe.GlobeDisplay;
            IKeyframe pMidKeyframe = new GlobeCameraKeyframeClass();

            try
            {
                pMidKeyframe.set_PropertyValueInt(0, 0);
                pMidKeyframe.set_PropertyValueDouble(1, (doubleY1_Tar + doubleY2_Tar) / 2);                                                                           //doubleY_mid);
                pMidKeyframe.set_PropertyValueDouble(2, (doubleX1_Tar + doubleX2_Tar) / 2);                                                                           //doubleX_mid);
                pMidKeyframe.set_PropertyValueDouble(3, (doubleZ1_Tar + doubleZ2_Tar) / 2);                                                                           //doubleZ1_Tar/2);//// (globeDisplayRendering.GlobeRadius / -1000));
                pMidKeyframe.set_PropertyValueDouble(4, (doubleY1_Obs + doubleY2_Obs) / 2);                                                                           //doubleY_mid);
                pMidKeyframe.set_PropertyValueDouble(5, (doubleX1_Obs + doubleX2_Obs) / 2);                                                                           //doubleX_mid);
                //改善中间过程用户体验,增加中间点Observer的高度,让高度约等于两点间距离+海拔高度
                double doubleAltitide_mid = ReturnProjectDistance(pGlobe, doubleX1_Obs, doubleY1_Obs, doubleZ1_Obs, doubleX2_Obs, doubleY2_Obs, doubleZ2_Obs) / 1000; //KM
                //加入地表高程
                doubleAltitide_mid += GetGlobeElevation(pGlobe.GlobeDisplay, (doubleX1_Obs + doubleX2_Obs) / 2, (doubleY1_Obs + doubleY2_Obs) / 2, true);

                pMidKeyframe.set_PropertyValueDouble(6, doubleAltitide_mid);
                pMidKeyframe.set_PropertyValueDouble(7, 30);
                pMidKeyframe.set_PropertyValueDouble(8, 0);
            }
            catch
            { }
            return(pMidKeyframe);
        }
Example #11
0
        public ScriptPlayer(String scriptFile, IGlobe globe)
        {
            System.Diagnostics.Debug.Assert(globe != null);
            System.Diagnostics.Debug.Assert(scriptFile != null);
            System.Diagnostics.Debug.Assert(!scriptFile.Equals(String.Empty));

            System.IO.FileInfo fi = new System.IO.FileInfo(scriptFile);
            if (!fi.Exists)
            {
                throw new TimelineException("Specified script does not exist.");
            }

            Script script = new Script(fi);

            System.Collections.IList atElements = script.AtElements;
            if (atElements == null || atElements.Count < 1)
            {
                throw new TimelineException("Script file " + scriptFile
                                            + " has no At elements.");
            }

            this.globe         = globe;
            this.timesToRepeat = script.RepeatCount;
            this.timelines     = new Timelines(atElements);

            this.timer           = new System.Timers.Timer(15);
            this.timer.AutoReset = true;
            this.timer.Elapsed  += new System.Timers.ElapsedEventHandler(timerTickHandler);

            this.createPlayers();
        }
 private static ISectorNode GetPlayerSectorNode(IPlayer player, IGlobe globe)
 {
     return((from sectorNode in globe.SectorNodes
             from actor in sectorNode.Sector.ActorManager.Items
             where actor.Person == player.MainPerson
             select sectorNode).SingleOrDefault());
 }
Example #13
0
        public void ZoomToGeometry(IGlobe pGlobe, IGeometry pGeo, double doubleDuration, string name)
        {
            pGeo = ProjectGeometryGeo(pGeo);
            IEnvelope pEnvelope = null;

            pEnvelope = pGeo.Envelope;
            ZoomToSelectedGlobeFeatures(pGlobe, pEnvelope, name);
        }
Example #14
0
        private IScene GetScene(IGlobe globe)
        {
            IScene scene;

            scene = globe as IScene;

            return(scene);
        }
Example #15
0
        private async Task ExpandGlobeInternalAsync(IGlobe globe, ISectorNode sectorNode)
        {
            await _biomeInitializer.MaterializeLevelAsync(sectorNode).ConfigureAwait(false);

            // Фиксируем новый узел, как известную, материализованную часть мира.
            // Далее этот узел будет обрабатываться при каждом изменении мира.
            globe.AddSectorNode(sectorNode);
        }
        private IScene GetScene(IGlobe globe)
        {
            IScene scene;

            scene = globe as IScene;

            return scene;
        }
Example #17
0
 public SunPositionTool()
 {
     //get the different members
     m_globe                 = ArcGlobe.Globe;
     m_globeDisplay          = m_globe.GlobeDisplay as IGlobeDisplay3;
     m_globeDisplayRendering = m_globeDisplay as IGlobeDisplayRendering;
     m_globeCamera           = m_globeDisplay.ActiveViewer.Camera as IGlobeCamera;
     m_globeViewUtil         = m_globeCamera as IGlobeViewUtil;
     m_sceneViewer           = m_globeDisplay.ActiveViewer;
 }
 public SunPositionTool()
 {
     //get the different members
     m_globe = ArcGlobe.Globe;
     m_globeDisplay = m_globe.GlobeDisplay as IGlobeDisplay3;
     m_globeDisplayRendering = m_globeDisplay as IGlobeDisplayRendering;
     m_globeCamera = m_globeDisplay.ActiveViewer.Camera as IGlobeCamera;
     m_globeViewUtil = m_globeCamera as IGlobeViewUtil;
     m_sceneViewer = m_globeDisplay.ActiveViewer;
 }
Example #19
0
        public static void ZoomToBookmark(IGlobeDisplay globeDisplay, IBookmark3D pBookmark3D, double doubleDuration)
        {
            try
            {
                //创建动画轨迹并添加
                IAnimationTrack pAnimationTrack = CreateZoomOverLocationAnimation(globeDisplay, pBookmark3D);

                //播放轨迹
                IGlobe           globe           = globeDisplay.Globe;
                IAnimationTracks animationTracks = (IAnimationTracks)globe;
                //// Add Track
                //animationTracks.AddTrack(pAnimationTrack);
                // Only enable the track with the parsed name
                for (int i = 0; i <= animationTracks.TrackCount - 1; i++)
                {
                    IAnimationTrack animationTrackTest = (IAnimationTrack)animationTracks.Tracks.get_Element(i);
                    if (animationTrackTest.Name == pAnimationTrack.Name)
                    {
                        animationTrackTest.IsEnabled = true;
                    }
                    else
                    {
                        animationTrackTest.IsEnabled = false;
                    }
                }

                // Play Track
                System.DateTime dateTimeStart = DateTime.Now;
                double          doubleElapsed = 0;
                while (doubleElapsed <= doubleDuration)
                {
                    // Animation Viewer
                    animationTracks.ApplyTracks(globe.GlobeDisplay.ActiveViewer, doubleElapsed, doubleDuration);
                    globe.GlobeDisplay.ActiveViewer.Redraw(true);

                    // Get Elapsed Time
                    System.TimeSpan timeSpanElapsed = DateTime.Now.Subtract(dateTimeStart);
                    doubleElapsed = timeSpanElapsed.TotalSeconds;
                }

                // Display Last Frame (if slow viewer)
                animationTracks.ApplyTracks(globe.GlobeDisplay.ActiveViewer, 1d, 1d);

                #region 根据当前摄像机姿态决定应该为Global模式还是Local模式
                AutoSwitchGlobeCameraOrientationMode(globe);
                #endregion

                globe.GlobeDisplay.ActiveViewer.Redraw(true);

                // Remove Track
                animationTracks.RemoveTrack(pAnimationTrack);
            }
            catch { }
        }
Example #20
0
        private static ISectorNode GetSectorNode(IGlobe globe, IPerson person)
        {
            var sectorNode = globe.SectorNodes.SingleOrDefault(node => IsActorInSector(node, person));

            if (sectorNode is null)
            {
                return(null);
            }

            return(sectorNode);
        }
        private void GetGeographicCoordinates(IGlobe globe, int screenX, int screenY, ref double longitude, ref double latitude, ref double altitudeInKilometers)
        {
            IGlobeDisplay globeDisplay = globe.GlobeDisplay;

            ISceneViewer sceneViewer = globeDisplay.ActiveViewer;

            ICamera camera = globeDisplay.ActiveViewer.Camera;

            IGlobeViewUtil globeViewUtil = camera as IGlobeViewUtil;

            globeViewUtil.WindowToGeographic(globeDisplay, sceneViewer, screenX, screenY, true, out longitude, out latitude, out altitudeInKilometers);
        }
Example #22
0
        public BookmarkManager(ESRI.ArcGIS.Controls.AxGlobeControl axGlobeControl1)
        {
            globe = axGlobeControl1.Globe;
            ISceneBookmarks2 sceneBookmarks = globe as ISceneBookmarks2;

            m_BookmarkArray = sceneBookmarks.Bookmarks;
            for (int i = 0; i < sceneBookmarks.BookmarkCount; i++)
            {
                IBookmark3D pBookmark = new Bookmark3DClass();
                pBookmark = m_BookmarkArray.get_Element(i) as IBookmark3D;
            }
        }
Example #23
0
        private void GetGeographicCoordinates(IGlobe globe, int screenX, int screenY, ref double longitude, ref double latitude, ref double altitudeInKilometers)
        {
            IGlobeDisplay globeDisplay = globe.GlobeDisplay;

            ISceneViewer sceneViewer = globeDisplay.ActiveViewer;

            ICamera camera = globeDisplay.ActiveViewer.Camera;

            IGlobeViewUtil globeViewUtil = camera as IGlobeViewUtil;

            globeViewUtil.WindowToGeographic(globeDisplay, sceneViewer, screenX, screenY, true, out longitude, out latitude, out altitudeInKilometers);
        }
 public Fly()
 {
     globe = ArcGlobe.Globe;
     scene = globe as IScene;
     globeDisplay = globe.GlobeDisplay;
     camera = globeDisplay.ActiveViewer.Camera;
     globeCamera = camera as IGlobeCamera;
     theClock = new Microsoft.VisualBasic.Devices.Clock();
     flyCur = new System.Windows.Forms.Cursor(GetType().Assembly.GetManifestResourceStream("GlobeFlyTool.Fly.cur"));
     moveFlyCur = new System.Windows.Forms.Cursor(GetType().Assembly.GetManifestResourceStream("GlobeFlyTool.fly1.cur"));
     speed = 0;
 }
Example #25
0
        //放大至图层方法
        private void ZoomToGlobeLayer(IGlobe globe, int layerindex)
        {
            IGlobeDisplay globeDisplay = globe.GlobeDisplay;
            ISceneViewer  sceneViewer  = globeDisplay.ActiveViewer;
            ICamera       camera       = sceneViewer.Camera;
            IGlobeCamera  globeCamera  = camera as IGlobeCamera;
            IScene        scene        = globe as IScene;
            ILayer        layer        = scene.get_Layer(layerindex);
            IEnvelope     extent       = layer.AreaOfInterest.Envelope;

            globeCamera.SetToZoomToExtents(extent, globe, sceneViewer);
        }
        private static IPerson?GetAvailableFollowedPerson(IGlobe globe)
        {
            var followedPerson = globe.SectorNodes
                                 .Where(x => x.Sector != null)
                                 //Code smell. Because there are no ways to say that sector is not null.
                                 .Select(x => x.Sector !)
                                 .SelectMany(x => x.ActorManager.Items)
                                 .Select(x => x.Person)
                                 .FirstOrDefault(x => CheckFollowedFraction(x) && !x.CheckIsDead());

            return(followedPerson);
        }
Example #27
0
 public Fly()
 {
     globe        = ArcGlobe.Globe;
     scene        = globe as IScene;
     globeDisplay = globe.GlobeDisplay;
     camera       = globeDisplay.ActiveViewer.Camera;
     globeCamera  = camera as IGlobeCamera;
     theClock     = new Microsoft.VisualBasic.Devices.Clock();
     flyCur       = new System.Windows.Forms.Cursor(GetType().Assembly.GetManifestResourceStream("GlobeFlyTool.Fly.cur"));
     moveFlyCur   = new System.Windows.Forms.Cursor(GetType().Assembly.GetManifestResourceStream("GlobeFlyTool.fly1.cur"));
     speed        = 0;
 }
        /// <summary>
        /// 书签创建关键帧
        /// </summary>
        /// <param name="_pGlobe"></param>
        /// <param name="_pBook3D"></param>
        /// <returns></returns>
        public static IAGKeyframe CreateKeyframefromBook(IGlobe _pGlobe, IBookmark3D _pBook3D)
        {
            IScene _pScene = _pGlobe.GlobeDisplay.Scene;

            IAGAnimationContainer pAGAnimationContainer = _pScene as IAGAnimationContainer;
            IAGAnimationTracks pAGAnimationTracks = _pGlobe as IAGAnimationTracks;
            IAGAnimationUtils pAGAutils = new AGAnimationUtilsClass();
            ESRI.ArcGIS.Animation.IAGAnimationType pAGType = new AnimationTypeGlobeCameraClass();
            IAGKeyframe pGlobeKey = new GlobeCameraKeyframeClass();
            pAGAutils.KeyframeFromBookmark(pAGAnimationContainer, _pBook3D as ISpatialBookmark, out pGlobeKey);

            return pGlobeKey;
        }
        public Task StartAsync(IGlobe globe, IAutoplayContext context)
        {
            if (globe is null)
            {
                throw new ArgumentNullException(nameof(globe));
            }

            if (context is null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            return(StartInternalAsync(globe, context));
        }
Example #30
0
        /// <summary>
        /// 书签创建关键帧
        /// </summary>
        /// <param name="_pGlobe"></param>
        /// <param name="_pBook3D"></param>
        /// <returns></returns>
        public static IAGKeyframe CreateKeyframefromBook(IGlobe _pGlobe, IBookmark3D _pBook3D)
        {
            IScene _pScene = _pGlobe.GlobeDisplay.Scene;

            IAGAnimationContainer pAGAnimationContainer = _pScene as IAGAnimationContainer;
            IAGAnimationTracks    pAGAnimationTracks    = _pGlobe as IAGAnimationTracks;
            IAGAnimationUtils     pAGAutils             = new AGAnimationUtilsClass();

            ESRI.ArcGIS.Animation.IAGAnimationType pAGType = new AnimationTypeGlobeCameraClass();
            IAGKeyframe pGlobeKey = new GlobeCameraKeyframeClass();

            pAGAutils.KeyframeFromBookmark(pAGAnimationContainer, _pBook3D as ISpatialBookmark, out pGlobeKey);

            return(pGlobeKey);
        }
Example #31
0
        private void Form1_Load(object sender, EventArgs e)
        {
            m_Globe         = axGlobeControl1.Globe;
            m_GlobeDisplay  = m_Globe.GlobeDisplay;
            m_SceneView     = m_GlobeDisplay.ActiveViewer;
            m_GlobeViewUtil = axGlobeControl1.GlobeCamera as IGlobeViewUtil;

            IGlobeDisplayEvents_Event m_GlobeDisplayEvents = axGlobeControl1.Globe.GlobeDisplay as IGlobeDisplayEvents_Event;

            //将三维视图重绘事件委托给m_GlobeDisplayEvents_AfterDraw方法
            m_GlobeDisplayEvents.AfterDraw += new IGlobeDisplayEvents_AfterDrawEventHandler(m_GlobeDisplayEvents_AfterDraw);

            axMapControl1.Extent    = axMapControl1.FullExtent;
            comboBox1.SelectedIndex = 0;
        }
Example #32
0
        public void BindPerson(IGlobe globe, IPerson person)
        {
            if (globe is null)
            {
                throw new System.ArgumentNullException(nameof(globe));
            }

            if (person is null)
            {
                throw new System.ArgumentNullException(nameof(person));
            }

            Globe      = globe;
            MainPerson = person;
        }
Example #33
0
        private async Task ProcessInnerAsync(IGlobe globe, ISector sector, IActor actor, SectorTransition transition)
        {
            var sectorNode = transition.SectorNode;

            //TODO Разобраться с этим кодом.
            // https://blog.cdemi.io/async-waiting-inside-c-sharp-locks/
            //Asynchronously wait to enter the Semaphore. If no-one has been granted access to the Semaphore, code execution will proceed, otherwise this thread waits here until the semaphore is released
#pragma warning disable CA2007 // Consider calling ConfigureAwait on the awaited task
            await _semaphoreSlim.WaitAsync();

#pragma warning restore CA2007 // Consider calling ConfigureAwait on the awaited task
            try
            {
                if (sectorNode.State != SectorNodeState.SectorMaterialized)
                {
                    await _globeExpander.ExpandAsync(sectorNode).ConfigureAwait(false);

                    globe.AddSectorNode(sectorNode);
                }

                // It was used as fallback later.
                var oldActorNode = actor.Node;

                try
                {
                    sector.ActorManager.Remove(actor);
                }
                catch (InvalidOperationException exception)
                {
                    // Пока ничего не делаем
                    Console.WriteLine(exception);
                    Console.WriteLine(sector.GetHashCode());
                    Console.WriteLine(actor);
                }

                var nextSector = sectorNode.Sector;

                var transitionItem =
                    new TransitionPoolItem(actor.Person, actor.TaskSource, nextSector, sector, oldActorNode);
                _transitionPool.Push(transitionItem);
            }
            finally
            {
                //When the task is ready, release the semaphore. It is vital to ALWAYS release the semaphore when we are ready, or else we will end up with a Semaphore that is forever locked.
                //This is why it is important to do the Release within a try...finally clause; program execution may crash or take a different path, this way you are guaranteed execution
                _semaphoreSlim.Release();
            }
        }
Example #34
0
        private void PlayAnimation(double duration, int numCycles)
        {
            IGlobe           globe     = axGlobeControl1.Globe;
            IAnimationTracks tracks    = (IAnimationTracks)globe;
            IViewers3D       viewers3D = globe.GlobeDisplay;

            //exit if document doesn't contain animation..
            string sError;

            if (tracks.TrackCount == 0)
            {
                sError = m_AnimFilePath;
                if (sError == "")
                {
                    sError = "To get a Sample animation file, Developer Kit Samples need to be installed!";
                    System.Windows.Forms.MessageBox.Show("The current document doesn't contain animation file." + 0x000A + sError);
                }
                else
                {
                    System.Windows.Forms.MessageBox.Show("The current document doesn't contain animation file." + 0x000A + "Load " + m_AnimFilePath + @"\AnimationSample.aga for sample.");
                }
                return;
            }

            DateTime startTime;
            TimeSpan timeSpan;
            int      j;
            double   elapsedTime;

            for (int i = 1; i <= numCycles; i++)
            {
                startTime = DateTime.Now;
                j         = 0;
                do
                {
                    timeSpan    = (DateTime.Now).Subtract(startTime);
                    elapsedTime = timeSpan.TotalSeconds;
                    if (elapsedTime > duration)
                    {
                        elapsedTime = duration;
                    }
                    tracks.ApplyTracks(null, elapsedTime, duration);
                    viewers3D.RefreshViewers();
                    j = j + 1;
                }while (elapsedTime < duration);
            }
        }
Example #35
0
        private static void PrintReport(IGlobe globe)
        {
            var sectorNodesDiscoveredCount = globe.SectorNodes.Count();

            Console.WriteLine($"Sector Nodes Discovered: {sectorNodesDiscoveredCount}");

            var actorCount = globe.SectorNodes.SelectMany(x => x.Sector.ActorManager.Items).Count();

            Console.WriteLine($"Actors: {actorCount}");

            var fractions = globe.SectorNodes.SelectMany(x => x.Sector.ActorManager.Items)
                            .GroupBy(x => x.Person.Fraction);

            foreach (var fractionGroup in fractions)
            {
                Console.WriteLine($"Fraction {fractionGroup.Key.Name}: {fractionGroup.Count()}");
            }
        }
        private async Task ProcessInternalAsync(IGlobe globe, ISector sourceSector, IActor actor,
                                                SectorTransition transition)
        {
            var sectorNode = transition.SectorNode;

            await _semaphoreSlim.WaitAsync().ConfigureAwait(false);

            try
            {
                if (sectorNode.State != SectorNodeState.SectorMaterialized)
                {
                    await _globeExpander.ExpandAsync(sectorNode).ConfigureAwait(false);

                    globe.AddSectorNode(sectorNode);
                }

                // It was used as fallback later.
                var oldActorNode = actor.Node;

                sourceSector.ActorManager.Remove(actor);

                var targetSector = sectorNode.Sector;

                if (targetSector is null)
                {
                    throw new InvalidOperationException();
                }

                var transitionItem = new TransitionPoolItem(
                    actor.Person,
                    actor.TaskSource,
                    targetSector,
                    sourceSector,
                    oldActorNode);
                _transitionPool.Push(transitionItem);
            }
            finally
            {
                //When the task is ready, release the semaphore. It is vital to ALWAYS release the semaphore when we are ready, or else we will end up with a Semaphore that is forever locked.
                //This is why it is important to do the Release within a try...finally clause; program execution may crash or take a different path, this way you are guaranteed execution
                _semaphoreSlim.Release();
            }
        }
 public static void AutoSwitchGlobeCameraOrientationMode(IGlobe pGlobe)
 {
     try
     {
         ESRI.ArcGIS.Analyst3D.ISceneViewer sceneViewer = pGlobe.GlobeDisplay.ActiveViewer;
         ESRI.ArcGIS.Analyst3D.ICamera camera = sceneViewer.Camera;
         ESRI.ArcGIS.GlobeCore.IGlobeCamera globeCamera = (ESRI.ArcGIS.GlobeCore.IGlobeCamera)camera;
         double xTarget;
         double yTarget;
         ESRI.ArcGIS.Geometry.IPoint targetCls = (globeCamera as ICamera).Target;
         targetCls.QueryCoords(out xTarget, out yTarget);
         double zTarget = targetCls.Z;
         // Calculate the current azimuth and inclination of the camera.
         //azimuth = Math.Atan2(xTarget, yTarget) * 180 / Math.PI;
         double inclination = (180 / Math.PI) * (Math.Asin(zTarget / Math.Sqrt(xTarget * xTarget + yTarget * yTarget + zTarget * zTarget))) - 10.0;
         if (inclination > 88 | inclination < -88 | double.IsNaN(inclination))
         {
             double targetLatitude;
             double targetLongitude;
             double targetAltitude;
             globeCamera.GetTargetLatLonAlt(out targetLatitude, out targetLongitude, out targetAltitude);
             double observerLatitude;
             double obsLongitude;
             double obsAltitude;
             globeCamera.GetObserverLatLonAlt(out observerLatitude, out obsLongitude, out obsAltitude);
             //// Set the GlobeCamera to global navigation mode.
             globeCamera.OrientationMode = ESRI.ArcGIS.GlobeCore.esriGlobeCameraOrientationMode.esriGlobeCameraOrientationGlobal;
             globeCamera.NavigationType = ESRI.ArcGIS.GlobeCore.esriGlobeNavigationType.esriGlobeNavigationAttached;
             globeCamera.SetObserverLatLonAlt(targetLatitude, targetLongitude, obsAltitude);
         }
         else
         {
             globeCamera.OrientationMode = ESRI.ArcGIS.GlobeCore.esriGlobeCameraOrientationMode.esriGlobeCameraOrientationLocal;
             globeCamera.NavigationType = ESRI.ArcGIS.GlobeCore.esriGlobeNavigationType.esriGlobeNavigationFree;
         }
     }
     catch { }
 }
 public GeographicCoordinates(IGlobe globe, int screenX, int screenY)
 {
     GetGeographicCoordinates(globe, screenX, screenY, ref _longitude, ref _latitude, ref _altitudeInKilometers);
 }
        /// <summary>
        /// 内插中间贞函数,只需给出第一帧和最后一帧的状态信息,即可内插出中间帧状态
        /// </summary>
        /// <param name="pGlobe"></param>
        /// <param name="doubleX1_Tar">第一帧目标点X坐标</param>
        /// <param name="doubleY1_Tar">第一帧目标点Y坐标</param>
        /// <param name="doubleZ1_Tar">第一帧目标点Z坐标</param>
        /// <param name="doubleX1_Obs">第一帧观察点X坐标</param>
        /// <param name="doubleY1_Obs">第一帧观察点Y坐标</param>
        /// <param name="doubleZ1_Obs">第一帧观察点Z坐标</param>
        /// <param name="doubleX2_Tar">第二帧目标点X坐标</param>
        /// <param name="doubleY2_Tar">第二帧目标点Y坐标</param>
        /// <param name="doubleZ2_Tar">第二帧目标点Z坐标</param>
        /// <param name="doubleX2_Obs">第二帧观察点X坐标</param>
        /// <param name="doubleY2_Obs">第二帧观察点Y坐标</param>
        /// <param name="doubleZ2_Obs">第二帧观察点Z坐标</param>
        /// <returns></returns>
        private static IKeyframe CreateMiddleKeyframe(IGlobe pGlobe, double doubleX1_Tar, double doubleY1_Tar, double doubleZ1_Tar,
                                                                    double doubleX1_Obs, double doubleY1_Obs, double doubleZ1_Obs,
                                                                    double doubleX2_Tar, double doubleY2_Tar, double doubleZ2_Tar,
                                                                    double doubleX2_Obs, double doubleY2_Obs, double doubleZ2_Obs)
        {
            IUnitConverter unitConverter = new UnitConverterClass();
            IGlobeDisplayRendering globeDisplayRendering = (IGlobeDisplayRendering)pGlobe.GlobeDisplay;
            IKeyframe pMidKeyframe = new GlobeCameraKeyframeClass();
            try
            {
                pMidKeyframe.set_PropertyValueInt(0, 0);
                pMidKeyframe.set_PropertyValueDouble(1, (doubleY1_Tar + doubleY2_Tar) / 2);//doubleY_mid);
                pMidKeyframe.set_PropertyValueDouble(2, (doubleX1_Tar + doubleX2_Tar) / 2);//doubleX_mid);
                pMidKeyframe.set_PropertyValueDouble(3, (doubleZ1_Tar + doubleZ2_Tar) / 2); //doubleZ1_Tar/2);//// (globeDisplayRendering.GlobeRadius / -1000));
                pMidKeyframe.set_PropertyValueDouble(4, (doubleY1_Obs + doubleY2_Obs) / 2);//doubleY_mid);
                pMidKeyframe.set_PropertyValueDouble(5, (doubleX1_Obs + doubleX2_Obs) / 2);//doubleX_mid);
                //改善中间过程用户体验,增加中间点Observer的高度,让高度约等于两点间距离+海拔高度
                double doubleAltitide_mid = ReturnProjectDistance(pGlobe, doubleX1_Obs, doubleY1_Obs, doubleZ1_Obs, doubleX2_Obs, doubleY2_Obs, doubleZ2_Obs) / 1000; //KM
                //加入地表高程
                doubleAltitide_mid += GetGlobeElevation(pGlobe.GlobeDisplay, (doubleX1_Obs + doubleX2_Obs) / 2, (doubleY1_Obs + doubleY2_Obs) / 2, true);

                pMidKeyframe.set_PropertyValueDouble(6, doubleAltitide_mid);
                pMidKeyframe.set_PropertyValueDouble(7, 30);
                pMidKeyframe.set_PropertyValueDouble(8, 0);
            }
            catch { }
            return pMidKeyframe;
        }
        public static double ReturnProjectDistance(IGlobe pGlobe, double dFromX, double dFromY, double dFromZ, double dToX, double dToY, double dToZ)
        {
            IPoint pPnt1 = new Point();
            IPoint pPnt2 = new Point();
            pPnt1.X = dFromX;
            pPnt1.Y = dFromY;
            MakeZAware(pPnt1);
            pPnt1.Z = dFromZ * 1000;
            pPnt1.SpatialReference = pGlobe.GlobeDisplay.Scene.SpatialReference;
            if (pPnt1.SpatialReference is IGeographicCoordinateSystem)
            {
                pPnt1 = ProjectGeometry(pPnt1) as IPoint;
            }

            pPnt2.X = dToX;
            pPnt2.Y = dToY;
            MakeZAware(pPnt2);
            pPnt2.Z = dToZ * 1000;
            pPnt2.SpatialReference = pGlobe.GlobeDisplay.Scene.SpatialReference;
            if (pPnt2.SpatialReference is IGeographicCoordinateSystem)
            {
                pPnt2 = ProjectGeometry(pPnt2) as IPoint;
            }

            IProximityOperator3D pProximityOperator3D = pPnt1 as IProximityOperator3D;
            return pProximityOperator3D.ReturnDistance3D(pPnt2);
        }
		public VerticalExaggerationPlayer(IGlobe globe) : base(globe) {}
Example #42
0
		public LatLonGridPlayer(IGlobe globe) : base(globe) {}
Example #43
0
		public TogglePlayerBase(IGlobe globe) : base(globe)
		{
		}
Example #44
0
		public LayersPlayer(IGlobe globe) : base(globe)
		{
		}
Example #45
0
        //按预订的路径飞行
        public bool InitAnimationPlay(AxGlobeControl _axGlobeControl, string _FlyPathName, string FlyFoldPath,
            int _FlySpeedRating,bool _IsFlyLoop,bool _IsFlyLookdown)
        {
            bool IsFoundPolyline = true;    //是否能找到对应的Polyline
            try
            {
                scene = _axGlobeControl.GlobeDisplay.Scene;
                globe = _axGlobeControl.Globe;
                IBasicScene2 basicScene = (IBasicScene2)globe;
                pAgAnimationUtils = new AGAnimationUtilsClass();
                //按路径飞行
                ILayer layer = getLayerByName(scene, ANIMATIONPATH_LayerName);
                if (layer == null)
                {
                    IsFoundPolyline = false;
                    return IsFoundPolyline;
                }
                FlyPathPolyline = getPolylineFromLayer(layer, _FlyPathName);
                if (FlyPathPolyline == null)
                {
                    IsFoundPolyline = false;
                    return IsFoundPolyline;
                }
                //启用三维线
                IZAware flyPathZAware = (IZAware)FlyPathPolyline;
                flyPathZAware.ZAware = true;

                pAnimationExtension = basicScene.AnimationExtension;
                CreateAnimationFromPath(globe, FlyPathPolyline, FlySpeedRating, IsFlyLoop, IsFlyLookdown);

                //配置飞行
                //InitAnimationParameters();

                //IAGAnimationContainer pContainer = pAnimationExtension.AnimationTracks.AnimationObjectContainer;
                //pAgAnimationUtils.LoadAnimationFile(pContainer, FlyFilePath);//值不在预期的范围内;
                animPlayer = (IAGAnimationPlayer)pAgAnimationUtils;
            }
            catch
            { }
            return IsFoundPolyline;
        }
		public ViewDirectionPlayer(IGlobe globe) : base(globe) {}
 public TableOfContents(IGlobe globe)
 {
     _scene = GetScene(globe);
 }
Example #48
0
		protected PlayerBase(IGlobe globe)
		{
			this.globe = globe;
		}
		public void SetVariables(IGlobe pGlobe)
		{
			globe = pGlobe;
		}
Example #50
0
		public WmsImagePlayer(IGlobe globe) : base(globe) {}
Example #51
0
        //int _pType,, double _pDuration)
        /// <summary>
        ///第三个参数是移动的方式,其中1表示移动观察者,2表示移动目标,其他表示两个都移动
        /// </summary>
        /// <param name="_pScene">_pGlobe</param>
        /// <param name="_pPolyline">_pPolyline</param>
        /// <param name="_pType">_pType</param>
        public void CreateAnimationFromPath(IGlobe _pGlobe, IPolyline _pPolyline, int _FlySpeedRating, bool _IsFlyLoop, bool _IsFlyLookdown)
        {
            try
            {
                #region //esri写的
                scene = _pGlobe.GlobeDisplay.Scene;
                // 获取动画扩展对象
                //ESRI.ArcGIS.Analyst3D.IBasicScene2 pBasicScene2 = (ESRI.ArcGIS.Analyst3D.IBasicScene2)_pScene; // Explicit Cast
                //ESRI.ArcGIS.Animation.IAnimationExtension pAnimationExtension = pBasicScene2.AnimationExtension;
                //创建两个对象,一个用于导入路径,一个用于播放
                //ESRI.ArcGIS.Animation.IAGAnimationUtils pAGAnimationUtils = new ESRI.ArcGIS.Animation.AGAnimationUtilsClass();
                pAGImportPathOptions = new ESRI.ArcGIS.Animation.AGImportPathOptionsClass();
                // 设置参数
                //参数设置不正确会出错,尤其是类型,对象等信息!
                pAGImportPathOptions.BasicMap = (ESRI.ArcGIS.Carto.IBasicMap)scene;
                pAGImportPathOptions.AnimationTracks = (ESRI.ArcGIS.Animation.IAGAnimationTracks)scene;
                // pAGImportPathOptions.AnimationType = new ESRI.ArcGIS.GlobeCore.AnimationTypeCameraClass();    //在Globe中不能用这个
                pAGImportPathOptions.AnimationType = new AnimationTypeGlobeCameraClass();
                pAGImportPathOptions.LookaheadFactor = 1;
                pAGImportPathOptions.PutAngleCalculationMethods(esriPathAngleCalculation.esriAngleAddRelative,
                        esriPathAngleCalculation.esriAngleAddRelative,
                        esriPathAngleCalculation.esriAngleAddRelative);
                //pAGImportPathOptions.AnimatedObject = _pScene.SceneGraph.ActiveViewer.Camera; //在Globe中不能用这个
                pAGImportPathOptions.AnimatedObject = _pGlobe.GlobeDisplay.ActiveViewer.Camera;
                pAGImportPathOptions.PathGeometry = _pPolyline;
                //俯视飞行
                if (_IsFlyLoop)
                {
                    pAGImportPathOptions.ConversionType = ESRI.ArcGIS.Animation.esriFlyFromPathType.esriFlyFromPathObserver;//观察者移动
                }
                else   //正常飞行
                {
                    pAGImportPathOptions.ConversionType = ESRI.ArcGIS.Animation.esriFlyFromPathType.esriFlyFromPathObsAndTarget;//都移动
                }
                //else
                //{
                //    pAGImportPathOptions.ConversionType = ESRI.ArcGIS.Animation.esriFlyFromPathType.esriFlyFromPathTarget;
                //}
                pAGImportPathOptions.LookaheadFactor = 1;
                pAGImportPathOptions.RollFactor = 0;
                pAGImportPathOptions.AnimationEnvironment = pAnimationExtension.AnimationEnvironment;

                //
                //InitAnimationParameters();

                //持续时间
                double FlyPathLength = FlyPathPolyline.Length;
                double flyDuration = FlyPathLength *500 /_FlySpeedRating; //飞行路线长度*300*飞行速度等级/中速等级
                FlyDurationTime = flyDuration;  //记录飞行时间
                pAnimationExtension.AnimationEnvironment.AnimationDuration = flyDuration;
                pAnimationExtension.AnimationEnvironment.IsIntervalPlay = false;
                pAnimationExtension.AnimationEnvironment.PlayMode = esriAnimationPlayMode.esriAnimationPlayOnceForward;
                pAnimationExtension.AnimationEnvironment.PlayTime = pAnimationExtension.AnimationEnvironment.AnimationDuration;

                //IAGAnimationEnvironment pAGAeviroment = new AGAnimationEnvironmentClass();
                ESRI.ArcGIS.Animation.IAGAnimationContainer AGAnimationContainer = pAnimationExtension.AnimationTracks.AnimationObjectContainer;

                // 创建飞行路线类似ArcGlobe中的Import,通过ArcGlobe学习ArcGlobe开发!
                pAgAnimationUtils.CreateFlybyFromPath(AGAnimationContainer, pAGImportPathOptions);

                //该接口相当于播放的界面,可以自己做一个界面
                animPlayer = pAgAnimationUtils as IAGAnimationPlayer;
                //animPlayer.PlayAnimation(_pScene as IAGAnimationTracks, pAGAeviroment, null); //开始飞行
                #endregion
            }
            catch
            { }
            #region //用改变观察者和观察点的方式
            //if (this.m_pScene.AreaOfInterest == null)
            //    return;
            //// Explicit Cast
            //IBasicScene2 basicScene2 = (IBasicScene2)_pGlobe;
            //m_pAnimationExtension = basicScene2.AnimationExtension;

            //m_pAgAnimationUtils = new AGAnimationUtilsClass();
            //IAGImportPathOptions agImportPathOptions = new AGImportPathOptionsClass();

            //agImportPathOptions.AnimationEnvironment = m_pAnimationExtension.AnimationEnvironment;
            //IAGAnimationContainer AGAnimationContainer = m_pAnimationExtension.AnimationTracks.AnimationObjectContainer;

            //if (AGAnimationContainer != null)
            //{
            //    m_pAgAnimationUtils.CreateFlybyFromPath(AGAnimationContainer, agImportPathOptions);
            //}
            #endregion
        }
		public ViewPositionPlayer(IGlobe globe) : base(globe)
		{
		}
Example #53
0
        private static void PlayAnimationTrack(double duration, int numCycles, string FlyFilePath, IGlobe globe, GISFunction.SceneBookmark pSceneBookmark)
        {
            try
            {
                IAnimationTracks tracks = (IAnimationTracks)globe;
                IViewers3D viewers3D = globe.GlobeDisplay;

                //exit if document doesn't contain animation..
                string sError;
                if (tracks.TrackCount == 0)
                {
                    sError = FlyFilePath;
                    if (sError == "")
                    {
                        sError = "飞行路径文件可能丢失,请确保程序的完整性";
                        System.Windows.Forms.MessageBox.Show(sError, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        System.Windows.Forms.MessageBox.Show("加载飞行文件失败,请尝试重新安装程序。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    return;
                }

                DateTime startTime;
                TimeSpan timeSpan;
                int j;
                double elapsedTime;

                for (int i = 1; i <= numCycles; i++)
                {
                    startTime = DateTime.Now;
                    j = 0;
                    do
                    {
                        timeSpan = (DateTime.Now).Subtract(startTime);
                        elapsedTime = timeSpan.TotalSeconds;
                        if (elapsedTime > duration) elapsedTime = duration;
                        tracks.ApplyTracks(null, elapsedTime, duration);
                        viewers3D.RefreshViewers();
                        j = j + 1;
                    }
                    while (elapsedTime < duration);
                }
                //if(FlyFilePath.Length>4)
                //{

                //    int index = FlyFilePath.IndexOf("飞行");
                //    int indexFlyPath = FlyFilePath.IndexOf("FlyPath");
                //    if (index > 0&&indexFlyPath>0)
                //    {
                //        string cityName = FlyFilePath.Substring(indexFlyPath + 8, index - indexFlyPath-8);
                //        pSceneBookmark.ZoomToScene(cityName);
                //    }
                //}
            }
            catch
            { }
        }
		public DisplayMessagesPlayer(IGlobe globe) : base(globe) {}