Beispiel #1
0
        /// <summary>
        /// Repeatedly check database status and raise
        /// external event when updates are pending.
        /// Relinquish control and wait for timeout
        /// period between each attempt. Run in a
        /// separate thread.
        /// </summary>
        static void CheckForPendingDatabaseChanges()
        {
            while (null != _event)
            {
                ++_nLoopCount;

                Debug.Assert(null != _event,
                             "expected non-null external event");

                if (null != _event)
                {
                    break;
                }

                if (_event.IsPending)
                {
                    Util.Log(string.Format(
                                 "CheckForPendingDatabaseChanges loop {0} - "
                                 + "database update event is pending",
                                 _nLoopCount));
                }
                else
                {
                    using (JtTimer pt = new JtTimer(
                               "CheckForPendingDatabaseChanges"))
                    {
                        ++_nCheckCount;

                        Util.Log(string.Format(
                                     "CheckForPendingDatabaseChanges loop {0} - "
                                     + "check for changes {1}",
                                     _nLoopCount, _nCheckCount));

                        RoomEditorDb rdb = new RoomEditorDb();

                        if (rdb.LastSequenceNumberChanged(
                                DbUpdater.LastSequence))
                        {
                            _event.Raise();

                            ++_nUpdatesRequested;

                            Util.Log(string.Format(
                                         "database update pending event raised {0} times",
                                         _nUpdatesRequested));

                            #region Obsolete attempts that failed
                            // Move the mouse in case the user does
                            // not. Otherwise, it may take a while
                            // before Revit forwards the event Raise
                            // to the event handler Execute method.

                            // Just moving the mouse is not enough:

                            //System.Drawing.Point p = Cursor.Position;
                            //Cursor.Position = new System.Drawing
                            //  .Point( p.X + 1, p.Y );
                            //Cursor.Position = p;

                            // This did not work either:

                            //[DllImport( "user32.dll" )]
                            //static extern IntPtr SetFocus(
                            //  IntPtr hwnd );

                            //IWin32Window revit_window
                            //  = new JtWindowHandle(
                            //    ComponentManager.ApplicationWindow );
                            //IntPtr hwnd = SetFocus( revit_window.Handle );
                            //IntPtr hwnd2 = SetFocus( hwnd );
                            //Debug.Print( "set to rvt {0} --> {1} --> {2}",
                            //  revit_window.Handle, hwnd, hwnd2 );

                            // Try SendKeys?
                            #endregion // Obsolete attempts that failed

                            // Set focus to Revit for a moment.
                            // Otherwise, it may take a while before
                            // Revit forwards the event Raise to the
                            // event handler Execute method.

                            IntPtr hBefore = GetForegroundWindow();

                            SetForegroundWindow(
                                ComponentManager.ApplicationWindow);

                            SetForegroundWindow(hBefore);
                        }
                    }
                }

                // Wait a moment and relinquish control before
                // next check for pending database updates.

                Thread.Sleep(_timeout);
            }
        }
Beispiel #2
0
        /// <summary>
        /// Wait far a moment before requerying database.
        /// </summary>
        //static Stopwatch _stopwatch = null;

        void OnIdling(
            object sender,
            IdlingEventArgs ea)
        {
            using (JtTimer pt = new JtTimer("OnIdling"))
            {
                // Use with care! This loads the CPU:

                ea.SetRaiseWithoutDelay();

                ++_counter;

                if (0 == (_counter % _update_interval))
                {
                    if (0 == (_counter % _message_interval))
                    {
                        Util.Log(string.Format(
                                     "OnIdling called {0} times",
                                     _counter));
                    }

                    // Have we waited long enough since the last attempt?

                    //if( null == _stopwatch
                    //  || _stopwatch.ElapsedMilliseconds > 500 )

                    RoomEditorDb rdb = new RoomEditorDb();
                    //int n = rdb.LastSequenceNumber;

                    if (rdb.LastSequenceNumberChanged(
                            DbUpdater.LastSequence))
                    {
                        UIApplication uiapp = sender as UIApplication;
                        Document      doc   = uiapp.ActiveUIDocument.Document;

                        Util.Log("furniture update begin");

                        //FilteredElementCollector rooms
                        //  = new FilteredElementCollector( doc )
                        //    .OfClass( typeof( SpatialElement ) )
                        //    .OfCategory( BuiltInCategory.OST_Rooms );

                        //IEnumerable<string> roomUniqueIds
                        //  = rooms.Select<Element, string>(
                        //    e => e.UniqueId );

                        //CouchDatabase db = rdb.Db;

                        //ChangeOptions opt = new ChangeOptions();

                        //opt.IncludeDocs = true;
                        //opt.Since = CmdUpdate.LastSequence;
                        //opt.View = "roomedit/map_room_to_furniture";

                        //CouchChanges<DbFurniture> changes
                        //  = db.GetChanges<DbFurniture>( opt );

                        //CouchChangeResult<DbFurniture>[] results
                        //  = changes.Results;

                        //DbUpdater updater = new DbUpdater(
                        //  doc, roomUniqueIds );

                        //foreach( CouchChangeResult<DbFurniture> result
                        //  in results )
                        //{
                        //  updater.UpdateBimFurniture( result.Doc );

                        //  CmdUpdate.LastSequence = result.Sequence;
                        //}

                        DbUpdater updater = new DbUpdater(uiapp);

                        updater.UpdateBim();

                        Util.Log("furniture update end");

                        //  _stopwatch = new Stopwatch();
                        //  _stopwatch.Start();
                        //}
                        //catch( Exception ex )
                        //{
                        //  //uiapp.Application.WriteJournalComment

                        //  Debug.Print(
                        //    "Room Editor: an error occurred "
                        //    + "executing the OnIdling event:\r\n"
                        //    + ex.ToString() );

                        //  Debug.WriteLine( ex );
                        //}
                    }
                }
            }
        }