/// <summary> /// Open a GSA file. /// </summary> private void OpenGSAFile(object sender, RoutedEventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); if (openFileDialog.ShowDialog() == true) { (SenderTab.Content as Grid).IsEnabled = false; (ReceiverTab.Content as Grid).IsEnabled = false; Status.ChangeStatus("Opening File"); Task.Run(() => GSA.OpenFile(openFileDialog.FileName, EmailAddress, RestApi)).ContinueWith( delegate { try { FileOpened = true; Application.Current.Dispatcher.BeginInvoke( DispatcherPriority.Background, new Action(() => { UpdateClientLists(); (SenderTab.Content as Grid).IsEnabled = FileOpened && LoggedIn; (ReceiverTab.Content as Grid).IsEnabled = FileOpened && LoggedIn; Status.ChangeStatus("Ready", 0); } )); } catch { Status.ChangeStatus("Failed to open file", 0); } }); } }
/// <summary> /// 编译 /// </summary> public int compile() { if (source != null && SA != null && ST != null && EH != null && GSA != null && PCG != null) { GSA.analysis(); return(1); } return(0); }
public void CLIReceiver() { if (!arguments.ContainsKey("streamIDs")) { Console.WriteLine("Missing -streamIDs argument"); return; } var streamIds = arguments["streamIDs"].Split(new char[] { ',' }); foreach (string id in streamIds) { GSA.ReceiverInfo.Add(new Tuple <string, string>(id, null)); } GSA.SetSpeckleClients(EmailAddress, RestApi); if (arguments.ContainsKey("layer")) { if (arguments["layer"].ToLower() == "analysis") { GSA.Settings.TargetLayer = GSATargetLayer.Analysis; } } if (arguments.ContainsKey("nodeAllowance")) { try { GSA.Settings.CoincidentNodeAllowance = Convert.ToDouble(arguments["nodeAllowance"]); } catch { } } GSA.GetSpeckleClients(EmailAddress, RestApi); var gsaReceiver = new Receiver(); Task.Run(() => { var nonBlankReceivers = GSA.ReceiverInfo.Where(r => !string.IsNullOrEmpty(r.Item1)).ToList(); foreach (var streamInfo in nonBlankReceivers) { Status.AddMessage("Creating receiver " + streamInfo.Item1); gsaReceiver.Receivers[streamInfo.Item1] = new SpeckleGSAReceiver(RestApi, ApiToken); } }); Task.Run(() => gsaReceiver.Initialize(RestApi, ApiToken)).Wait(); GSA.SetSpeckleClients(EmailAddress, RestApi); gsaReceiver.Trigger(null, null); gsaReceiver.Dispose(); GSA.gsaProxy.SaveAs(arguments["file"]); GSA.Close(); Console.WriteLine("Receiving complete"); }
private void Application_Startup(object sender, StartupEventArgs e) { CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture; if (e.Args.Length == 0) { MainWindow wnd = new MainWindow(); wnd.Show(); } else { AttachConsole(-1); cliMode = e.Args[0]; if (cliMode == "-h") { Console.WriteLine("\n"); Console.WriteLine("Usage: SpeckleGSAUI.exe <command>\n\n" + "where <command> is one of: receiver, sender\n\n"); Console.Write("SpeckleGSAUI.exe <command> -h\thelp on <command>\n"); Current.Shutdown(); return; } if (cliMode != "receiver" && cliMode != "sender") { Console.WriteLine("Unable to parse command"); Current.Shutdown(); return; } for (int index = 1; index < e.Args.Length; index += 2) { string arg = e.Args[index].Replace("-", ""); if (e.Args.Length <= index + 1 || e.Args[index + 1].StartsWith("-")) { arguments.Add(arg, "true"); index--; } else { arguments.Add(arg, e.Args[index + 1].Trim(new char[] { '"' })); } } GSA.Init(); Status.Init(this.AddMessage, this.AddError, this.ChangeStatus); SpeckleCore.SpeckleInitializer.Initialize(); RunCLI(); Current.Shutdown(); return; } }
/// <summary> /// Clear all receivers. /// </summary> private void ClearReceiver(object sender, RoutedEventArgs e) { GSA.ReceiverInfo.Clear(); if (!GSA.SetSpeckleClients(EmailAddress, RestApi)) { Status.AddError("Error in communicating GSA - please check if the GSA file has been closed down"); return; } UpdateClientLists(); }
private void ReceiverStreams_RemoveStream(object sender, RoutedEventArgs e) { var streamID = ReceiverStreams.CurrentCell.Item; if (streamID.GetType() == typeof(string)) { GSA.ReceiverInfo.Remove(GSA.ReceiverInfo.First(x => x.Item1 == (string)streamID)); if (!GSA.SetSpeckleClients(EmailAddress, RestApi)) { Status.AddError("Error in communicating GSA - please check if the GSA file has been closed down"); return; } UpdateClientLists(); } }
/// <summary> /// Add receivers from clipboard. /// </summary> private void PasteClipboardReceiver(object sender, RoutedEventArgs e) { string[] paste = Clipboard.GetText(TextDataFormat.Text).Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); foreach (string p in paste) { var streamId = p.Trim(); GSA.ReceiverInfo.Add(new Tuple <string, string>(streamId, null)); } if (!GSA.SetSpeckleClients(EmailAddress, RestApi)) { Status.AddError("Error in communicating GSA - please check if the GSA file has been closed down"); return; } UpdateClientLists(); }
/// <summary> /// Add a new receiver. /// </summary> private void AddReceiver(object sender, RoutedEventArgs e) { if (ReceiverTextbox.Text != "") { var streamId = ReceiverTextbox.Text.Trim(); GSA.ReceiverInfo.Add(new Tuple <string, string>(streamId, null)); if (!GSA.SetSpeckleClients(EmailAddress, RestApi)) { Status.AddError("Error in communicating GSA - please check if the GSA file has been closed down"); return; } UpdateClientLists(); ReceiverTextbox.Clear(); } }
static NMEAParser() { RMCSentence = new RMC(); GGASentence = new GGA(); GSASentence = new GSA(); GSVSentence = new GSV[4]; VTGSentence = new VTG(); HDTSentence = new HDT(); GLLSentence = new GLL(); lockGGA = new Object(); lockGSA = new Object(); lockRMC = new Object(); lockGSV = new Object(); lockVTG = new Object(); lockHDT = new Object(); lockGLL = new Object(); }
public void Can_parse_well_formed_sentence() { var bytes = Encoding.UTF8.GetBytes("$GPGSA,A,3,,,,,,16,18,,22,24,,,3.6,2.1,2.2*3C\r\n"); var buffer = new ReadOnlySequence <Byte>(bytes); var gsa = new GSA().Parse(buffer) as GSA; gsa.ShouldNotBeNull(); gsa.FixMode.ShouldBe('A'); gsa.FixType.ShouldBe(FixType.Fix3D); gsa.SV.ShouldContain(16); gsa.SV.ShouldContain(18); gsa.SV.ShouldContain(22); gsa.SV.ShouldContain(24); gsa.Pdop.ShouldBe(3.6d); gsa.Hdop.ShouldBe(2.1d); gsa.Vdop.ShouldBe(2.2d); gsa.Checksum.ShouldBe(0x3C); }
private void SenderStreams_RemoveStream(object sender, RoutedEventArgs e) { var cell = SenderStreams.CurrentCell.Item; if (cell.GetType() == typeof(Tuple <string, string>)) { var cellTuple = (Tuple <string, string>)cell; var streamName = cellTuple.Item1; var streamID = cellTuple.Item2; if (streamID.GetType() == typeof(string)) { GSA.SenderInfo.Remove(streamName); if (!GSA.SetSpeckleClients(EmailAddress, RestApi)) { Status.AddError("Error in communicating GSA - please check if the GSA file has been closed down"); return; } UpdateClientLists(); } } }
public bool RunCLI(params string[] args) { CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture; cliMode = args[0]; if (cliMode == "-h") { Console.WriteLine("\n"); Console.WriteLine("Usage: SpeckleGSAUI.exe <command>\n\n" + "where <command> is one of: receiver, sender\n\n"); Console.Write("SpeckleGSAUI.exe <command> -h\thelp on <command>\n"); return(true); } if (cliMode != "receiver" && cliMode != "sender") { Console.WriteLine("Unable to parse command"); return(false); } for (int index = 1; index < args.Length; index += 2) { string arg = args[index].Replace("-", ""); if (args.Length <= index + 1 || args[index + 1].StartsWith("-")) { arguments.Add(arg, "true"); index--; } else { arguments.Add(arg, args[index + 1].Trim(new char[] { '"' })); } } if (cliMode == "receiver" && arguments.ContainsKey("h")) { Console.WriteLine("\n"); Console.WriteLine("Usage: SpeckleGSAUI.exe receiver\n"); Console.WriteLine("\n"); Console.Write("Required arguments:\n"); Console.Write("--server <server>\t\tAddress of Speckle server\n"); Console.Write("--email <email>\t\t\tEmail of account\n"); Console.Write("--token <token>\t\tJWT token\n"); Console.Write("--file <path>\t\t\tFile to save to. If file does not exist, a new one will be created\n"); Console.Write("--streamIDs <streamIDs>\t\tComma-delimited ID of streams to be received\n"); Console.WriteLine("\n"); Console.Write("Optional arguments:\n"); Console.Write("--layer [analysis|design]\tSet which layer to write to. Default is design layer\n"); Console.Write("--nodeAllowance <distance>\tMax distance before nodes are not merged\n"); return(true); } else if (cliMode == "sender" && arguments.ContainsKey("h")) { Console.WriteLine("\n"); Console.WriteLine("Usage: SpeckleGSAUI.exe sender\n"); Console.WriteLine("\n"); Console.Write("Required arguments:\n"); Console.Write("--server <server>\t\tAddress of Speckle server\n"); Console.Write("--email <email>\t\t\tEmail of account\n"); Console.Write("--token <token>\t\tJWT token\n"); Console.Write("--file <path>\t\t\tFile to open. If file does not exist, a new one will be created\n"); Console.WriteLine("\n"); Console.Write("Optional arguments:\n"); Console.Write("--layer [analysis|design]\tSet which layer to write to. Default is design layer\n"); Console.Write("--sendAllNodes\t\t\tSend all nodes in model. Default is to send only 'meaningful' nodes\n"); Console.Write("--separateStreams\t\tSeparate model into different streams\n"); Console.Write("--result <options>\t\tType of result to send. Each input should be in quotation marks. Comma-delimited\n"); Console.Write("--resultCases <cases>\t\tCases to extract results from. Comma-delimited\n"); Console.Write("--resultOnly\t\t\tSend only results\n"); Console.Write("--resultUnembedded\t\tSend results as separate objects\n"); Console.Write("--resultInLocalAxis\t\tSend results calculated at the local axis. Default is global\n"); Console.Write("--result1DNumPosition <num>\tNumber of additional result points within 1D elements\n"); return(true); } string[] neededArgs = new string[] { "server", "email", "token", "file" }; foreach (string a in neededArgs) { if (!arguments.ContainsKey(a)) { Console.WriteLine("Missing -" + a + " argument"); return(false); } } // Login EmailAddress = arguments["email"]; RestApi = arguments["server"]; ApiToken = arguments["token"]; //This will create the logger GSA.App.LocalSettings.LoggingMinimumLevel = 4; //Debug GSA.App.Settings.TargetLayer = (arguments.ContainsKey("layer") && (arguments["layer"].ToLower() == "analysis")) ? GSATargetLayer.Analysis : GSATargetLayer.Design; //This ensures that if multiple CLI calls are made sequentially from any process, that there is no carry over of static variable values //from previous calls GSA.Reset(); GSA.Init(getRunningVersion().ToString()); GSA.App.LocalMessenger.MessageAdded += this.ProcessMessage; SpeckleCore.SpeckleInitializer.Initialize(); List <SidSpeckleRecord> receiverStreamInfo; List <SidSpeckleRecord> senderStreamInfo; var fileArg = arguments["file"]; var filePath = fileArg.StartsWith(".") ? Path.Combine(AssemblyDirectory, fileArg) : fileArg; // GSA File if (File.Exists(filePath)) { OpenFile(filePath, EmailAddress, RestApi, out receiverStreamInfo, out senderStreamInfo, false); } else if (cliMode == "sender") { Console.WriteLine("Could not locate file: " + filePath); //sending needs the file to exist return(false); } else { receiverStreamInfo = new List <SidSpeckleRecord>(); senderStreamInfo = new List <SidSpeckleRecord>(); GSA.App.Proxy.NewFile(false); GSA.App.Messenger.Message(SpeckleGSAInterfaces.MessageIntent.Display, SpeckleGSAInterfaces.MessageLevel.Information, "Created new file."); //Ensure this new file has a file name GSA.App.Proxy.SaveAs(filePath); } var calibrateNodeAtTask = Task.Run(() => GSAProxy.CalibrateNodeAt()); calibrateNodeAtTask.Wait(); if (cliMode == "receiver") { if (!arguments.ContainsKey("streamIDs")) { Console.WriteLine("Missing -streamIDs argument"); return(false); } //There seem to be some issues with HTTP requests down the line if this is run on the initial (UI) thread, so this ensures it runs on another thread return(Task.Run(() => CLIReceiver(receiverStreamInfo)).Result); } else if (cliMode == "sender") { //There seem to be some issues with HTTP requests down the line if this is run on the initial (UI) thread, so this ensures it runs on another thread return(Task.Run(() => CLISender(senderStreamInfo)).Result); } return(true); }
public void CLISender() { if (arguments.ContainsKey("layer")) { if (arguments["layer"].ToLower() == "analysis") { GSA.Settings.TargetLayer = GSATargetLayer.Analysis; } } if (arguments.ContainsKey("sendAllNodes")) { GSA.Settings.SendOnlyMeaningfulNodes = false; } if (arguments.ContainsKey("separateStreams")) { GSA.Settings.SeparateStreams = true; } if (arguments.ContainsKey("resultOnly")) { GSA.Settings.SendOnlyResults = true; } if (arguments.ContainsKey("resultUnembedded")) { GSA.Settings.EmbedResults = false; } if (arguments.ContainsKey("resultInLocalAxis")) { GSA.Settings.ResultInLocalAxis = true; } if (arguments.ContainsKey("result1DNumPosition")) { try { GSA.Settings.Result1DNumPosition = Convert.ToInt32(arguments["result1DNumPosition"]); } catch { } } if (arguments.ContainsKey("result")) { GSA.Settings.SendResults = true; var results = arguments["result"].Split(new char[] { ',' }).Select(x => x.Replace("\"", "")); foreach (string r in results) { if (Result.NodalResultMap.ContainsKey(r)) { GSA.Settings.NodalResults[r] = Result.NodalResultMap[r]; } else if (Result.Element1DResultMap.ContainsKey(r)) { GSA.Settings.Element1DResults[r] = Result.Element1DResultMap[r]; } else if (Result.Element2DResultMap.ContainsKey(r)) { GSA.Settings.Element2DResults[r] = Result.Element2DResultMap[r]; } else if (Result.MiscResultMap.ContainsKey(r)) { GSA.Settings.MiscResults[r] = Result.MiscResultMap[r]; } } } if (arguments.ContainsKey("resultCases")) { GSA.Settings.ResultCases = arguments["resultCases"].Split(new char[] { ',' }).ToList(); } GSA.GetSpeckleClients(EmailAddress, RestApi); var gsaSender = new Sender(); Task.Run(() => gsaSender.Initialize(RestApi, ApiToken, (restApi, apiToken) => new SpeckleGSASender(restApi, apiToken))).Wait(); GSA.SetSpeckleClients(EmailAddress, RestApi); gsaSender.Trigger(); gsaSender.Dispose(); GSA.gsaProxy.SaveAs(arguments["file"]); GSA.Close(); Console.WriteLine("Sending complete"); }
/// <summary> /// Start and stop receiving. /// </summary> private async void ReceiveStream(object sender, RoutedEventArgs e) { if (RestApi == null && ApiToken == null) { Status.AddError("Not logged in"); return; } if (status == UIStatus.IDLE) { Status.AddMessage("Preparing to receive ..."); Application.Current.DoEvents(); status = UIStatus.BUSY; ReceiveButtonPath.Data = Geometry.Parse(PAUSE_BUTTON); ReceiveButtonPath.Fill = Brushes.DimGray; GSA.Settings.TargetLayer = (ReceiverLayerToggle.IsChecked.Value) ? GSATargetLayer.Analysis : GSA.Settings.TargetLayer = GSATargetLayer.Design; ReceiverLayerToggle.IsEnabled = false; ReceiverContinuousToggle.IsEnabled = false; ReceiverControlPanel.IsEnabled = false; ReceiveButton.IsEnabled = false; Application.Current.DoEvents(); GSA.GetSpeckleClients(EmailAddress, RestApi); if (!GSA.SetSpeckleClients(EmailAddress, RestApi)) { Status.AddError("Error in communicating GSA - please check if the GSA file has been closed down"); status = UIStatus.RECEIVING; ReceiveStream(sender, e); return; } gsaReceiver = new Receiver(); try { await Task.Run(() => { var nonBlankReceivers = GSA.ReceiverInfo.Where(r => !string.IsNullOrEmpty(r.Item1)).ToList(); foreach (var streamInfo in nonBlankReceivers) { Status.AddMessage("Creating receiver " + streamInfo.Item1); gsaReceiver.Receivers[streamInfo.Item1] = new SpeckleGSAReceiver(RestApi, ApiToken); } }); await gsaReceiver.Initialize(RestApi, ApiToken); } catch (Exception ex) { Status.AddError(ex.Message); return; } status = UIStatus.RECEIVING; if (ReceiverContinuousToggle.IsChecked.Value) { try { await Task.Run(() => { gsaReceiver.Trigger(null, null); foreach (var m in ((SpeckleAppUI)GSA.appUi).GroupMessages()) { Status.AddMessage(m); } }) .ContinueWith(res => { Application.Current.Dispatcher.BeginInvoke( DispatcherPriority.Background, new Action(() => { ReceiveStream(sender, e); }) ); }); } catch (Exception ex) { Status.AddError(ex.Message); ReceiveStream(sender, e); } } else { try { await Task.Run(() => gsaReceiver.Trigger(null, null)); } catch (Exception ex) { Status.AddError(ex.Message); ReceiveStream(sender, e); } ReceiveButtonPath.Fill = (SolidColorBrush)FindResource("SecondaryAccentBrush");// (SolidColorBrush)(new BrushConverter().ConvertFrom("#0080ff")); } } else if (status == UIStatus.RECEIVING) { status = UIStatus.IDLE; ReceiveButtonPath.Data = Geometry.Parse(PLAY_BUTTON); ReceiveButtonPath.Fill = (SolidColorBrush)FindResource("PrimaryHueMidBrush"); ReceiverLayerToggle.IsEnabled = true; ReceiverContinuousToggle.IsEnabled = true; ReceiverControlPanel.IsEnabled = true; if (!ReceiverContinuousToggle.IsChecked.Value) { MessageBoxResult result = MessageBox.Show("Bake received objects permanently? ", "SpeckleGSA", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result != MessageBoxResult.Yes) { gsaReceiver.DeleteSpeckleObjects(); } } gsaReceiver.Dispose(); } ReceiveButton.IsEnabled = true; }
private void RunCLI() { if (cliMode == "receiver" && arguments.ContainsKey("h")) { Console.WriteLine("\n"); Console.WriteLine("Usage: SpeckleGSAUI.exe receiver\n"); Console.WriteLine("\n"); Console.Write("Required arguments:\n"); Console.Write("--server <server>\t\tAddress of Speckle server\n"); Console.Write("--email <email>\t\t\tEmail of account\n"); Console.Write("--token <token>\t\tJWT token\n"); Console.Write("--file <path>\t\t\tFile to save to. If file does not exist, a new one will be created\n"); Console.Write("--streamIDs <streamIDs>\t\tComma-delimited ID of streams to be received\n"); Console.WriteLine("\n"); Console.Write("Optional arguments:\n"); Console.Write("--layer [analysis|design]\tSet which layer to write to. Default is design layer\n"); Console.Write("--nodeAllowance <distance>\tMax distance before nodes are not merged\n"); return; } else if (cliMode == "sender" && arguments.ContainsKey("h")) { Console.WriteLine("\n"); Console.WriteLine("Usage: SpeckleGSAUI.exe sender\n"); Console.WriteLine("\n"); Console.Write("Required arguments:\n"); Console.Write("--server <server>\t\tAddress of Speckle server\n"); Console.Write("--email <email>\t\t\tEmail of account\n"); Console.Write("--token <token>\t\tJWT token\n"); Console.Write("--file <path>\t\t\tFile to open. If file does not exist, a new one will be created\n"); Console.WriteLine("\n"); Console.Write("Optional arguments:\n"); Console.Write("--layer [analysis|design]\tSet which layer to write to. Default is design layer\n"); Console.Write("--sendAllNodes\t\t\tSend all nodes in model. Default is to send only 'meaningful' nodes\n"); Console.Write("--separateStreams\t\tSeparate model into different streams\n"); Console.Write("--result <options>\t\tType of result to send. Each input should be in quotation marks. Comma-delimited\n"); Console.Write("--resultCases <cases>\t\tCases to extract results from. Comma-delimited\n"); Console.Write("--resultOnly\t\t\tSend only results\n"); Console.Write("--resultUnembedded\t\tSend results as separate objects\n"); Console.Write("--resultInLocalAxis\t\tSend results calculated at the local axis. Default is global\n"); Console.Write("--result1DNumPosition <num>\tNumber of additional result points within 1D elements\n"); return; } string[] neededArgs = new string[] { "server", "email", "token", "file" }; foreach (string a in neededArgs) { if (!arguments.ContainsKey(a)) { Console.WriteLine("Missing -" + a + " argument"); return; } } // Login EmailAddress = arguments["email"]; RestApi = arguments["server"]; ApiToken = arguments["token"]; // GSA File if (File.Exists(arguments["file"])) { GSA.OpenFile(arguments["file"], EmailAddress, RestApi, false); } else { GSA.NewFile(EmailAddress, RestApi, false); GSA.gsaProxy.SaveAs(arguments["file"]); } // We will receive all the things! if (cliMode == "receiver") { CLIReceiver(); } else if (cliMode == "sender") { CLISender(); } }
public MainWindow() { InitializeComponent(); mainWindow.Title = mainWindow.Title + " - " + getRunningVersion(); DataContext = this; Messages = new ObservableCollection <string>(); gsaSender = new Sender(); gsaReceiver = new Receiver(); triggerTimer = new Timer(); status = UIStatus.IDLE; previousTabIndex = 0; //Default settings SendOnlyMeaningfulNodes.IsChecked = GSA.Settings.SendOnlyMeaningfulNodes; SeparateStreams.IsChecked = GSA.Settings.SeparateStreams; PollingRate.Text = GSA.Settings.PollingRate.ToString(); CoincidentNodeAllowance.Text = GSA.Settings.CoincidentNodeAllowance.ToString(); SendOnlyResults.IsChecked = GSA.Settings.SendOnlyResults; EmbedResults.IsChecked = GSA.Settings.EmbedResults; ResultCases.Text = string.Join("\r\n", GSA.Settings.ResultCases); ResultInLocalAxis.IsChecked = GSA.Settings.ResultInLocalAxis; Result1DNumPosition.Text = GSA.Settings.Result1DNumPosition.ToString(); //Result List foreach (string s in Result.NodalResultMap.Keys) { CheckBox chk = new CheckBox { Content = s, Tag = Result.NodalResultMap[s] }; chk.Checked += UpdateNodalResult; chk.Unchecked += UpdateNodalResult; ResultSelection.Children.Add(chk); } foreach (string s in Result.Element1DResultMap.Keys) { CheckBox chk = new CheckBox { Content = s, Tag = Result.Element1DResultMap[s] }; chk.Checked += UpdateElement1DResult; chk.Unchecked += UpdateElement1DResult; ResultSelection.Children.Add(chk); } foreach (string s in Result.Element2DResultMap.Keys) { CheckBox chk = new CheckBox { Content = s, Tag = Result.Element2DResultMap[s] }; chk.Checked += UpdateElement2DResult; chk.Unchecked += UpdateElement2DResult; ResultSelection.Children.Add(chk); } foreach (string s in Result.MiscResultMap.Keys) { CheckBox chk = new CheckBox { Content = s, Tag = Result.MiscResultMap[s] }; chk.Checked += UpdateMiscResult; chk.Unchecked += UpdateMiscResult; ResultSelection.Children.Add(chk); } //Draw buttons SendButtonPath.Data = Geometry.Parse(PLAY_BUTTON); SendButtonPath.Fill = (SolidColorBrush)FindResource("PrimaryHueMidBrush"); ReceiveButtonPath.Data = Geometry.Parse(PLAY_BUTTON); ReceiveButtonPath.Fill = (SolidColorBrush)FindResource("PrimaryHueMidBrush"); //Adds event handling delegates to the status events Status.Init(this.AddMessage, this.AddError, this.ChangeStatus); GSA.Init(); //Add further event handling delegates - this time for logging - to the status events Status.MessageAdded += (sender, eventArgs) => { Log.Information(eventArgs.Message); }; Status.ErrorAdded += (sender, eventArgs) => { if (eventArgs.Exception == null) { Log.Error(eventArgs.Message); } else { Log.Error(eventArgs.Exception, eventArgs.Message); if (eventArgs.Exception.InnerException != null) { Log.Error(eventArgs.Exception.InnerException, eventArgs.Message); } } }; MessagePane.ItemsSource = Messages; SpeckleCore.SpeckleInitializer.Initialize(); SpeckleCore.LocalContext.Init(); try { //This will throw an exception if there is no default account var account = SpeckleCore.LocalContext.GetDefaultAccount(); if (account != null) { EmailAddress = account.Email; RestApi = account.RestApi; ApiToken = account.Token; Status.AddMessage("Logged in to default account at: " + RestApi); } } catch { Status.AddMessage("No default account found - press the Login button to login/select an account"); } }
/// <summary> /// Start and stop sending. /// </summary> private async void SendStream(object sender, RoutedEventArgs e) { if (RestApi == null && ApiToken == null) { Status.AddError("Not logged in"); return; } if (status == UIStatus.IDLE) { if (GSA.Settings.NodalResults.Count > 0 || GSA.Settings.Element1DResults.Count > 0 || GSA.Settings.Element2DResults.Count > 0 || GSA.Settings.MiscResults.Count > 0) { //SenderLayerToggle is a boolean toggle, where zero is design layer if (!SenderLayerToggle.IsChecked.Value) { var dialogResult = MessageBox.Show("Results only supported for analysis layer.\r\nNo results will be sent. Do you still wish to proceed?", "SpeckleGSA", MessageBoxButton.YesNo, MessageBoxImage.Warning); if (dialogResult == MessageBoxResult.No) { return; } GSA.Settings.SendResults = false; } else if (!SenderContinuousToggle.IsChecked.Value) { var dialogResult = MessageBox.Show("Results only supported for single send mode.\r\nNo results will be sent. Do you still wish to proceed?", "SpeckleGSA", MessageBoxButton.YesNo, MessageBoxImage.Warning); if (dialogResult == MessageBoxResult.No) { return; } GSA.Settings.SendResults = false; } else { GSA.Settings.SendResults = true; } } else { GSA.Settings.SendResults = false; } Status.AddMessage("Preparing to send ..."); Application.Current.DoEvents(); status = UIStatus.BUSY; SendButtonPath.Data = Geometry.Parse(PAUSE_BUTTON); SendButtonPath.Fill = Brushes.DimGray; if (SenderLayerToggle.IsChecked.Value) { GSA.Settings.TargetLayer = GSATargetLayer.Analysis; } else { GSA.Settings.TargetLayer = GSATargetLayer.Design; } SenderLayerToggle.IsEnabled = false; SenderContinuousToggle.IsEnabled = false; SenderButton.IsEnabled = false; Application.Current.DoEvents(); try { if (!GSA.GetSpeckleClients(EmailAddress, RestApi)) { Status.AddError("Error in communicating GSA - please check if the GSA file has been closed down"); status = UIStatus.SENDING; SendStream(sender, e); return; } gsaSender = new Sender(); var statusMessages = await gsaSender.Initialize(RestApi, ApiToken, (restApi, apiToken) => new SpeckleGSASender(restApi, apiToken)); GSA.SetSpeckleClients(EmailAddress, RestApi); } catch (Exception ex) { Status.AddError(ex.Message); return; } var resultCases = GSA.Settings.ResultCases; if (GSA.Settings.SendResults && resultCases.Count() > 0) { var startTime = DateTime.Now; var expandedCases = GSA.gsaCache.ExpandLoadCasesAndCombinations(string.Join(" ", resultCases)); if (!expandedCases.SequenceEqual(resultCases)) { Status.AddMessage("Expanded list of load cases/combinations to be sent: " + string.Join(" ", expandedCases)); GSA.Settings.ResultCases = expandedCases; TimeSpan duration = DateTime.Now - startTime; if (duration.Milliseconds > 100) { Status.AddMessage("Duration of expanding and validating load cases/combinations: " + duration.ToString(@"hh\:mm\:ss")); } } } status = UIStatus.SENDING; if (SenderContinuousToggle.IsChecked.Value) { try { await Task.Run(() => gsaSender.Trigger()) .ContinueWith(res => { Application.Current.Dispatcher.BeginInvoke( DispatcherPriority.Background, new Action(() => { UpdateClientLists(); SendStream(sender, e); }) ); }); } catch (Exception ex) { Status.AddError(ex.Message); //SendStream(sender, e); } } else { triggerTimer = new Timer(GSA.Settings.PollingRate); triggerTimer.Elapsed += SenderTimerTrigger; triggerTimer.AutoReset = false; triggerTimer.Start(); SendButtonPath.Fill = (SolidColorBrush)FindResource("SecondaryAccentBrush");// (new BrushConverter().ConvertFrom("#0080ff")); } } else if (status == UIStatus.SENDING) { gsaSender.Dispose(); status = UIStatus.IDLE; SendButtonPath.Data = Geometry.Parse(PLAY_BUTTON); SendButtonPath.Fill = (SolidColorBrush)FindResource("PrimaryHueMidBrush"); SenderLayerToggle.IsEnabled = true; SenderContinuousToggle.IsEnabled = true; SenderButton.IsEnabled = true; } }