Ejemplo n.º 1
0
 public ResetScriptEngine()
 {
     _instance = this;
 }
        // the main listener function
        protected void TcpServerWorkerListening(object sender, DoWorkEventArgs e)
        {
            //---listen at the specified IP and port no.---
            const int portNo   = 614;
            IPAddress serverIp = IPAddress.Parse("127.0.0.1");

            if (_server == null)
            {
                _server = new TcpListener(serverIp, portNo);
            }
            try
            {
                _server.Start();
                RhinoApp.WriteLine("VS Code Listener Started...");
            }
            catch (Exception err)
            {
                RhinoApp.WriteLine(err.ToString());
            }

            while (true)
            {
                // incoming client connected
                TcpClient client;
                try
                {
                    client = _server.AcceptTcpClient();
                }
                catch (Exception serverException)
                {
                    return;
                }

                // get the incoming data through a network stream
                NetworkStream nwStream = client.GetStream();
                byte[]        buffer   = new byte[client.ReceiveBufferSize];

                // read incoming stream
                int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize);

                // convert the data received into a string
                StringBuilder msg = new StringBuilder();

                // parse the buffer into msg
                foreach (var b in buffer)
                {
                    if (b.Equals(00))
                    {
                        break;
                    }
                    msg.Append(Convert.ToChar(b).ToString());
                }

                // parse the received message into C# Object
                string msgString = msg.ToString();
                msgString = Regex.Split(msgString, "}")[0] + "}";
                MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(msgString));
                DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(msgObject));
                msgObject msgObj;
                try
                {
                    msgObj = ser.ReadObject(ms) as msgObject;
                }
                catch (Exception ex)
                {
                    RhinoApp.WriteLine("Received invalid data, please try again.");
                    return;
                }

                ms.Close();

                // invoke the main task in the main thread
                Application.Current.Dispatcher.Invoke(() =>
                {
                    // create python script runner
                    PythonScript myScript = PythonScript.Create();
                    // redirect output to _output field
                    myScript.Output = PrintToVSCode;
                    FeedbackSender feedbackSender = new FeedbackSender(nwStream);
                    GotCodeFeekBack += feedbackSender.OnGotCodeFeedBack;

                    // if flagged reset, then reset the script engine.
                    if (msgObj.reset)
                    {
                        ResetScriptEngine.ResetEngine();
                    }

                    // if it is not a temp folder, add the folder to python library path
                    if (!msgObj.temp)
                    {
                        string pythonFilePath = Path.GetDirectoryName(msgObj.filename);
                        string code           = string.Format("import sys\nimport os\nif \"{0}\" not in sys.path: sys.path.append(\"{0}\")", pythonFilePath);
                        try
                        {
                            myScript.ExecuteScript(code);
                        }
                        catch (Exception exception)
                        {
                            PrintToVSCode(exception.Message);
                        }
                    }

                    // determines if run actual script
                    if (msgObj.run)
                    {
                        uint sn      = _idoc.BeginUndoRecord("VS Code execution");
                        var sn_start = RhinoObject.NextRuntimeSerialNumber;
                        try
                        {
                            if (msgObj.minimize)
                            {
                                Utils.MinimizeVSCodeWindow();
                            }

                            myScript.ExecuteFile(msgObj.filename);
                        }
                        catch (Exception ex)
                        {
                            // get the exception message
                            var error      = myScript.GetStackTraceFromException(ex);
                            string message = ex.Message + "\n" + error;
                            // send exception msg back to VS Code
                            PrintToVSCode(message);
                        }
                        finally
                        {
                            CloseConnection(nwStream);
                            _idoc.EndUndoRecord(sn);
                            if (msgObj.minimize)
                            {
                                Utils.RestoreVSCodeWindow();
                            }
                            // fix the rs.Prompt bug
                            RhinoApp.SetCommandPrompt("Command");

                            // select created objects
                            var sn_end = RhinoObject.NextRuntimeSerialNumber;
                            if (sn_end > sn_start)
                            {
                                for (var i = sn_start; i < sn_end; i++)
                                {
                                    var obj = _idoc.Objects.Find(i);
                                    if (null != obj)
                                    {
                                        obj.Select(true);
                                    }
                                }
                            }
                            // enable the view
                            _idoc.Views.RedrawEnabled = true;
                        }
                    }
                    else
                    {
                        CloseConnection(nwStream);
                    }
                });
            }
        }