Ejemplo n.º 1
0
        /// <summary>
        /// Trigger to update stream.
        /// </summary>
        public void Trigger()
        {
            if ((IsBusy) || (!IsInit))
            {
                return;
            }

            var startTime = DateTime.Now;

            IsBusy             = true;
            GSA.Settings.Units = GSA.gsaProxy.GetUnits();

            //Clear previously-sent objects
            GSA.ClearSenderDictionaries();

            // Read objects
            var currentBatch = new List <Type>();

            bool changeDetected = false;

            do
            {
                ExecuteWithLock(ref traversedSerialisedLock, () =>
                {
                    currentBatch = FilteredReadTypePrereqs.Where(i => i.Value.Count(x => !traversedSerialisedTypes.Contains(x)) == 0).Select(i => i.Key).ToList();
                    currentBatch.RemoveAll(i => traversedSerialisedTypes.Contains(i));
                });

#if DEBUG
                foreach (var t in currentBatch)
                {
                    ProcessTypeForSending(t, ref changeDetected);
                }
#else
                Parallel.ForEach(currentBatch, t =>
                {
                    ProcessTypeForSending(t, ref changeDetected);
                }
                                 );
#endif
            } while (currentBatch.Count > 0);

            if (!changeDetected)
            {
                Status.ChangeStatus("Finished sending", 100);
                IsBusy = false;
                return;
            }

            // Separate objects into streams
            var streamBuckets = CreateStreamBuckets();

            TimeSpan duration = DateTime.Now - startTime;
            Status.AddMessage("Duration of conversion to Speckle: " + duration.ToString(@"hh\:mm\:ss"));
            startTime = DateTime.Now;

            // Send package
            Status.ChangeStatus("Sending to Server");

            foreach (var k in streamBuckets.Keys)
            {
                Status.ChangeStatus("Sending to stream: " + Senders[k].StreamID);

                var title      = GSA.gsaProxy.GetTitle();
                var streamName = GSA.Settings.SeparateStreams ? title + "." + k : title;

                Senders[k].UpdateName(streamName);
                Senders[k].SendGSAObjects(streamBuckets[k]);
            }

            duration = DateTime.Now - startTime;
            Status.AddMessage("Duration of sending to Speckle: " + duration.ToString(@"hh\:mm\:ss"));

            IsBusy = false;
            Status.ChangeStatus("Finished sending", 100);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Trigger to update stream.
        /// </summary>
        public async Task Trigger()
        {
            if ((IsBusy) || (!IsInit))
            {
                return;
            }

            IsBusy = true;
            //GSA.App.Settings.Units = GSA.App.Proxy.GetUnits();

            #region update_cache
            var startTime = DateTime.Now;
            statusProgress.Report("Reading GSA data into cache");

            var txTypePrereqs = GSA.TxTypeDependencies;

            //Update cache
            var updatedCache = UpdateCache();
            if (!updatedCache)
            {
                this.loggingProgress.Report(new MessageEventArgs(SpeckleGSAInterfaces.MessageIntent.Display, SpeckleGSAInterfaces.MessageLevel.Error, "Error in communicating GSA - please check if the GSA file has been closed down"));
                return;
            }

            TimeSpan duration = DateTime.Now - startTime;
            loggingProgress.Report(new MessageEventArgs(SpeckleGSAInterfaces.MessageIntent.Display, SpeckleGSAInterfaces.MessageLevel.Information, "Duration of reading GSA model into cache: " + duration.ToString(@"hh\:mm\:ss")));
            loggingProgress.Report(new MessageEventArgs(SpeckleGSAInterfaces.MessageIntent.Telemetry, SpeckleGSAInterfaces.MessageLevel.Information, "send", "update-cache", "duration", duration.ToString(@"hh\:mm\:ss")));
            #endregion

            #region GSA_model_to_SpeckleObjects
            startTime = DateTime.Now;

            //Clear previously-sent objects
            GSA.ClearSenderDictionaries();

            lock (traversedSerialisedLock)
            {
                traversedSerialisedTypes.Clear();
            }

            var changeDetected = ProcessTxObjects();

            if (!changeDetected)
            {
                statusProgress.Report("No new or changed objects to send");
                IsBusy = false;
                return;
            }

            duration = DateTime.Now - startTime;
            loggingProgress.Report(new MessageEventArgs(SpeckleGSAInterfaces.MessageIntent.Display, SpeckleGSAInterfaces.MessageLevel.Information, "Duration of conversion to Speckle: " + duration.ToString(@"hh\:mm\:ss")));
            loggingProgress.Report(new MessageEventArgs(SpeckleGSAInterfaces.MessageIntent.Telemetry, SpeckleGSAInterfaces.MessageLevel.Information, "send", "conversion", "duration", duration.ToString(@"hh\:mm\:ss")));
            #endregion

            #region create_necessary_streams
            startTime = DateTime.Now;

            // Separate objects into streams
            var allBuckets = CreateStreamBuckets();

            var bucketsToCreate = allBuckets.Keys.Except(Senders.Keys).ToList();

            //TO DO: review this, possibly move to the kit
            if (GSA.GsaApp.Settings.StreamSendConfig == StreamContentConfig.TabularResultsOnly && bucketsToCreate.Contains("results"))
            {
                bucketsToCreate = new List <string> {
                    "results"
                };
            }

            //Now check if any streams need to be created
            if (bucketsToCreate.Count() > 0)
            {
                Progress <int> incrementProgress = new Progress <int>();
                incrementProgress.ProgressChanged += IncorporateSendPayloadProgress;
                Progress <int> totalProgress = new Progress <int>();
                totalProgress.ProgressChanged += IncorporateNewNumPayloadsProgress;

                if (savedSenderSidRecords != null && savedSenderSidRecords.Count() > 0)
                {
                    var sidRecordByBucket = savedSenderSidRecords.ToDictionary(r => r.Bucket, r => r);

                    var savedBuckets       = sidRecordByBucket.Keys.ToList();
                    var reuseBuckets       = sidRecordByBucket.Keys.Where(ssn => bucketsToCreate.Any(sn => ssn.Equals(sn, StringComparison.InvariantCultureIgnoreCase))).ToList();
                    var discardStreamNames = sidRecordByBucket.Keys.Except(reuseBuckets);
                    foreach (var bucket in reuseBuckets)
                    {
                        var sender      = gsaSenderCreator(restApi, apiToken);
                        var initialised = await sender.InitializeSender(documentName, sidRecordByBucket[bucket].StreamId, sidRecordByBucket[bucket].ClientId, totalProgress, incrementProgress);

                        if (initialised)
                        {
                            Senders.Add(bucket, sender);

                            bucketsToCreate.Remove(bucket);
                        }
                    }
                    foreach (var dsn in discardStreamNames)
                    {
                        streamDeletionProgress.Report(sidRecordByBucket[dsn]);
                    }
                }

                foreach (var sn in bucketsToCreate)
                {
                    var streamName = string.IsNullOrEmpty(documentTitle) ? "GSA " + sn : documentTitle + " (" + sn + ")";

                    var sender      = gsaSenderCreator(restApi, apiToken);
                    var initialised = await sender.InitializeSender(documentName, streamName, basePropertyUnits, tolerance, angleTolerance, totalProgress, incrementProgress);

                    if (initialised)
                    {
                        Senders.Add(sn, sender);
                        streamCreationProgress.Report(new SidSpeckleRecord(Senders[sn].StreamId, sn, Senders[sn].ClientId, streamName));
                    }
                }
            }

            #endregion

            #region send_to_server
            // Send package
            statusProgress.Report("Sending to Server");

            int numErrors    = 0;
            var sendingTasks = new List <Task>();
            foreach (var k in Senders.Keys)
            {
                statusProgress.Report("Sending to stream: " + Senders[k].StreamId);
                numErrors += Senders[k].SendObjects(allBuckets[k]);
            }

            if (numErrors > 0)
            {
                loggingProgress.Report(new MessageEventArgs(SpeckleGSAInterfaces.MessageIntent.Display, SpeckleGSAInterfaces.MessageLevel.Error,
                                                            numErrors + " errors found with sending to the server. Refer to the .txt log file(s) in " + AppDomain.CurrentDomain.BaseDirectory));
            }

            duration = DateTime.Now - startTime;
            loggingProgress.Report(new MessageEventArgs(SpeckleGSAInterfaces.MessageIntent.Display, SpeckleGSAInterfaces.MessageLevel.Information, "Duration of sending to Speckle: " + duration.ToString(@"hh\:mm\:ss")));
            loggingProgress.Report(new MessageEventArgs(SpeckleGSAInterfaces.MessageIntent.Telemetry, SpeckleGSAInterfaces.MessageLevel.Information, "send", "sending", "duration", duration.ToString(@"hh\:mm\:ss")));
            #endregion
            IsBusy = false;
            statusProgress.Report("Finished sending");
        }