Пример #1
0
        private void buttonOpen_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Title  = "Open Scene File";
            ofd.Filter = "Wavefront OBJ Files|*.obj;*.obj.gz" + "|Polygon File Format|*.ply" +
                         "|All scene types|*.obj;*.ply";
            ofd.FilterIndex = 1;
            ofd.FileName    = "";
            if (ofd.ShowDialog() != DialogResult.OK)
            {
                return;
            }
            string ext = Path.GetExtension(ofd.FileName);

            StanfordPly  plyReader;
            WavefrontObj objReader;

            if (ext == ".ply")
            {
                plyReader = new StanfordPly();
                if (plyReader.ReadBrep(ofd.FileName, scene) == -1)
                {
                    MessageBox.Show("Invalid .ply file");
                }
            }
            else
            {
                objReader = new WavefrontObj();
                objReader.MirrorConversion  = false;
                objReader.TextureUpsideDown = checkOrientation.Checked;
                objReader.ReadBrep(ofd.FileName, scene);
            }

            scene.BuildCornerTable();
            diameter = scene.GetDiameter(out center);
            scene.GenerateColors(12);
            scene.ComputeNormals();

            UpdateParams(textParam.Text);
            tb.Center   = center;
            tb.Diameter = diameter;
            SetLight(diameter, ref light);
            tb.Reset();

            labelFile.Text = string.Format("{0} @ {1} vertices, {2} edges ({3}), {4} faces",
                                           ofd.SafeFileName, scene.Vertices,
                                           scene.statEdges, scene.statShared,
                                           scene.Triangles);
            PrepareDataBuffers();

            glControl1.Invalidate();

            // Supports point selection
            selectedPoints = new Selection(scene);
            commandManager = new CommandManager();
        }
Пример #2
0
        private void buttonExportPly_Click(object sender, EventArgs e)
        {
            if (scene == null ||
                scene.Triangles < 1)
            {
                return;
            }

            SaveFileDialog sfd = new SaveFileDialog();

            sfd.Title        = "Save file";
            sfd.Filter       = "PLY Files|*.ply" + "|OBJ Files|*.obj";
            sfd.AddExtension = true;
            sfd.FileName     = "";
            if (sfd.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            string ext = Path.GetExtension(sfd.FileName);

            switch (ext)
            {
            case ".ply":
                StanfordPly plyWriter = new StanfordPly();
                plyWriter.TextFormat    = true;
                plyWriter.NativeNewLine = true;
                plyWriter.Orientation   = checkOrientation.Checked;
                //plyWriter.DoNormals     = false;
                //plyWriter.DoTxtCoords   = false;
                plyWriter.DoColors = false;
                using (StreamWriter writer = new StreamWriter(new FileStream(sfd.FileName, FileMode.Create)))
                {
                    plyWriter.WriteBrep(writer, scene);
                }
                break;

            case ".obj":
                WavefrontObj objWriter = new WavefrontObj();
                using (StreamWriter writer = new StreamWriter(new FileStream(sfd.FileName, FileMode.Create)))
                {
                    objWriter.WriteBrep(writer, scene);
                }
                break;

            default:
                break;
            }
        }
Пример #3
0
        private void buttonExportPly_Click(object sender, EventArgs e)
        {
            if (scene == null ||
                scene.Triangles < 1)
            {
                return;
            }

            SaveFileDialog sfd = new SaveFileDialog();

            sfd.Title        = "Save OBJ/PLY file";
            sfd.Filter       = "OBJ Files|*.obj|PLY Files|*.ply";
            sfd.AddExtension = true;
            sfd.FileName     = "";
            if (sfd.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            if (sfd.FileName.EndsWith(".ply"))
            {
                // Stanford PLY format.
                StanfordPly plyWriter = new StanfordPly();
                plyWriter.TextFormat    = true;
                plyWriter.NativeNewLine = true;
                plyWriter.Orientation   = checkOrientation.Checked;
                //plyWriter.DoNormals     = false;
                //plyWriter.DoTxtCoords   = false;
                plyWriter.DoColors = false;
                using (StreamWriter writer = new StreamWriter(new FileStream(sfd.FileName, FileMode.Create)))
                {
                    plyWriter.WriteBrep(writer, scene);
                }
            }
            else
            {
                // Wavefront OBJ format.
                WavefrontObj objWriter = new WavefrontObj();
                objWriter.MirrorConversion = true;
                using (StreamWriter writer = new StreamWriter(new FileStream(sfd.FileName, FileMode.Create)))
                {
                    objWriter.WriteBrep(writer, scene);
                }
            }
        }
Пример #4
0
        private async void button_ExportSelection_Click(object sender, EventArgs e)
        {
            if (scene == null ||
                scene.Triangles < 1)
            {
                return;
            }

            if (selectedPoints.GetCount() == 0)
            {
                MessageBox.Show("No points on the source mesh are selected.");
                return;
            }

            SaveFileDialog sfd = new SaveFileDialog();

            sfd.Title        = "Save file";
            sfd.Filter       = "PLY Files|*.ply" + "|OBJ Files|*.obj";
            sfd.AddExtension = true;
            sfd.FileName     = "";
            if (sfd.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            string       ext       = Path.GetExtension(sfd.FileName);
            WavefrontObj objWriter = null;

            switch (ext)
            {
            case ".ply":
                StanfordPly plyWriter = new StanfordPly();
                plyWriter.TextFormat    = true;
                plyWriter.NativeNewLine = true;
                plyWriter.Orientation   = checkOrientation.Checked;
                plyWriter.DoColors      = false;

                handler = new WriteBrepHandler(plyWriter.WriteBrepSelection);

                break;

            case ".obj":
                objWriter = new WavefrontObj();
                handler   = new WriteBrepHandler(objWriter.WriteBrepSelection);
                break;

            default:
                break;
            }


            // lambda will be run on the UI thread
            var progress = new Progress <string>(ReportProgress);

            label_percentageReport.Text = "Saving 0%";

            // writing the file is run on the thread pool

            StreamWriter writer = null;

            stopButton.Visible = true;

            // get prepared triangle and vertex pointers
            List <int> trianglePointers = null;
            List <int> vertexPointers   = null;

            try
            {
                cts    = new CancellationTokenSource();
                writer = new StreamWriter(new FileStream(sfd.FileName, FileMode.Create));
                await Task.Run(() => handler( writer, scene, selectedPoints, progress, cts.Token, out trianglePointers, out vertexPointers ));
            }
            catch (OperationCanceledException)
            {
            }
            finally
            {
                RewriteReportLabel();
                cts = null;

                if (writer != null)
                {
                    writer.Close();
                }
            }

            // support: Export batch
            String name = null;

            if (sender is ToolStripMenuItem)
            {
                name = (sender as ToolStripMenuItem).Name;
            }
            if (name == "exportBatch")
            {
                cts = new CancellationTokenSource();
                ExportBatch eb   = new ExportBatch(vertexPointers, trianglePointers, Path.GetDirectoryName(sfd.FileName), ext);
                Task        task = new Task(() => eb.ProcessDirectory(progress, cts.Token, () => RewriteReportLabel()));
                task.RunSynchronously();
                stopButton.Visible = true;
            }
        }