///<summary> This gets called when when the user runs this command.</summary>
        public override IRhinoCommand.result RunCommand(IRhinoCommandContext context)
        {
            MRhinoGetObject go = new MRhinoGetObject();
              go.SetCommandPrompt("Select surface, polysurface, or mesh to export");
              go.SetGeometryFilter(IRhinoGetObject.GEOMETRY_TYPE_FILTER.surface_object | IRhinoGetObject.GEOMETRY_TYPE_FILTER.polysrf_object | IRhinoGetObject.GEOMETRY_TYPE_FILTER.mesh_object);
              go.GetObjects(1, 1);
              if (go.CommandResult() != IRhinoCommand.result.success)
            return go.CommandResult();

              MRhinoObjRef obj_ref = go.Object(0);

              IRhinoObject obj = obj_ref.Object();
              if (null == obj)
            return IRhinoCommand.result.failure;

              List<IRhinoObject> obj_list = new List<IRhinoObject>();
              obj_list.Add(obj);

              ArrayMRhinoObjectMesh mesh_list = new ArrayMRhinoObjectMesh(obj_list.Count);
              OnMeshParameters mesh_parameters = _mesh_parameters;
              int mesh_ui_style = !context.IsInteractive() ? 2 : _mesh_ui_style;

              IRhinoCommand.result res = RhUtil.RhinoMeshObjects(obj_list.ToArray(), ref mesh_parameters, ref mesh_ui_style, ref mesh_list);
              if (res == IRhinoCommand.result.success)
              {
            if (mesh_ui_style >= 0 && mesh_ui_style <= 1)
              _mesh_ui_style = mesh_ui_style;
            _mesh_parameters = mesh_parameters;
              }
              else
              {
            RhUtil.RhinoApp().Print("No mesh to export.\n");
            return res;
              }

              string filename = string.Empty;

              if (context.IsInteractive())
              {
            SaveFileDialog dialog = new SaveFileDialog();
            dialog.Title = "Export";
            dialog.Filter = "Geomview files|*.off";
            dialog.InitialDirectory = DirectoryManager.DefaultDirectory(DirectoryManager.FileTypes.ftExport);
            if (dialog.ShowDialog() != DialogResult.OK)
              return IRhinoCommand.result.cancel;

            filename = dialog.FileName;
              }
              else
              {
            MRhinoGetString gs = new MRhinoGetString();
            gs.SetCommandPrompt("Export file name");
            gs.GetString();
            if (gs.CommandResult() != IRhinoCommand.result.success)
              return gs.CommandResult();

            filename = gs.String().Trim();
              }

              try
              {
            OnMesh mesh = mesh_list.First().GetMesh();

            int vertex_count = mesh.VertexCount();
            int face_count = mesh.FaceCount();
            int edge_count = mesh.Topology().m_tope.Count();

            System.IO.StreamWriter file = new System.IO.StreamWriter(filename);

            // Write out the first line of the file header
            file.WriteLine("OFF");

            // Write the header information
            file.WriteLine(string.Format("{0} {1} {2}", vertex_count, face_count, edge_count));

            file.WriteLine();

            // Write out all the vertices in order
            for (int i = 0; i < vertex_count; i++)
            {
              On3fPoint p = mesh.m_V[i];
              file.WriteLine(string.Format("{0} {1} {2}", p.x.ToString("F"), p.y.ToString("F"), p.z.ToString("F")));
            }

            file.WriteLine();

            // Write out all the faces
            for (int i = 0; i < face_count; i++)
            {
              OnMeshFace f = mesh.m_F[i];
              if (f.IsQuad())
            file.WriteLine(string.Format("4 {0} {1} {2} {3}", f.get_vi(0), f.get_vi(1), f.get_vi(2), f.get_vi(3)));
              else
            file.WriteLine(string.Format("3 {0} {1} {2}", f.get_vi(0), f.get_vi(1), f.get_vi(2)));
            }

            file.Close();
              }
              catch (Exception e)
              {
            RhUtil.RhinoApp().Print(string.Format("{0}\n", e.Message));
              }

              return IRhinoCommand.result.success;
        }
Example #2
0
        //writing to file
        //returns true if we have any data to wite
        /*public override bool CallWriteDocument(IRhinoFileWriteOptions options)
        {
            //only return true if you REALLY want to save something to the document
            //that is about to be written to disk
            if (options.Mode(IRhinoFileWriteOptions.ModeFlag.SelectedMode) == true) return false;
            if (options.Mode(IRhinoFileWriteOptions.ModeFlag.AsVersion2) == true) return false;
            if (options.Mode(IRhinoFileWriteOptions.ModeFlag.AsVersion3) == true) return false;

            //perform some other type of check to see if you need to save any data...
            //If( IHaveDataToWrite() = False ) Then Return False

            return false;
        }

        //If any ON_BinaryArchive::Write*() functions return false than you should
        //immediately return false otherwise return true if all data was written
        //successfully.  Returning false will cause Rhino to stop writing this document.
        public override bool WriteDocument(MRhinoDoc doc, OnBinaryArchive archive, IRhinoFileWriteOptions options)
        {
            //This function is called because CallWriteDocument returned True.
            //Write your plug-in data to the document

            string date_string  = System.DateTime.Now.ToShortDateString();
            string time_string = System.DateTime.Now.ToShortTimeString();

            ///It is a good idea to always start with a version number
            //so you can modify your document read/write code in the future
            if (archive.Write3dmChunkVersion(1, 0) == false) return false;
            if (archive.WriteString(date_string) == false) return false;
            if (archive.WriteString(time_string) == false) return false;

            return true;
        }*/
        public override IRhinoCommand.result Render(RMA.Rhino.IRhinoCommandContext context, bool render_preview)
        {
            /*RenderSettings settings = new RenderSettings();
            if (settings.ShowDialog() == DialogResult.OK)*/

            {

                //use . instead of cz , for floats in String.Format
                System.Globalization.CultureInfo ci = System.Globalization.CultureInfo.CreateSpecificCulture("en");

                //todo: more elegant
                MRhinoObjectIterator it = new MRhinoObjectIterator(context.m_doc, IRhinoObjectIterator.object_state.normal_or_locked_objects,
                                                          IRhinoObjectIterator.object_category.active_and_reference_objects);
                it.IncludeLights(false);
                it.IncludePhantoms(false);

                //fill list with objects from iterator
                List<IRhinoObject> objs = new List<IRhinoObject>();
                foreach (MRhinoObject obj in it)
                {
                    objs.Add(obj);
                }

                //mesh selected objects from list
                IRhinoAppRenderMeshSettings rms = RhUtil.RhinoApp().AppSettings().RenderMeshSettings();
                OnMeshParameters mp = new OnMeshParameters(rms.FastMeshParameters());

                int ui_style = 1; // simple ui
                ArrayMRhinoObjectMesh meshes = new ArrayMRhinoObjectMesh();
                IRhinoCommand.result rc = RhUtil.RhinoMeshObjects(objs.ToArray(),
                                                                  ref mp,
                                                                  ref ui_style,
                                                                  ref meshes);
                //if anything was meshed:
                if (rc == IRhinoCommand.result.success)
                {

                    // open file
                    FileStream file = new FileStream("scene.xml", FileMode.Create, FileAccess.Write);
                    TextWriter tw = new StreamWriter(file);

                    tw.WriteLine("<?xml version=\"1.0\"?>");
                    tw.WriteLine("<scene type=\"triangle\">");

                    //materials
                    tw.WriteLine(materials.serialize());

                    /*if (materialDefinition.Trim() != "")
                    {
                        materialName = material.m_material_id.ToString();
                        tw.WriteLine(string.Format(ci, "<material name=\"{0}\">", materialName));
                        tw.WriteLine(materialDefinition);
                        tw.WriteLine("</material>");
                    }*/
                    /*tw.WriteLine("<material name=\"defaultMat\">");
                tw.WriteLine("	<type sval=\"shinydiffusemat\"/>");
                tw.WriteLine("</material>");*/

                    // write meshes geometry
                    // todo: normals
                    for (int i = 0; i < meshes.Count(); i++)
                    {
                        IRhinoMaterial material = meshes[i].m_parent_object.ObjectMaterial();
                        string materialName = "";
                        material.GetUserString("yafaray_material", ref materialName);
                        if (materialName == "") materialName = "defaultMat";
                        string meshObject = writeMeshObject(meshes[i], materialName);
                        tw.WriteLine(meshObject);
                        //TODO: get somewhere smoothing angle, or better rhino should generate normals...
                        tw.WriteLine(string.Format(ci, "<smooth ID=\"{0}\" angle=\"30\"/>", i + 1));

                    }

                    tw.WriteLine(cameraFromActiveViewport());

                    //todo: scene setting dialog
                    tw.WriteLine("<background name=\"world_background\">");
                    tw.WriteLine("	<a_var fval=\"1\"/>");
                    tw.WriteLine("	<add_sun bval=\"true\"/>");
                    tw.WriteLine("	<b_var fval=\"1\"/>");
                    tw.WriteLine("	<background_light bval=\"true\"/>");
                    tw.WriteLine("	<c_var fval=\"1\"/>");
                    tw.WriteLine("	<d_var fval=\"1\"/>");
                    tw.WriteLine("	<e_var fval=\"1\"/>");
                    tw.WriteLine("	<from x=\"1\" y=\"1\" z=\"1\"/>");
                    tw.WriteLine("	<light_samples ival=\"8\"/>");
                    tw.WriteLine("	<power fval=\"1\"/>");
                    tw.WriteLine("	<sun_power fval=\"1\"/>");
                    tw.WriteLine("	<turbidity fval=\"3\"/>");
                    tw.WriteLine("	<type sval=\"sunsky\"/>");
                    tw.WriteLine("</background>");
                    tw.WriteLine("");
                    tw.WriteLine("<integrator name=\"default\">");
                    tw.WriteLine("	<caustics bval=\"false\"/>");
                    tw.WriteLine("	<raydepth ival=\"4\"/>");
                    tw.WriteLine("	<shadowDepth ival=\"4\"/>");
                    tw.WriteLine("	<transpShad bval=\"false\"/>");
                    tw.WriteLine("	<type sval=\"directlighting\"/>");
                    tw.WriteLine("</integrator>");
                    tw.WriteLine("");
                    tw.WriteLine("<integrator name=\"default2\">");
                    tw.WriteLine("	<caustics bval=\"false\"/>");
                    tw.WriteLine("	<raydepth ival=\"4\"/>");
                    tw.WriteLine("	<shadowDepth ival=\"4\"/>");
                    tw.WriteLine("	<transpShad bval=\"false\"/>");
                    tw.WriteLine("	<type sval=\"directlighting\"/>");
                    tw.WriteLine("</integrator>");
                    tw.WriteLine("<integrator name=\"volintegr\">");
                    tw.WriteLine("	<type sval=\"none\"/>");
                    tw.WriteLine("</integrator>");
                    tw.WriteLine("<integrator name=\"default3\">");
                    tw.WriteLine("	<caustics bval=\"false\"/>");
                    tw.WriteLine("	<raydepth ival=\"4\"/>");
                    tw.WriteLine("	<shadowDepth ival=\"4\"/>");
                    tw.WriteLine("	<transpShad bval=\"false\"/>");
                    tw.WriteLine("	<type sval=\"directlighting\"/>");
                    tw.WriteLine("</integrator>");
                    tw.WriteLine("<integrator name=\"volintegr\">");
                    tw.WriteLine("	<type sval=\"none\"/>");
                    tw.WriteLine("</integrator>");
                    tw.WriteLine("<integrator name=\"default4\">");
                    tw.WriteLine("	<caustics bval=\"false\"/>");
                    tw.WriteLine("	<raydepth ival=\"4\"/>");
                    tw.WriteLine("	<shadowDepth ival=\"4\"/>");
                    tw.WriteLine("	<transpShad bval=\"false\"/>");
                    tw.WriteLine("	<type sval=\"directlighting\"/>");
                    tw.WriteLine("</integrator>");
                    tw.WriteLine("<integrator name=\"volintegr\">");
                    tw.WriteLine("	<type sval=\"none\"/>");
                    tw.WriteLine("</integrator>");
                    tw.WriteLine("<integrator name=\"default5\">");
                    tw.WriteLine("	<caustics bval=\"false\"/>");
                    tw.WriteLine("	<raydepth ival=\"4\"/>");
                    tw.WriteLine("	<shadowDepth ival=\"4\"/>");
                    tw.WriteLine("	<transpShad bval=\"false\"/>");
                    tw.WriteLine("	<type sval=\"directlighting\"/>");
                    tw.WriteLine("</integrator>");
                    tw.WriteLine("<integrator name=\"volintegr\">");
                    tw.WriteLine("	<type sval=\"none\"/>");
                    tw.WriteLine("</integrator>");
                    tw.WriteLine("<integrator name=\"default6\">");
                    tw.WriteLine("	<caustics bval=\"false\"/>");
                    tw.WriteLine("	<raydepth ival=\"4\"/>");
                    tw.WriteLine("	<shadowDepth ival=\"4\"/>");
                    tw.WriteLine("	<transpShad bval=\"false\"/>");
                    tw.WriteLine("	<type sval=\"directlighting\"/>");
                    tw.WriteLine("</integrator>");
                    tw.WriteLine("<integrator name=\"volintegr\">");
                    tw.WriteLine("	<type sval=\"none\"/>");
                    tw.WriteLine("</integrator>");
                    tw.WriteLine("<integrator name=\"default7\">");
                    tw.WriteLine("	<caustics bval=\"false\"/>");
                    tw.WriteLine("	<raydepth ival=\"4\"/>");
                    tw.WriteLine("	<shadowDepth ival=\"4\"/>");
                    tw.WriteLine("	<transpShad bval=\"false\"/>");
                    tw.WriteLine("	<type sval=\"directlighting\"/>");
                    tw.WriteLine("</integrator>");
                    tw.WriteLine("<integrator name=\"volintegr\">");
                    tw.WriteLine("	<type sval=\"none\"/>");
                    tw.WriteLine("</integrator>");

                    tw.WriteLine("");
                    tw.WriteLine("<render>");
                    tw.WriteLine("	<AA_inc_samples ival=\"1\"/>");
                    tw.WriteLine("	<AA_minsamples ival=\"1\"/>");
                    tw.WriteLine("	<AA_passes ival=\"1\"/>");
                    tw.WriteLine("	<AA_pixelwidth fval=\"1.5\"/>");
                    tw.WriteLine("	<AA_threshold fval=\"0.05\"/>");
                    tw.WriteLine("	<background_name sval=\"world_background\"/>");
                    tw.WriteLine("	<camera_name sval=\"cam\"/>");
                    tw.WriteLine("	<clamp_rgb bval=\"false\"/>");
                    tw.WriteLine("	<filter_type sval=\"box\"/>");
                    tw.WriteLine("	<gamma fval=\"1.8\"/>");
                    tw.WriteLine("	<height ival=\"600\"/>");
                    tw.WriteLine("	<integrator_name sval=\"default\"/>");
                    tw.WriteLine("	<threads ival=\"1\"/>");
                    tw.WriteLine("	<volintegrator_name sval=\"volintegr\"/>");
                    tw.WriteLine("	<width ival=\"800\"/>");
                    tw.WriteLine("	<xstart ival=\"0\"/>");
                    tw.WriteLine("	<ystart ival=\"0\"/>");
                    tw.WriteLine("	<z_channel bval=\"true\"/>");
                    tw.WriteLine("</render>");
                    tw.WriteLine("</scene>");

                    tw.Close();
                    file.Close();

                    //run yafaray
                    //todo: configurable path
                    System.Diagnostics.Process objProcess = new Process();
                    ProcessStartInfo psi = new ProcessStartInfo("cmd.exe", "/c \"c:\\Program Files\\YafaRay\\yafaray-xml.exe\" scene.xml");
                    Process.Start(psi);

                    context.m_doc.Redraw();
                }

            }
            return IRhinoCommand.result.success;
        }
 public SampleCsExportOff()
 {
     _mesh_parameters = new OnMeshParameters();
       _mesh_ui_style = 0; // 0 = simple dialog
 }
Example #4
0
        /// <summary>
        /// Rhino calls WriteFile() to write document geometry to an external file.
        /// </summary>
        public override int WriteFile(string filename, int index, ref MRhinoDoc doc, ref IRhinoFileWriteOptions options)
        {
            int rc = 0; // false

            // Are we saving or exporting?
            bool bExport = options.Mode(IRhinoFileWriteOptions.ModeFlag.SelectedMode);
            // Are we in interactive or scripted mode?
            bool bScript = options.Mode(IRhinoFileWriteOptions.ModeFlag.BatchMode);

            List <IRhinoObject> objects = new List <IRhinoObject>();

            // Get objects to save/export
            MRhinoObjectIterator it = new MRhinoObjectIterator(doc, IRhinoObjectIterator.object_state.undeleted_objects);

            if (bExport)
            {
                it.EnableSelectedFilter();
                it.EnableVisibleFilter();
            }

            // Do the iteration...
            MRhinoObject obj = null;

            for (obj = it.First(); null != obj; obj = it.Next())
            {
                objects.Add(obj);
            }

            ArrayMRhinoObjectMesh meshes          = new ArrayMRhinoObjectMesh(objects.Count);
            OnMeshParameters      mesh_parameters = _mesh_parameters;
            int mesh_ui_style = (bScript) ? 2 : _mesh_ui_style;

            // Get the meshes to save/export
            IRhinoCommand.result res = RhUtil.RhinoMeshObjects(objects.ToArray(), ref mesh_parameters, ref mesh_ui_style, ref meshes);
            if (res == IRhinoCommand.result.success)
            {
                if (mesh_ui_style >= 0 && mesh_ui_style <= 1)
                {
                    _mesh_ui_style = mesh_ui_style;
                }
                _mesh_parameters = mesh_parameters;
            }
            else
            {
                if (bExport)
                {
                    RhUtil.RhinoApp().Print("No meshes to export.\n");
                }
                else
                {
                    RhUtil.RhinoApp().Print("No meshes to save.\n");
                }
                return(rc);
            }

            try
            {
                // Open the file
                System.IO.StreamWriter file = new System.IO.StreamWriter(filename);

                // Write mesh count
                file.WriteLine(string.Format("meshcount={0}\n", meshes.Count()));

                // Write each mesh
                for (int i = 0; i < meshes.Count(); i++)
                {
                    MRhinoObjectMesh obj_mesh = meshes[i];
                    OnMesh           mesh     = obj_mesh.GetMesh();
                    if (null != mesh)
                    {
                        // Write mesh number
                        file.WriteLine(string.Format("mesh={0}\n", i));

                        // Write mesh vertex count
                        file.WriteLine(string.Format("vertexcount={0}\n", mesh.m_V.Count()));

                        // Write mesh face count
                        file.WriteLine(string.Format("facecount={0}\n", mesh.m_F.Count()));

                        // Write mesh vertices
                        for (int vi = 0; vi < mesh.m_V.Count(); vi++)
                        {
                            On3fPoint p = mesh.m_V[vi];
                            file.WriteLine(string.Format("vertex=({0},{1},{2})\n", p.x, p.y, p.z));
                        }

                        // Write mesh faces
                        for (int fi = 0; fi < mesh.m_F.Count(); fi++)
                        {
                            OnMeshFace f = mesh.m_F[fi];
                            file.WriteLine(string.Format("face=({0},{1},{2},{3})\n", f.get_vi(0), f.get_vi(1), f.get_vi(2), f.get_vi(3)));
                        }
                    }
                }

                file.Close();

                rc = 1; // true
            }
            catch (Exception e)
            {
                RhUtil.RhinoApp().Print(string.Format("{0}\n", e.Message));
            }

            return(rc);
        }
Example #5
0
 /// <summary>
 /// Public constructor
 /// </summary>
 public SampleCsExportMeshPlugIn()
 {
     _mesh_parameters = new OnMeshParameters();
     _mesh_ui_style   = 0; // 0 = simple dialog
 }
        ///<summary> This gets called when when the user runs this command.</summary>
        public override IRhinoCommand.result RunCommand(IRhinoCommandContext context)
        {
            MRhinoGetObject go = new MRhinoGetObject();

            go.SetCommandPrompt("Select surface, polysurface, or mesh to export");
            go.SetGeometryFilter(IRhinoGetObject.GEOMETRY_TYPE_FILTER.surface_object | IRhinoGetObject.GEOMETRY_TYPE_FILTER.polysrf_object | IRhinoGetObject.GEOMETRY_TYPE_FILTER.mesh_object);
            go.GetObjects(1, 1);
            if (go.CommandResult() != IRhinoCommand.result.success)
            {
                return(go.CommandResult());
            }

            MRhinoObjRef obj_ref = go.Object(0);

            IRhinoObject obj = obj_ref.Object();

            if (null == obj)
            {
                return(IRhinoCommand.result.failure);
            }

            List <IRhinoObject> obj_list = new List <IRhinoObject>();

            obj_list.Add(obj);

            ArrayMRhinoObjectMesh mesh_list       = new ArrayMRhinoObjectMesh(obj_list.Count);
            OnMeshParameters      mesh_parameters = _mesh_parameters;
            int mesh_ui_style = !context.IsInteractive() ? 2 : _mesh_ui_style;

            IRhinoCommand.result res = RhUtil.RhinoMeshObjects(obj_list.ToArray(), ref mesh_parameters, ref mesh_ui_style, ref mesh_list);
            if (res == IRhinoCommand.result.success)
            {
                if (mesh_ui_style >= 0 && mesh_ui_style <= 1)
                {
                    _mesh_ui_style = mesh_ui_style;
                }
                _mesh_parameters = mesh_parameters;
            }
            else
            {
                RhUtil.RhinoApp().Print("No mesh to export.\n");
                return(res);
            }

            string filename = string.Empty;

            if (context.IsInteractive())
            {
                SaveFileDialog dialog = new SaveFileDialog();
                dialog.Title            = "Export";
                dialog.Filter           = "Geomview files|*.off";
                dialog.InitialDirectory = DirectoryManager.DefaultDirectory(DirectoryManager.FileTypes.ftExport);
                if (dialog.ShowDialog() != DialogResult.OK)
                {
                    return(IRhinoCommand.result.cancel);
                }

                filename = dialog.FileName;
            }
            else
            {
                MRhinoGetString gs = new MRhinoGetString();
                gs.SetCommandPrompt("Export file name");
                gs.GetString();
                if (gs.CommandResult() != IRhinoCommand.result.success)
                {
                    return(gs.CommandResult());
                }

                filename = gs.String().Trim();
            }

            try
            {
                OnMesh mesh = mesh_list.First().GetMesh();

                int vertex_count = mesh.VertexCount();
                int face_count   = mesh.FaceCount();
                int edge_count   = mesh.Topology().m_tope.Count();

                System.IO.StreamWriter file = new System.IO.StreamWriter(filename);

                // Write out the first line of the file header
                file.WriteLine("OFF");

                // Write the header information
                file.WriteLine(string.Format("{0} {1} {2}", vertex_count, face_count, edge_count));

                file.WriteLine();

                // Write out all the vertices in order
                for (int i = 0; i < vertex_count; i++)
                {
                    On3fPoint p = mesh.m_V[i];
                    file.WriteLine(string.Format("{0} {1} {2}", p.x.ToString("F"), p.y.ToString("F"), p.z.ToString("F")));
                }

                file.WriteLine();

                // Write out all the faces
                for (int i = 0; i < face_count; i++)
                {
                    OnMeshFace f = mesh.m_F[i];
                    if (f.IsQuad())
                    {
                        file.WriteLine(string.Format("4 {0} {1} {2} {3}", f.get_vi(0), f.get_vi(1), f.get_vi(2), f.get_vi(3)));
                    }
                    else
                    {
                        file.WriteLine(string.Format("3 {0} {1} {2}", f.get_vi(0), f.get_vi(1), f.get_vi(2)));
                    }
                }

                file.Close();
            }
            catch (Exception e)
            {
                RhUtil.RhinoApp().Print(string.Format("{0}\n", e.Message));
            }

            return(IRhinoCommand.result.success);
        }
        /// <summary>
        /// Rhino calls WriteFile() to write document geometry to an external file.
        /// </summary>
        public override int WriteFile(string filename, int index, ref MRhinoDoc doc, ref IRhinoFileWriteOptions options)
        {
            int rc = 0; // false

              // Are we saving or exporting?
              bool bExport = options.Mode(IRhinoFileWriteOptions.ModeFlag.SelectedMode);
              // Are we in interactive or scripted mode?
              bool bScript = options.Mode(IRhinoFileWriteOptions.ModeFlag.BatchMode);

              List<IRhinoObject> objects = new List<IRhinoObject>();

              // Get objects to save/export
              MRhinoObjectIterator it = new MRhinoObjectIterator(doc, IRhinoObjectIterator.object_state.undeleted_objects);
              if (bExport)
              {
            it.EnableSelectedFilter();
            it.EnableVisibleFilter();
              }

              // Do the iteration...
              MRhinoObject obj = null;
              for (obj = it.First(); null != obj; obj = it.Next())
            objects.Add(obj);

              ArrayMRhinoObjectMesh meshes = new ArrayMRhinoObjectMesh(objects.Count);
              OnMeshParameters mesh_parameters = _mesh_parameters;
              int mesh_ui_style = (bScript) ? 2 : _mesh_ui_style;

              // Get the meshes to save/export
              IRhinoCommand.result res = RhUtil.RhinoMeshObjects(objects.ToArray(), ref mesh_parameters, ref mesh_ui_style, ref meshes);
              if (res == IRhinoCommand.result.success)
              {
            if (mesh_ui_style >= 0 && mesh_ui_style <= 1)
              _mesh_ui_style = mesh_ui_style;
            _mesh_parameters = mesh_parameters;
              }
              else
              {
            if (bExport)
              RhUtil.RhinoApp().Print("No meshes to export.\n");
            else
              RhUtil.RhinoApp().Print("No meshes to save.\n");
            return rc;
              }

              try
              {
            // Open the file
            System.IO.StreamWriter file = new System.IO.StreamWriter(filename);

            // Write mesh count
            file.WriteLine(string.Format("meshcount={0}\n", meshes.Count()));

            // Write each mesh
            for (int i = 0; i < meshes.Count(); i++)
            {
              MRhinoObjectMesh obj_mesh = meshes[i];
              OnMesh mesh = obj_mesh.GetMesh();
              if (null != mesh)
              {
            // Write mesh number
            file.WriteLine(string.Format("mesh={0}\n", i));

            // Write mesh vertex count
            file.WriteLine(string.Format("vertexcount={0}\n", mesh.m_V.Count()));

            // Write mesh face count
            file.WriteLine(string.Format("facecount={0}\n", mesh.m_F.Count()));

            // Write mesh vertices
            for (int vi = 0; vi < mesh.m_V.Count(); vi++)
            {
              On3fPoint p = mesh.m_V[vi];
              file.WriteLine(string.Format("vertex=({0},{1},{2})\n", p.x, p.y, p.z));
            }

            // Write mesh faces
            for (int fi = 0; fi < mesh.m_F.Count(); fi++)
            {
              OnMeshFace f = mesh.m_F[fi];
              file.WriteLine(string.Format("face=({0},{1},{2},{3})\n", f.get_vi(0), f.get_vi(1), f.get_vi(2), f.get_vi(3)));
            }
              }
            }

            file.Close();

            rc = 1; // true
              }
              catch (Exception e)
              {
            RhUtil.RhinoApp().Print(string.Format("{0}\n", e.Message));
              }

              return rc;
        }