/// <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); }
                });
            }
        }
Example #2
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);
 }
Example #3
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");
        }
Example #4
0
        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();
            }
        }
Example #9
0
 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();
 }
Example #10
0
        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();
                }
            }
        }
Example #12
0
        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);
        }
Example #13
0
        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;
        }
Example #15
0
        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;
            }
        }