protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            GetObject go = new GetObject();

            go.SetCommandPrompt("Select meshes to Voronoi");
            go.GeometryFilter = Rhino.DocObjects.ObjectType.Mesh;


            go.AddOptionToggle("OutputMesh", ref outputMeshToggle);
            go.AddOptionToggle("OutputLines", ref outputLinesToggle);
            go.AddOptionToggle("OutputPolylines", ref outputPolylinesToggle);
            go.AddOptionToggle("OutputNGon", ref outputNGon);

            for (;;)
            {
                GetResult res = go.GetMultiple(1, 0);

                if (res == GetResult.Option)
                {
                    continue;
                }

                if (go.CommandResult() != Result.Success)
                {
                    return(go.CommandResult());
                }

                break;
            }

            if (go.ObjectCount < 1)
            {
                return(Result.Failure);
            }

            foreach (var obj in go.Objects())
            {
                var rhinoMesh = obj.Mesh();

                if (rhinoMesh == null || !rhinoMesh.IsValid)
                {
                    continue;
                }

                var mesh = GopherUtil.ConvertToD3Mesh(obj.Mesh());

                g3.DMesh3            outputMesh;
                List <g3.Line3d>     listLines;
                List <g3.PolyLine3d> listPolylines;
                GopherUtil.VoronoiMesh(mesh, out outputMesh, out listLines, out listPolylines);

                var rhinoOutputMesh = GopherUtil.ConvertToRhinoMesh(outputMesh);

                if (outputPolylinesToggle.CurrentValue)
                {
                    foreach (var p in listPolylines)
                    {
                        var rp = Gopher.GopherUtil.ConvertToRhinoPolyline(p);
                        doc.Objects.AddPolyline(rp);
                    }
                }

                if (outputLinesToggle.CurrentValue)
                {
                    foreach (var l in listLines)
                    {
                        var rl = GopherUtil.ConvertToRhinoLine(l);
                        doc.Objects.AddLine(rl);
                    }
                }

                if (outputMeshToggle.CurrentValue)
                {
                    if (outputNGon.CurrentValue)
                    {
                        //   rhinoOutputMesh.Ngons.AddPlanarNgons(doc.ModelAbsoluteTolerance);
                        doc.Objects.AddMesh(Gopher.GopherUtil.ConvertToRhinoMesh(listPolylines));
                    }
                    else
                    {
                        doc.Objects.AddMesh(rhinoOutputMesh);
                    }
                }
            }

            return(Result.Success);
        }