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