protected override void Initialize()
        {
            base.Initialize();

            if (Doc != null)
            {
                Doc.SolutionEnd += OnDocSolutionEnd;
            }

            m_py = PythonScript.Create();
            if (m_py != null)
            {
                SetScriptTransientGlobals();
                m_py.Output = m_py_output.Write;
                m_py.SetVariable("__name__", "__main__");
                m_env = new PythonEnvironment(this, m_py);

                m_py.SetVariable(PARENT_ENVIRONMENT_NAME, m_env);
                m_py.SetIntellisenseVariable(PARENT_ENVIRONMENT_NAME, m_env);

                m_py.ContextId = 2;                                      // 2 is Grasshopper

                m_env.LoadAssembly(typeof(GH_Component).Assembly);       //add Grasshopper.dll reference
                m_env.LoadAssembly(typeof(ZuiPythonComponent).Assembly); //add GHPython.dll reference

                UnpackScriptResources();

                m_env.AddGhPythonPackage();
            }
        }
        protected override void Initialize()
        {
            base.Initialize();

            if (Doc != null)
            {
                Doc.SolutionEnd += OnDocSolutionEnd;
            }

            // ksteinfe
            _py = PythonScript.Create();
            if (_py != null)
            {
                SetScriptTransientGlobals();
                _py.Output = m_py_output.Write;
                _py.SetVariable("__name__", "__main__");
                _env = new PythonEnvironment(this, _py);
                _py.SetVariable(PARENT_ENVIRONMENT_NAME, _env);
                _py.SetIntellisenseVariable(PARENT_ENVIRONMENT_NAME, _env);

                _py.ContextId = 2; // 2 is Grasshopper
            }
        }
        protected override void SafeSolveInstance(IGH_DataAccess da)
        {
            m_env.DataAccessManager = da;

            if (m_py == null)
            {
                da.SetData(0, "No Python engine available. This component needs Rhino v5");
                return;
            }

            if (!HiddenOutOutput)
            {
                da.DisableGapLogic(0);
            }

            m_py_output.Reset();

            var rhdoc       = RhinoDoc.ActiveDoc;
            var prevEnabled = (rhdoc != null) && rhdoc.Views.RedrawEnabled;

            try
            {
                // set output variables to "None"
                for (int i = HiddenOutOutput ? 0 : 1; i < Params.Output.Count; i++)
                {
                    string varname = Params.Output[i].NickName;
                    m_py.SetVariable(varname, null);
                }

                // caching variable to keep things as fast as possible
                bool showing_code_input = !HiddenCodeInput;
                // Set all input variables. Even null variables may be used in the
                // script, so do not attempt to skip these for optimization purposes.
                // Skip "Code" input parameter
                // Please pay attention to the input data structure type
                for (int i = showing_code_input ? 1 : 0; i < Params.Input.Count; i++)
                {
                    string varname = Params.Input[i].NickName;
                    object o       = m_marshal.GetInput(da, i);
                    m_py.SetVariable(varname, o);
                    m_py.SetIntellisenseVariable(varname, o);
                }

                // the "code" string could be embedded in the component itself
                if (showing_code_input || m_compiled_py == null)
                {
                    string script;
                    if (!showing_code_input)
                    {
                        script = Code;
                    }
                    else
                    {
                        script = null;
                        da.GetData(0, ref script);
                    }

                    if (string.IsNullOrWhiteSpace(script))
                    {
                        AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "No script to execute");
                        return;
                    }

                    if (m_compiled_py == null ||
                        string.Compare(script, m_previousRunCode, StringComparison.InvariantCulture) != 0)
                    {
                        if (!(m_inDocStringsMode = DocStringUtils.FindApplyDocString(script, this)))
                        {
                            ResetAllDescriptions();
                        }
                        m_compiled_py     = m_py.Compile(script);
                        m_previousRunCode = script;
                    }
                }

                if (m_compiled_py != null)
                {
                    string localPath;
                    bool   added = AddLocalPath(out localPath);

                    m_compiled_py.Execute(m_py);

                    if (added)
                    {
                        RemoveLocalPath(localPath);
                    }

                    // Python script completed, attempt to set all of the
                    // output paramerers
                    for (int i = HiddenOutOutput ? 0 : 1; i < Params.Output.Count; i++)
                    {
                        string varname = Params.Output[i].NickName;
                        object o       = m_py.GetVariable(varname);
                        m_marshal.SetOutput(o, da, i);
                    }
                }
                else
                {
                    m_py_output.Write("There was a permanent error parsing this script. Please report to [email protected].");
                }
            }
            catch (Exception ex)
            {
                AddErrorNicely(m_py_output, ex);
                SetFormErrorOrClearIt(da, m_py_output);
                throw;
            }
            finally
            {
                if (rhdoc != null && prevEnabled != rhdoc.Views.RedrawEnabled)
                {
                    rhdoc.Views.RedrawEnabled = true;
                }
            }
            SetFormErrorOrClearIt(da, m_py_output);
        }