示例#1
0
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            GetOption go = new GetOption();

            go.AcceptNothing(true);

            OptionToggle infoAtStartup = new OptionToggle(Properties.Settings.Default.InfoAtStartup, "Hide", "Show");

            go.AddOptionToggle("ShowInfo", ref infoAtStartup);
            go.SetCommandPrompt("Start first-person navigation");
            GetResult res = go.Get();

            while (res == GetResult.Option)
            {
                res = go.Get();
            }

            if (res != GetResult.Nothing)
            {
                return(Result.Cancel);
            }

            Properties.Settings.Default.InfoAtStartup = infoAtStartup.CurrentValue;
            Properties.Settings.Default.Save();
            Interceptor.StartWASD(infoAtStartup.CurrentValue);

            return(Result.Success);
        }
示例#2
0
        public GetAreaRectangle(double area, bool flip)
        {
            Area = new OptionDouble(area);

            AddOptionDouble("Area", ref Area);

            Flip = new OptionToggle(flip, "Right", "Left");
            AddOptionToggle("Side", ref Flip);
        }
示例#3
0
 private static void ReadOptions(OptionToggle toggleVerbose,
                                 OptionDouble spotlightFactor, OptionDouble pointlightFactor, OptionDouble sunlightFactor,
                                 OptionDouble arealightFactor, OptionDouble polishFactor)
 {
     RcCore.It.EngineSettings.Verbose          = toggleVerbose.CurrentValue;
     RcCore.It.EngineSettings.SpotlightFactor  = (float)spotlightFactor.CurrentValue;
     RcCore.It.EngineSettings.PointlightFactor = (float)pointlightFactor.CurrentValue;
     RcCore.It.EngineSettings.SunlightFactor   = (float)sunlightFactor.CurrentValue;
     RcCore.It.EngineSettings.ArealightFactor  = (float)arealightFactor.CurrentValue;
     RcCore.It.EngineSettings.PolishFactor     = (float)polishFactor.CurrentValue;
 }
示例#4
0
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            const ObjectType selFilter      = ObjectType.PolysrfFilter | ObjectType.Extrusion;
            bool             value          = false;
            double           preShrinkValue = ZERO_CM;

            OptionToggle shrinkToDimensions = new OptionToggle(value, "Off", "On");
            OptionDouble preShrink          = new OptionDouble(preShrinkValue, 0.0, 1.0);
            ObjRef       boxObjRef          = null;

            GetObject go = new GetObject();

            go.SetCommandPrompt("Select the box to net-ify");
            go.AddOptionToggle("Constrain", ref shrinkToDimensions);
            go.AddOptionDouble("PreShrink", ref preShrink, "Preshrink");
            go.GeometryFilter = selFilter;

            go.EnableClearObjectsOnEntry(true);
            go.EnableUnselectObjectsOnExit(true);

            // TODO: clean up this hot mess
            for (;;)
            {
                GetResult getObjResult = go.Get();
                if (getObjResult == GetResult.Object)
                {
                    boxObjRef = go.Object(0);
                    boxObjRef.Object().Select(on: true, syncHighlight: true);
                    go.EnablePreSelect(false, true);
                    go.AcceptNothing(true);
                    continue;
                }

                else if (getObjResult == GetResult.Cancel)
                {
                    return(Result.Cancel);
                }

                // Case where user presses enter
                else if (getObjResult == GetResult.Nothing)
                {
                    if (boxObjRef != null)
                    {
                        preShrinkValue = preShrink.CurrentValue;
                        if (preShrinkValue != ZERO_CM)
                        {
                            boxObjRef = shrinkBoxObj(boxObjRef, preShrinkValue);
                        }
                        drawNetFromObjRef(boxObjRef, doc, shrinkToDimensions.CurrentValue);
                        return(Result.Success);
                    }
                }
            }
        }
示例#5
0
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            var getNumber = new GetInteger();

            getNumber.SetLowerLimit(0, false);
            getNumber.SetUpperLimit(500, false);
            getNumber.SetDefaultInteger(RcCore.It.EngineSettings.ThrottleMs);
            getNumber.SetCommandPrompt("Set throttle (in ms)");

            var toggleVerbose = new OptionToggle(RcCore.It.EngineSettings.Verbose, "No", "Yes");

            var spotlightFactor  = new OptionDouble(RcCore.It.EngineSettings.SpotlightFactor, 0.0, 1000000.0);
            var pointlightFactor = new OptionDouble(RcCore.It.EngineSettings.PointlightFactor, 0.0, 1000000.0);
            var sunlightFactor   = new OptionDouble(RcCore.It.EngineSettings.SunlightFactor, 0.0, 1000000.0);
            var arealightFactor  = new OptionDouble(RcCore.It.EngineSettings.ArealightFactor, 0.0, 1000000.0);
            var polishFactor     = new OptionDouble(RcCore.It.EngineSettings.PolishFactor, 0.0, 1000000.0);

            getNumber.AddOptionToggle("verbose", ref toggleVerbose);

            getNumber.AddOptionDouble("spotlight_factor", ref spotlightFactor);
            getNumber.AddOptionDouble("pointlight_factor", ref pointlightFactor);
            getNumber.AddOptionDouble("sunlight_factor", ref sunlightFactor);
            getNumber.AddOptionDouble("arealight_factor", ref arealightFactor);
            getNumber.AddOptionDouble("polish_factor", ref polishFactor);


            while (true)
            {
                var getRc = getNumber.Get();
                if (getNumber.CommandResult() != Result.Success)
                {
                    return(getNumber.CommandResult());
                }
                switch (getRc)
                {
                case GetResult.Nothing:
                case GetResult.Number:
                    RcCore.It.EngineSettings.ThrottleMs = getNumber.Number();
                    ReadOptions(toggleVerbose, spotlightFactor, pointlightFactor, sunlightFactor, arealightFactor, polishFactor);
                    break;

                case GetResult.Option:
                    ReadOptions(toggleVerbose, spotlightFactor, pointlightFactor, sunlightFactor, arealightFactor, polishFactor);
                    continue;

                default:
                    continue;
                }

                break;
            }
            return(Result.Success);
        }
示例#6
0
        /// <summary>
        /// Initialize the values of the element
        /// </summary>
        /// <param name="absoluteTolerance">Absolute tolerance of the rhino document</param>
        /// <param name="isScripted">Are we running from a non-dynamic environment?</param>
        public void Initialize(double absoluteTolerance, bool isScripted)
        {
            EnableTransparentCommands(true);

            _tolerance            = new OptionDouble(absoluteTolerance / 10, RhinoMath.ZeroTolerance, double.MaxValue);
            _dynamicPreviewToggle = new OptionToggle(!isScripted, "Disabled", "Enabled");
            _evenOdd = new OptionToggle(true, "NonZero", "evenOdd");
            AddOptionEnum("BooleanType", BooleanType.Difference);
            AddOptionEnum("ProjectTo", ProjectToCplane.CPlane);
            AddOptionDouble("Tolerance", ref _tolerance, "Tolerance");
            AddOptionToggle("DynamicPreview", ref _dynamicPreviewToggle);
            AddOptionToggle("FillingRule", ref _evenOdd);
            AcceptNothing(true);
        }
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            this.widthOpt       = new OptionInteger(Properties.Settings.Default.Width);
            this.heightOpt      = new OptionInteger(Properties.Settings.Default.Height);
            this.dpiOpt         = new OptionInteger(Properties.Settings.Default.DPI);
            this.ratioToggle    = new OptionToggle(Properties.Settings.Default.KeepRatio, "Yes", "No");
            this.gridAxesToggle = new OptionToggle(Properties.Settings.Default.GridAndAxes, "Hide", "Show");
            this.portraitToggle = new OptionToggle(Properties.Settings.Default.Portrait, "Landscape", "Portrait");

            GetOption go = new GetOption();

            go.AcceptNothing(true);

            int selectedResolution = Properties.Settings.Default.Resolution;

            this.RestoreOptions(ref go, selectedResolution);

            GetResult res = go.Get();

            while (res == GetResult.Option)
            {
                if (go.Option().CurrentListOptionIndex >= 0)
                {
                    selectedResolution = go.Option().CurrentListOptionIndex;
                }

                this.RestoreOptions(ref go, selectedResolution);
                res = go.Get();
            }

            if (res != GetResult.Nothing)
            {
                return(Result.Cancel);
            }

            Properties.Settings.Default.Resolution  = selectedResolution;
            Properties.Settings.Default.Width       = widthOpt.CurrentValue;
            Properties.Settings.Default.Height      = heightOpt.CurrentValue;
            Properties.Settings.Default.KeepRatio   = ratioToggle.CurrentValue;
            Properties.Settings.Default.GridAndAxes = gridAxesToggle.CurrentValue;
            Properties.Settings.Default.Portrait    = portraitToggle.CurrentValue;
            Properties.Settings.Default.Save();

            RhinoHelpers.CustomScreenshot();

            return(Result.Success);
        }
示例#8
0
        public static void Main()
        {
            // SozCore.IngressPoint.AddRequiredTechComponent(typeof(TargetManager));
            // .WriteLine("Assume added TargetManager as requried component");

            // WeaponAimMod.src.WrappedDataHolder.unitGravity = Physics.gravity;
            // WeaponAimMod.src.WrappedDataHolder.gravityMagnitude = Physics.gravity.magnitude;
            // WeaponAimMod.src.WrappedDataHolder.unitGravity.Normalize();
            HarmonyInstance.Create("flsoz.ttmm.weaponaim.mod").PatchAll(Assembly.GetExecutingAssembly());

            // mod Config
            Config = new ModConfig();
            Config.BindConfig <WeaponAimSettings>(null, "PlayerLead");        // Using BindConfig will set UseRef as true, changing some methods to work with the RefList.
            Config.BindConfig <WeaponAimSettings>(null, "EnemyLead");         // If 'Setting2' was loaded from the config.json, it will apply the variable to the field.
            Config.BindConfig <WeaponAimSettings>(null, "SmartMissile");      // Using BindConfig will set UseRef as true, changing some methods to work with the RefList.
            Config.BindConfig <WeaponAimSettings>(null, "PlayerMissileLead"); // If 'Setting2' was loaded from the config.json, it will apply the variable to the field.
            Config.BindConfig <WeaponAimSettings>(null, "EnemyMissileLead");  // If 'Setting2' was loaded from the config.json, it will apply the variable to the field.
            Config.BindConfig <WeaponAimSettings>(null, "BallisticMissile");  // If 'Setting2' was loaded from the config.json, it will apply the variable to the field.
            // Config.BindConfig<WeaponAimSettings>(null, "AutoSetFuse"); // If 'Setting2' was loaded from the config.json, it will apply the variable to the field.
            Config.BindConfig <WeaponAimSettings>(null, "OctantAim");         // If 'Setting2' was loaded from the config.json, it will apply the variable to the field.

            // UI
            PlayerLead = new OptionToggle("Player leading", ModName, WeaponAimSettings.PlayerLead);
            PlayerLead.onValueSaved.AddListener(() => { WeaponAimSettings.PlayerLead = PlayerLead.SavedValue; Config.WriteConfigJsonFile(); });

            EnemyLead = new OptionToggle("Enemy leading", ModName, WeaponAimSettings.EnemyLead);
            EnemyLead.onValueSaved.AddListener(() => { WeaponAimSettings.EnemyLead = EnemyLead.SavedValue; Config.WriteConfigJsonFile(); });

            EnemyMissileLead = new OptionToggle("Enemy-fired missile leading", ModName, WeaponAimSettings.EnemyMissileLead);
            EnemyMissileLead.onValueSaved.AddListener(() => { WeaponAimSettings.EnemyMissileLead = EnemyMissileLead.SavedValue; Config.WriteConfigJsonFile(); });

            PlayerMissileLead = new OptionToggle("Player-fired missile leading", ModName, WeaponAimSettings.PlayerMissileLead);
            PlayerMissileLead.onValueSaved.AddListener(() => { WeaponAimSettings.PlayerMissileLead = PlayerMissileLead.SavedValue; Config.WriteConfigJsonFile(); });

            SmartMissile = new OptionToggle("Smart missiles", ModName, WeaponAimSettings.SmartMissile);
            SmartMissile.onValueSaved.AddListener(() => { WeaponAimSettings.SmartMissile = SmartMissile.SavedValue; Config.WriteConfigJsonFile(); });

            BallisticMissile = new OptionToggle("Ballistic missiles", ModName, WeaponAimSettings.BallisticMissile);
            BallisticMissile.onValueSaved.AddListener(() => { WeaponAimSettings.BallisticMissile = BallisticMissile.SavedValue; Config.WriteConfigJsonFile(); });

            // AutoSetFuse = new OptionToggle("All weapons timed fuse", ModName, WeaponAimSettings.AutoSetFuse);
            // AutoSetFuse.onValueSaved.AddListener(() => { WeaponAimSettings.AutoSetFuse = AutoSetFuse.SavedValue; Config.WriteConfigJsonFile(); });

            OctantAim = new OptionToggle("Independent Targeting", ModName, WeaponAimSettings.OctantAim);
            OctantAim.onValueSaved.AddListener(() => { WeaponAimSettings.OctantAim = OctantAim.SavedValue; Config.WriteConfigJsonFile(); });
        }
示例#9
0
        /// <summary>
        /// Initializes the specified absolute tolerance.
        /// </summary>
        /// <param name="absoluteTolerance">The absolute tolerance.</param>
        /// <param name="isScripted">if set to <c>true</c> [is scripted].</param>
        public void Initialize(double absoluteTolerance, bool isScripted)
        {
            EnableTransparentCommands(true);

            _offsetDistance       = new OptionDouble(10, absoluteTolerance, double.MaxValue);
            _tolerance            = new OptionDouble(absoluteTolerance / 10, RhinoMath.ZeroTolerance, double.MaxValue);
            _arcTolerance         = new OptionDouble(0.25, RhinoMath.ZeroTolerance, double.MaxValue);
            _miter                = new OptionDouble(1, RhinoMath.ZeroTolerance, double.MaxValue);
            _dynamicPreviewToggle = new OptionToggle(!isScripted, "Disabled", "Enabled");
            AddOptionDouble("Distance", ref _offsetDistance, "Distance");
            AddOptionDouble("Tolerance", ref _tolerance, "Tolerance");
            AddOptionEnum("Side", Side.Both);
            AddOptionEnum("OpenFillet", Polyline3D.OpenFilletType.Butt);
            AddOptionEnum("ClosedFillet", Polyline3D.ClosedFilletType.Square);
            AddOptionDouble("Miter", ref _miter, "Miter");
            AddOptionDouble("ArcTolerance", ref _arcTolerance, "ArcTolerance");
            AddOptionEnum("ProjectTo", ProjectToCplane.CPlane);
            AddOptionToggle("DynamicPreview", ref _dynamicPreviewToggle);
            AcceptNothing(true);
        }
示例#10
0
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            // Get persistent settings (from Registry)
            PersistentSettings settings = this.PlugIn.Settings;
            bool save_settings          = false;
            bool enabled = settings.GetBool("enabled", true);
            bool new_layer_visible_in_layout = settings.GetBool("new_layer_visible_in_layout", false);

            GetOption    go = new GetOption();
            OptionToggle option_toggle_enabled = new OptionToggle(enabled, "off", "on");
            OptionToggle option_toggle_newLayerLayoutVisible = new OptionToggle(new_layer_visible_in_layout, "off", "on");

            go.AddOptionToggle("enabled", ref option_toggle_enabled);
            go.AddOptionToggle("new_layer_visible_in_layout", ref option_toggle_newLayerLayoutVisible);
            go.SetCommandPrompt("Safe Layout Settings");

            Rhino.Input.GetResult get_rc = go.Get();
            Result rc = go.CommandResult();

            if (enabled != option_toggle_enabled.CurrentValue)
            {
                enabled = option_toggle_enabled.CurrentValue;
                settings.SetBool("enabled", enabled);
                save_settings = true;
            }
            if (new_layer_visible_in_layout != option_toggle_newLayerLayoutVisible.CurrentValue)
            {
                new_layer_visible_in_layout = option_toggle_newLayerLayoutVisible.CurrentValue;
                settings.SetBool("new_layer_visible_in_layout", new_layer_visible_in_layout);
                save_settings = true;
            }

            if (save_settings)
            {
                this.PlugIn.SaveSettings();
            }

            return(rc);
        }
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            using (var go = new GetObject())
            {
                go.SetCommandPrompt("Please select closed objects for converting to Honeybee Room");

                //Only Brep is accepted, because we need to save meta data to sub-surface as well.
                //Extrusion doesn't have sub-surface.
                //all extrusion will be converted to Brep.
                go.GeometryFilter = ObjectType.Brep | ObjectType.Extrusion;
                go.EnableClearObjectsOnEntry(false);
                go.EnableUnselectObjectsOnExit(false);
                go.DeselectAllBeforePostSelect = false;

                //check if any brep has been converted to Room
                var optionSkipExistingRoom_toggle = new OptionToggle(true, "No_RecreateAllRooms", "Yes");
                while (true)
                {
                    go.ClearCommandOptions();
                    go.AddOptionToggle("SkipExistingRoom", ref optionSkipExistingRoom_toggle);
                    var rc = go.GetMultiple(1, 0);
                    if (rc == GetResult.Option)
                    {
                        go.EnablePreSelect(false, true);
                        continue;
                    }
                    else if (rc != GetResult.Object)
                    {
                        return(Result.Cancel);
                    }
                    if (go.ObjectsWerePreselected)
                    {
                        go.EnablePreSelect(false, true);
                        continue;
                    }
                    break;
                }

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

                if (go.ObjectCount == 0)
                {
                    return(Result.Nothing);
                }

                var ifSkip = optionSkipExistingRoom_toggle.CurrentValue;

                //Getting objects
                var solidBreps      = go.Objects().Where(_ => _.Brep() != null).Where(_ => _.Brep().IsSolid);
                var objectToConvert = solidBreps;
                if (ifSkip)
                {
                    objectToConvert = solidBreps.Where(_ => !_.IsRoom()).ToList();
                }

                ConvertToRoom(doc, objectToConvert);

                doc.Views.Redraw();

                var count = objectToConvert.Count();
                var msg   = count > 1 ? $"{count} Honeybee rooms were created successfully!" : $"{count} Honeybee room was created successfully!";
                RhinoApp.WriteLine(msg);
                return(Result.Success);
            }
        }
示例#12
0
 public void SetWallMode(int mode) => wallMode = (OptionToggle)mode;
示例#13
0
        /// <summary>
        /// Command.RunCommand override
        /// </summary>
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            Potrace.Clear();

            // Prompt the user for the name of the image file to vectorize.
            string path = GetImageFileName(mode);

            if (string.IsNullOrEmpty(path))
            {
                return(Result.Cancel);
            }

            // Creates a bitmap from the specified file.
            var bitmap = Image.FromFile(path) as Bitmap;

            if (null == bitmap)
            {
                RhinoApp.WriteLine("The specified file cannot be identifed as a supported type.");
                return(Result.Failure);
            }

            // Verify bitmap size
            if (0 == bitmap.Width || 0 == bitmap.Height)
            {
                RhinoApp.WriteLine("Error reading the specified file.");
                return(Result.Failure);
            }

            // Calculate scale factor so curves of a reasonable size are added to Rhino
            var unit_scale = (doc.ModelUnitSystem != UnitSystem.Inches)
        ? RhinoMath.UnitScale(UnitSystem.Inches, doc.ModelUnitSystem)
        : 1.0;
            var scale = (double)(1.0 / bitmap.HorizontalResolution * unit_scale);

            // I'm not convinced this is useful...
            if (true)
            {
                var format = $"F{doc.DistanceDisplayPrecision}";

                // Print image size in pixels
                RhinoApp.WriteLine("Image size in pixels: {0} x {1}",
                                   bitmap.Width,
                                   bitmap.Height
                                   );

                // Print image size in inches
                var width  = (double)(bitmap.Width / bitmap.HorizontalResolution);
                var height = (double)(bitmap.Height / bitmap.VerticalResolution);
                RhinoApp.WriteLine("Image size in inches: {0} x {1}",
                                   width.ToString(format, CultureInfo.InvariantCulture),
                                   height.ToString(format, CultureInfo.InvariantCulture)
                                   );

                // Image size in in model units, if needed
                if (doc.ModelUnitSystem != UnitSystem.Inches)
                {
                    width  = (double)(bitmap.Width / bitmap.HorizontalResolution * unit_scale);
                    height = (double)(bitmap.Height / bitmap.VerticalResolution * unit_scale);
                    RhinoApp.WriteLine("Image size in {0}: {1} x {2}",
                                       doc.ModelUnitSystem.ToString().ToLower(),
                                       width.ToString(format, CultureInfo.InvariantCulture),
                                       height.ToString(format, CultureInfo.InvariantCulture)
                                       );
                }
            }

            // Convert the bitmap to an Eto bitmap
            var eto_bitmap = ConvertBitmapToEto(bitmap);

            if (null == eto_bitmap)
            {
                RhinoApp.WriteLine("Unable to convert image to Eto bitmap.");
                return(Result.Failure);
            }

            // 12-Jan-2021 Dale Fugier
            // This should prevent Eto.Drawing.BitmapData.GetPixels() from throwing an exception
            if (!IsCompatibleBitmap(eto_bitmap))
            {
                RhinoApp.WriteLine("The image has an incompatible pixel format. Please select an image with 24 or 32 bits per pixel, or 8 bit indexed.");
                return(Result.Failure);
            }

            // This bitmap is not needed anymore, so dispose of it
            bitmap.Dispose();

            // Gets the Potrace settings from the plug-in settings file
            GetPotraceSettings();

            // Create the conduit, which does most of the work
            var conduit = new VectorizeConduit(
                eto_bitmap,
                scale,
                doc.ModelAbsoluteTolerance,
                m_select_output
          ? Rhino.ApplicationSettings.AppearanceSettings.SelectedObjectColor
          : doc.Layers.CurrentLayer.Color
                )
            {
                Enabled = true
            };

            if (mode == RunMode.Interactive)
            {
                // Show the interactive dialog box
                var dialog = new VectorizeDialog(doc, conduit);
                dialog.RestorePosition();
                var result = dialog.ShowSemiModal(doc, RhinoEtoApp.MainWindow);
                dialog.SavePosition();
                if (result != Result.Success)
                {
                    conduit.Enabled = false;
                    Potrace.Clear();
                    doc.Views.Redraw();
                    return(Result.Cancel);
                }
            }
            else
            {
                // Show the command line options
                var go = new GetOption();
                go.SetCommandPrompt("Vectorization options. Press Enter when done");
                go.AcceptNothing(true);
                while (true)
                {
                    conduit.TraceBitmap();
                    doc.Views.Redraw();

                    go.ClearCommandOptions();

                    // IgnoreArea
                    var turdsize_opt = new OptionInteger(Potrace.turdsize, 2, 100);
                    var turdsize_idx = go.AddOptionInteger("FilterSize", ref turdsize_opt, "Filter speckles of up to this size in pixels");

                    // TurnPolicy
                    var turnpolicy_idx = go.AddOptionEnumList("TurnPolicy", Potrace.turnpolicy);

                    // Optimizing
                    var curveoptimizing_opt = new OptionToggle(Potrace.curveoptimizing, "No", "Yes");
                    var curveoptimizing_idx = go.AddOptionToggle("Optimizing", ref curveoptimizing_opt);

                    // Tolerance
                    var opttolerance_opt = new OptionDouble(Potrace.opttolerance, 0.0, 1.0);
                    var opttolerance_idx = go.AddOptionDouble("Tolerance", ref opttolerance_opt, "Optimizing tolerance");

                    // CornerThreshold
                    var alphamax_opt = new OptionDouble(Potrace.alphamax, 0.0, 100.0);
                    var alphamax_idx = go.AddOptionDouble("CornerRounding", ref alphamax_opt, "Corner rounding threshold");

                    // Threshold
                    var threshold_opt = new OptionDouble(Potrace.Treshold, 0.0, 100.0);
                    var threshold_idx = go.AddOptionDouble("Threshold", ref threshold_opt, "Threshold");

                    // RestoreDefaults
                    var defaults_idx = go.AddOption("RestoreDefaults");

                    var res = go.Get();

                    if (res == GetResult.Option)
                    {
                        var option = go.Option();
                        if (null != option)
                        {
                            if (turdsize_idx == option.Index)
                            {
                                Potrace.turdsize = turdsize_opt.CurrentValue;
                            }

                            if (turnpolicy_idx == option.Index)
                            {
                                var list = Enum.GetValues(typeof(TurnPolicy)).Cast <TurnPolicy>().ToList();
                                Potrace.turnpolicy = list[option.CurrentListOptionIndex];
                            }

                            if (curveoptimizing_idx == option.Index)
                            {
                                Potrace.curveoptimizing = curveoptimizing_opt.CurrentValue;
                            }

                            if (opttolerance_idx == option.Index)
                            {
                                Potrace.opttolerance = opttolerance_opt.CurrentValue;
                            }

                            if (alphamax_idx == option.Index)
                            {
                                Potrace.alphamax = alphamax_opt.CurrentValue;
                            }

                            if (threshold_idx == option.Index)
                            {
                                Potrace.Treshold = threshold_opt.CurrentValue;
                            }

                            if (defaults_idx == option.Index)
                            {
                                Potrace.RestoreDefaults();
                            }
                        }
                        continue;
                    }

                    if (res != GetResult.Nothing)
                    {
                        conduit.Enabled = false;
                        doc.Views.Redraw();
                        Potrace.Clear();
                        return(Result.Cancel);
                    }

                    break;
                }
            }

            // Group curves
            var attributes = doc.CreateDefaultAttributes();

            attributes.AddToGroup(doc.Groups.Add());
            for (var i = 0; i < conduit.OutlineCurves.Count; i++)
            {
                var rhobj_id = doc.Objects.AddCurve(conduit.OutlineCurves[i], attributes);
                if (m_select_output)
                {
                    var rhobj = doc.Objects.Find(rhobj_id);
                    if (null != rhobj)
                    {
                        rhobj.Select(true);
                    }
                }
            }

            conduit.Enabled = false;
            Potrace.Clear();
            doc.Views.Redraw();

            // Set the Potrace settings to the plug -in settings file.
            SetPotraceSettings();

            return(Result.Success);
        }
示例#14
0
        public static void Load()
        {
            config = new ModConfig();
            foreach (FieldInfo f in typeof(MoreOptionsMod).GetFields(BindingFlags.Static | BindingFlags.NonPublic).Where(f => f.Name.EndsWith("Bool")))
            {
                config.BindConfig(null, f);
            }

            var harmony = new Harmony("exund.moreoptions");

            harmony.PatchAll(Assembly.GetExecutingAssembly());

            var modName = "More Options";
            //doProcessFire = new OptionToggle("Process Fire", modName, doProcessFireBool);
            var displayMuzzleFlashes         = new OptionToggle("Muzzle Flashes", modName, displayMuzzleFlashesBool);
            var displayBulletsCasing         = new OptionToggle("Bullets Casing", modName, displayBulletsCasingBool);
            var displaySmokeTrails           = new OptionToggle("Smoke Trails", modName, displaySmokeTrailsBool);
            var displayHoverEffects          = new OptionToggle("Hover Effects", modName, displayHoverEffectsBool);
            var displayRemoteChargersEffects = new OptionToggle("Remote Chargers Effects", modName, displayRemoteChargersEffectsBool);
            var displayHolderBeams           = new OptionToggle("Holder Beams", modName, displayHolderBeamsBool);
            var displayThrustersEffects      = new OptionToggle("Thrusters Effects", modName, displayThrustersEffectsBool);
            var displayMissileSmoke          = new OptionToggle("Missile Smoke", modName, displayMissileSmokeBool);
            var displayProjectileExplosions  = new OptionToggle("Projectile Explosions", modName, displayProjectileExplosionsBool);
            var displayBlockExplosions       = new OptionToggle("Block Explosions", modName, displayBlockExplosionsBool);
            var displayAntennaGlow           = new OptionToggle("Antenna Glow", modName, displayAntennaGlowBool);
            var antigravMatSwap = new OptionToggle("Antigrav color pulse", modName, antigravMatSwapBool);
            var displayBubbles  = new OptionToggle("Bubbles (shield, healing)", modName, displayBubblesBool);


            /*doProcessFire.onValueSaved.AddListener(() =>
             * {
             *      doProcessFireBool = doProcessFire.SavedValue;
             * });*/
            displayMuzzleFlashes.onValueSaved.AddListener(() =>
            {
                displayMuzzleFlashesBool = displayMuzzleFlashes.SavedValue;
            });
            displayBulletsCasing.onValueSaved.AddListener(() =>
            {
                displayBulletsCasingBool = displayBulletsCasing.SavedValue;
            });
            displaySmokeTrails.onValueSaved.AddListener(() =>
            {
                displaySmokeTrailsBool = displaySmokeTrails.SavedValue;
            });
            displayHoverEffects.onValueSaved.AddListener(() =>
            {
                displayHoverEffectsBool = displayHoverEffects.SavedValue;
            });
            displayRemoteChargersEffects.onValueSaved.AddListener(() =>
            {
                displayRemoteChargersEffectsBool = displayRemoteChargersEffects.SavedValue;
            });
            displayHolderBeams.onValueSaved.AddListener(() =>
            {
                displayHolderBeamsBool = displayHolderBeams.SavedValue;
            });
            displayThrustersEffects.onValueSaved.AddListener(() =>
            {
                displayThrustersEffectsBool = displayThrustersEffects.SavedValue;
            });
            displayMissileSmoke.onValueSaved.AddListener(() =>
            {
                displayMissileSmokeBool = displayMissileSmoke.SavedValue;
            });
            displayProjectileExplosions.onValueSaved.AddListener(() =>
            {
                displayProjectileExplosionsBool = displayProjectileExplosions.SavedValue;
            });
            displayBlockExplosions.onValueSaved.AddListener(() =>
            {
                displayBlockExplosionsBool = displayBlockExplosions.SavedValue;
            });
            displayAntennaGlow.onValueSaved.AddListener(() =>
            {
                displayAntennaGlowBool = displayAntennaGlow.SavedValue;
            });
            antigravMatSwap.onValueSaved.AddListener(() =>
            {
                antigravMatSwapBool = antigravMatSwap.SavedValue;
            });
            displayBubbles.onValueSaved.AddListener(() =>
            {
                displayBubblesBool = displayBubbles.SavedValue;
            });

            NativeOptionsMod.onOptionsSaved.AddListener(() =>
            {
                config.WriteConfigJsonFile();
            });
        }
示例#15
0
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            Result    rc  = Result.Nothing;
            GetResult res = GetResult.Nothing;

            // Select objects to rotate
            TransformObjectList list = new TransformObjectList();

            rc = SelectObjects("Select objects to transform", list);
            if (rc != Result.Success)
            {
                return(rc);
            }

            OptionToggle opt_xset = new OptionToggle(true, "No", "Yes");
            OptionToggle opt_yset = new OptionToggle(true, "No", "Yes");
            OptionToggle opt_zset = new OptionToggle(true, "No", "Yes");

            // Second reference point
            GetSetPointTransform gx = new GetSetPointTransform(true, true, true);

            gx.SetCommandPrompt("Location for points");
            gx.AddTransformObjects(list);
            for (;;)
            {
                gx.ClearCommandOptions();
                gx.AddOptionToggle("XSet", ref opt_xset);
                gx.AddOptionToggle("YSet", ref opt_yset);
                gx.AddOptionToggle("ZSet", ref opt_zset);

                res = gx.GetXform();

                if (res == GetResult.Point)
                {
                    RhinoView view = gx.View();
                    rc = (null != view) ? Result.Success : Result.Failure;
                    if (rc == Result.Success)
                    {
                        Transform xform = gx.CalculateTransform(view.ActiveViewport, gx.Point());
                        rc = (xform.IsValid) ? Result.Success : Result.Failure;
                        if (rc == Result.Success)
                        {
                            TransformObjects(list, xform, false, false);
                            doc.Views.Redraw();
                        }
                    }
                }
                else if (res == GetResult.Option)
                {
                    gx.SetX = opt_xset.CurrentValue;
                    gx.SetY = opt_yset.CurrentValue;
                    gx.SetZ = opt_zset.CurrentValue;
                    continue;
                }
                else
                {
                    rc = Result.Cancel;
                }

                break;
            }

            return(rc);
        }
示例#16
0
    public static Result ExtractIsoCurve(RhinoDoc doc)
    {
        ObjRef obj_ref;
        var    rc = RhinoGet.GetOneObject("Select surface", false, ObjectType.Surface, out obj_ref);

        if (rc != Result.Success || obj_ref == null)
        {
            return(rc);
        }
        var surface = obj_ref.Surface();

        var gp = new GetPoint();

        gp.SetCommandPrompt("Point on surface");
        gp.Constrain(surface, false);
        var option_toggle = new OptionToggle(false, "U", "V");

        gp.AddOptionToggle("Direction", ref option_toggle);
        Point3d point = Point3d.Unset;

        while (true)
        {
            var grc = gp.Get();
            if (grc == GetResult.Option)
            {
                continue;
            }
            else if (grc == GetResult.Point)
            {
                point = gp.Point();
                break;
            }
            else
            {
                return(Result.Nothing);
            }
        }
        if (point == Point3d.Unset)
        {
            return(Result.Nothing);
        }

        int    direction = option_toggle.CurrentValue ? 1 : 0; // V : U
        double u_parameter, v_parameter;

        if (!surface.ClosestPoint(point, out u_parameter, out v_parameter))
        {
            return(Result.Failure);
        }

        var iso_curve = surface.IsoCurve(direction, direction == 1 ? u_parameter : v_parameter);

        if (iso_curve == null)
        {
            return(Result.Failure);
        }

        doc.Objects.AddCurve(iso_curve);
        doc.Views.Redraw();
        return(Result.Success);
    }
示例#17
0
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            SearchMode sm = SearchMode.CurveLength;

            Curve[]      curves;
            OptionToggle tog = new OptionToggle(false, "Hide", "Show");
            OptionDouble tol = new OptionDouble(RhinoDoc.ActiveDoc.ModelAbsoluteTolerance, true, 0.0);

            using (CurvesGetter getLines = new CurvesGetter("Select curves meeting at endpoints. Press Enter when done"))
            {
                for ( ; ;)
                {
                    getLines.ClearCommandOptions();
                    getLines.EnableClearObjectsOnEntry(false);
                    int showInt = getLines.AddOptionToggle("Topology", ref tog);
                    int tolInt  = getLines.AddOptionDouble("Tolerance", ref tol);
                    int modeInt = GetterExtension.AddEnumOptionList(getLines, sm);

                    if (getLines.Curves(1, 0, out curves))
                    {
                        break;
                    }
                    else
                    {
                        if (getLines.Result() == GetResult.Option)
                        {
                            if (getLines.Option().Index == modeInt)
                            {
                                sm = GetterExtension.RetrieveEnumOptionValue <SearchMode>
                                         (getLines.Option().CurrentListOptionIndex);
                            }
                            continue;
                        }
                        else
                        {
                            RhinoApp.WriteLine("Less than three lines were selected");
                            return(Result.Cancel);
                        }
                    }
                }
            }
            CurvesTopology crvTopology = new CurvesTopology(curves, tol.CurrentValue);

            Guid[] ids = null;
            if (tog.CurrentValue)
            {
                ids = CurvesTopologyPreview.Mark(crvTopology, Color.LightBlue, Color.LightCoral);
            }

            int walkFromIndex;

            using (var getStart = new TrackingPointGetter("Select the start point of the walk on the curves", crvTopology))
            {
                if (getStart.GetPointOnTopology(out walkFromIndex) != Result.Success)
                {
                    EndOperations(ids);
                    return(Result.Cancel);
                }
            }

            Result wasSuccessful = Result.Cancel;

            for (; ;)
            {
                int      walkToIndex;
                double[] distances;
                using (var getEnd = new TrackingPointGetter("Select the end point", crvTopology, walkFromIndex, sm))
                {
                    if (getEnd.GetPointOnTopology(out walkToIndex) != Result.Success)
                    {
                        break;
                    }
                    distances = getEnd.DistanceCache;
                }

                if (walkFromIndex == walkToIndex)
                {
                    RhinoApp.WriteLine("Start and end points are equal");
                    EndOperations(ids);
                    return(Result.Nothing);
                }

                PathMethod pathSearch = PathMethod.FromMode(sm, crvTopology, distances);

                int[]  nIndices, eIndices;
                bool[] eDirs;
                double totLength;
                Curve  c =
                    pathSearch.Cross(walkFromIndex, walkToIndex, out nIndices, out eIndices, out eDirs, out totLength);

                if (c != null && c.IsValid)
                {
                    if (tog.CurrentValue)
                    {
                        RhinoApp.WriteLine("Vertices: {0}", FormatNumbers(nIndices));
                        RhinoApp.WriteLine("Edges: {0}", FormatNumbers(eIndices));
                    }

                    var  a = RhinoDoc.ActiveDoc.CreateDefaultAttributes();
                    Guid g = RhinoDoc.ActiveDoc.Objects.AddCurve(c, a);

                    var obj = RhinoDoc.ActiveDoc.Objects.Find(g);
                    if (obj != null)
                    {
                        obj.Select(true);
                        wasSuccessful = Result.Success;
                        walkFromIndex = walkToIndex;
                    }
                    else
                    {
                        RhinoApp.WriteLine("An error occurred while adding the new polycurve.");
                        wasSuccessful = Result.Failure;
                        break;
                    }
                }
                else
                {
                    RhinoApp.WriteLine("No path was found. Nodes are isolated.");
                    wasSuccessful = Result.Nothing;
                }
            }

            EndOperations(ids);
            return(wasSuccessful);
        }
示例#18
0
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            var ptPuffynessOption       = new OptionToggle(m_PointPuffyness, "False", "True");
            var ptOffsetOption          = new OptionDouble(m_PuffynessOffset, 0.5, double.PositiveInfinity);
            var ptBorderPuffynessOption = new OptionToggle(m_BorderPuffyness, "False", "True");
            var borderOffsetOption      = new OptionDouble(m_BorderOffset, 0.5, double.PositiveInfinity);

            var go = new GetOption();

            go.SetCommandPrompt("Get meshing properties");
            go.AcceptNothing(true);
            go.AcceptEnterWhenDone(true);

            int ptPuffyOptionIndex      = go.AddOptionToggle("PointPuffyness", ref ptPuffynessOption);
            int offsetOptionIndex       = go.AddOptionDouble("OffsetPtPuffy", ref ptOffsetOption);
            int borderPuffyOptionIndex  = go.AddOptionToggle("BorderPuffyness", ref ptBorderPuffynessOption);
            int borderOffsetOptionIndex = go.AddOptionDouble("OffsetBorderPuffy", ref borderOffsetOption);

            go.Get();
            var result = go.Result();

            while (result != GetResult.Nothing)
            {
                if (result == GetResult.Cancel)
                {
                    return(Result.Cancel);
                }

                int optionIdx = go.OptionIndex();
                if (optionIdx == ptPuffyOptionIndex)
                {
                    m_PointPuffyness = ptPuffynessOption.CurrentValue;
                }
                else if (optionIdx == offsetOptionIndex)
                {
                    m_PuffynessOffset = ptOffsetOption.CurrentValue;
                }
                else if (optionIdx == borderPuffyOptionIndex)
                {
                    m_BorderPuffyness = ptBorderPuffynessOption.CurrentValue;
                }
                else if (optionIdx == borderOffsetOptionIndex)
                {
                    m_BorderOffset = borderOffsetOption.CurrentValue;
                }

                result = go.Get();
            }

            ObjRef[] rhObjects;
            var      res = RhinoGet.GetMultipleObjects("Select planar curves and Weight points", false, Rhino.DocObjects.ObjectType.Curve | Rhino.DocObjects.ObjectType.Point, out rhObjects);

            if (res == Result.Success)
            {
                // 1. subdive in sets: Closed curves, Opened Curves, weight points;
                List <Curve> closed_crvs   = new List <Curve>();
                List <Curve> opened_crvs   = new List <Curve>();
                List <Point> weight_points = new List <Point>();

                bool   puffyness = m_PointPuffyness;
                double offset    = m_PuffynessOffset;

                bool   border_puffyness = m_BorderPuffyness;
                double border_offset    = m_BorderOffset;

                foreach (var ref_obj in rhObjects)
                {
                    RhinoObject obj = ref_obj.Object();
                    if (obj.Geometry is Curve)
                    {
                        var crv = obj.Geometry as Curve;
                        if (crv.IsPlanar())
                        {
                            if (crv.IsClosed)
                            {
                                closed_crvs.Add(crv);
                            }
                            else
                            {
                                opened_crvs.Add(crv);
                            }
                        }
                    }
                    else if (obj.Geometry is Point)
                    {
                        weight_points.Add(obj.Geometry as Point);
                    }
                }

                double space = 1;

                // 2. Insert curves into mesh
                AM_Region region = null;

                Curve border_outer_crv = null;
                Curve offset_outer_crv = null;

                if (closed_crvs.Count > 0)
                {
                    region = new AM_Region();

                    for (int i = 0; i < closed_crvs.Count; i++)
                    {
                        var crv = closed_crvs[i];

                        region.AddCurve(crv, space, false);

                        AreaMassProperties area = AreaMassProperties.Compute(crv, AM_Util.FLT_EPSILON);
                        if (area.Area > 0 && border_puffyness)
                        {
                            if (border_outer_crv == null)
                            {
                                border_outer_crv = crv;
                            }

                            var offset_Crvs = crv.Offset(Plane.WorldXY, -border_offset, AM_Util.FLT_EPSILON, CurveOffsetCornerStyle.None);

                            foreach (var c in offset_Crvs)
                            {
                                c.Reverse();
                                doc.Objects.AddCurve(c);
                                offset_outer_crv = c;

                                region.AddCurve(c, space, true);
                            }
                        }
                    }
                }
                else
                {
                    // TODO
                    Debug.Assert(false);
                    return(Result.Failure);
                }

                for (int i = 0; i < weight_points.Count; i++)
                {
                    var pt = weight_points[i];

                    region.AddWeigthPoint(pt, space / 2);
                    if (puffyness && offset > 0)
                    {
                        var circle = new ArcCurve(new Circle(pt.Location, offset));
                        var nurbs  = circle.ToNurbsCurve();
                        region.AddCurve(nurbs, space / 2, true);
                    }
                }

                for (int i = 0; i < opened_crvs.Count; i++)
                {
                    var crv = opened_crvs[i];
                    region.AddCurve(crv, space, false);

                    if (puffyness && offset > 0)
                    {
                        var     n         = Vector3d.CrossProduct(crv.TangentAtStart, Vector3d.ZAxis);
                        Curve[] offsetCrv = crv.Offset(crv.PointAtStart + offset * n, Vector3d.ZAxis, offset, AM_Util.FLT_EPSILON, CurveOffsetCornerStyle.Round);

                        foreach (var c in offsetCrv)
                        {
                            doc.Objects.AddCurve(c);
                            region.AddCurve(crv, space, false);
                        }

                        Curve[] offsetCrv2 = crv.Offset(crv.PointAtStart - offset * n, Vector3d.ZAxis, offset, AM_Util.FLT_EPSILON, CurveOffsetCornerStyle.Round);

                        foreach (var c in offsetCrv2)
                        {
                            doc.Objects.AddCurve(c);
                            region.AddCurve(crv, space, false);
                        }
                    }
                }

                // 3. Mesh della regione
                if (region != null)
                {
                    if (region.BuildMesh())
                    {
                        // Inserisce i punti del contorno
                        foreach (var loop in region.Loops)
                        {
                            for (int i = 0; i < loop.NumSegments; i++)
                            {
                                var points = loop.GetGeneratedPoints(i);

                                //if (points != null) {
                                //  foreach (var p in points) {
                                //    doc.Objects.AddPoint(new Point3d(p.X, p.Y, 0));
                                //  }
                                //}
                            }
                        }
                    }

                    // Trasforma in Mesh di Rhino
                    var mesh = region.Mesh2D;

                    if (mesh != null)
                    {
                        Mesh   rhino_mesh = new Mesh();
                        double t          = 5;
                        for (int i = 0; i < mesh.ArrayVertexes.Count; i++)
                        {
                            mesh.ArrayVertexes[i].Z = t;
                        }

                        // PostProcessa il puffyness
                        if (puffyness)
                        {
                            for (int i = 0; i < region.ArrayInnerVertex.Count; i++)
                            {
                                var iv = region.ArrayInnerVertex[i];
                                if (iv.MeshVertex != null)
                                {
                                    iv.MeshVertex.Z = (4 / 5d) * t;
                                }

                                // Ricerca i punti nell'intorno fino all'offset (molto grezza!)
                                for (int j = 0; j < mesh.ArrayVertexes.Count; j++)
                                {
                                    var    v = mesh.ArrayVertexes[j];
                                    double d = (iv.MeshVertex.Coord - v.Coord).Length;
                                    if (d < offset)
                                    {
                                        double r = d / offset;

                                        AM_Util.EInterpolation interpolation = AM_Util.EInterpolation.Parabolic;
                                        v.Z = AM_Util.Interpolation(interpolation, iv.MeshVertex.Z, t, r);
                                    }
                                }
                            }
                        }

                        // Individua i punti all'interno della zona di transizione
                        List <int> transitionVts = new List <int>();

                        if (border_puffyness && border_offset > 0)
                        {
                            // Individua i vertici di partenza e utilizza u flag di lavoro
                            List <AM_Vertex> transitionStartVts = new List <AM_Vertex>();

                            for (int i = 0; i < mesh.ArrayVertexes.Count; i++)
                            {
                                var  v = mesh.ArrayVertexes[i];
                                bool is_loop_vertex = (v.Flag & 0x1) > 0;
                                v.Flag &= ~0x02;

                                if (is_loop_vertex && BelongToBorder(v))
                                {
                                    transitionStartVts.Add(v);
                                }
                            }

                            // Si usa 0x04 come flag di lavoro
                            for (int i = 0; i < mesh.ArrayWEdges.Count; i++)
                            {
                                var e                 = mesh.ArrayWEdges[i];
                                e.Edge().Flag        &= ~0x04;
                                e.Edge().Symm().Flag &= ~0x04;
                            }

                            for (int i = 0; i < transitionStartVts.Count; i++)
                            {
                                var v = transitionStartVts[i];
                                AddTransitionVertexes(v, transitionVts);
                            }

                            if (offset_outer_crv != null)
                            {
                                foreach (var iv in transitionVts)
                                {
                                    var v = mesh.ArrayVertexes[iv];

                                    double par;
                                    if (offset_outer_crv.ClosestPoint(AM_Util.To3d(v.Coord), out par, 2 * border_offset))
                                    {
                                        Point3d cp = offset_outer_crv.PointAt(par);
                                        double  r  = ((cp - AM_Util.To3d(v.Coord)).Length) / border_offset;
                                        double  z  = AM_Util.Interpolation(AM_Util.EInterpolation.Parabolic, 0.8 * t, t, 1 - r);
                                        v.Z = z;
                                    }
                                }
                            }
                        }

                        // Facce
                        int totVtx = mesh.ArrayVertexes.Count;

                        for (int iSide = 0; iSide < 2; iSide++)
                        {
                            for (int i = 0; i < mesh.ArrayVertexes.Count; i++)
                            {
                                var     v  = mesh.ArrayVertexes[i];
                                Point3d pt = v.Coord3d;
                                if (iSide == 1)
                                {
                                    pt.Z = 0;
                                }

                                rhino_mesh.Vertices.Add(pt);
                            }

                            for (int i = 0; i < mesh.ArrayFaces.Count; i++)
                            {
                                var f = mesh.ArrayFaces[i];

                                int numEdges = f.NumEdges;
                                if (numEdges == 3)
                                {
                                    int[] vtx = { f.Vertex(0).Index, f.Vertex(1).Index, f.Vertex(2).Index };
                                    if (iSide == 1)
                                    {
                                        vtx = new int[] { f.Vertex(0).Index + totVtx, f.Vertex(2).Index + totVtx, f.Vertex(1).Index + totVtx };
                                    }
                                    rhino_mesh.Faces.AddFace(vtx[0], vtx[1], vtx[2]);
                                }
                                else if (numEdges == 4)
                                {
                                    int[] vtx = { f.Vertex(0).Index, f.Vertex(1).Index, f.Vertex(2).Index, f.Vertex(3).Index };
                                    if (iSide == 1)
                                    {
                                        vtx = new int[] { f.Vertex(0).Index + totVtx, f.Vertex(3).Index + totVtx, f.Vertex(2).Index + totVtx, f.Vertex(1).Index + totVtx };
                                    }

                                    rhino_mesh.Faces.AddFace(vtx[0], vtx[1], vtx[2], vtx[3]);
                                }
                            }
                        }

                        for (int iEdge = 0; iEdge < mesh.ArrayWEdges.Count; iEdge++)
                        {
                            var edge = mesh.ArrayWEdges[iEdge].Edge();
                            if (edge.CcwFace() == null || edge.CwFace() == null)
                            {
                                // E' uno spigolo di bordo
                                int[] vtx = { edge.Destination().Index,     edge.Origin().Index,
                                              edge.Origin().Index + totVtx, edge.Destination().Index + totVtx, };
                                rhino_mesh.Faces.AddFace(vtx[0], vtx[1], vtx[2], vtx[3]);
                            }
                        }

                        rhino_mesh.Normals.ComputeNormals();
                        rhino_mesh.Compact();
                        if (doc.Objects.AddMesh(rhino_mesh) != Guid.Empty)
                        {
                            doc.Views.Redraw();
                            return(Rhino.Commands.Result.Success);
                        }
                    }
                }

                return(Result.Success);
            }


            return(Result.Cancel);
        }
示例#19
0
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            // TODO: start here modifying the behaviour of your command.
            // ---
            //RhinoApp.WriteLine("The {0} command will add a line right now.", EnglishName);



            GetObject getBreps = new GetObject();

            getBreps.SetCommandPrompt("Pick the breps to create a PolyhedralFrame");
            getBreps.GeometryFilter = Rhino.DocObjects.ObjectType.Brep;
            // set up options

            OptionDouble dblOptionCollapse = new Rhino.Input.Custom.OptionDouble(0.1, true, 0.0);
            OptionDouble dblOptionPlanar   = new Rhino.Input.Custom.OptionDouble(0.1, true, 0.0);
            OptionToggle togOptionReplace  = new OptionToggle(true, "Keep", "Replace");

            getBreps.AddOptionDouble("PointCollapseLimit", ref dblOptionCollapse);
            getBreps.AddOptionDouble("PlanarityMaxDeviation", ref dblOptionPlanar);

            getBreps.AddOptionToggle("ReplaceGeo", ref togOptionReplace);
            getBreps.AcceptNothing(false);

            while (true)
            {
                var r = getBreps.GetMultiple(1, 0);
                if (r == GetResult.Cancel)
                {
                    return(getBreps.CommandResult());
                }
                else if (r == GetResult.Object)
                {
                    break;
                }
            }

            List <Guid> ids = new List <Guid>();

            for (int i = 0; i < getBreps.ObjectCount; i++)
            {
                ids.Add(getBreps.Object(i).ObjectId);
            }

            var foam           = new PFoam();
            var deleteOriginal = false;

            try
            {
                foam.ProcessBFaces(Util.DecomposeG(ids), dblOptionCollapse.CurrentValue, dblOptionPlanar.CurrentValue);
                doc.Objects.UnselectAll();
                if (foam.Faces.Count > 2)
                {
                    foam.MakeCells();
                    Point3d newCentroid = foam.Centroid;
                    if (!togOptionReplace.CurrentValue)
                    {
                        Rhino.Input.RhinoGet.GetPoint("Place the PolyFrame", true, out newCentroid);
                    }
                    else
                    {
                        deleteOriginal = true;
                    }
                    //Rhino.RhinoDoc.ActiveDoc.Objects.Delete(ids, true);


                    foam.Offset(newCentroid - foam.Centroid);
                    foam.Show(true, true, false);
                    foam.ShowCells();


                    if (!foam.SaveToDocument())
                    {
                        foam.Hide();
                        return(Result.Cancel);
                    }


                    foam.Hide();

                    if (deleteOriginal)
                    {
                        Rhino.RhinoDoc.ActiveDoc.Objects.Delete(ids, true);
                    }
                    doc.Views.Redraw();
                    Rhino.RhinoApp.WriteLine($"Constructed a PolyFrame object with {foam.Cells.Count} cells, {foam.Faces.Count} half-faces, {foam.Edges.Count} half-edges and {foam.Vertices.Count} vertices.");

                    return(Result.Success);
                }
                else
                {
                    Rhino.RhinoApp.WriteLine("Not enough faces!");
                    return(Result.Failure);
                }
            }
            catch (Exception pfE)
            {
                RhinoApp.WriteLine(pfE.Message + " Press <Esc> to continue.");
                foam.Hide();
                return(Result.Failure);
            }
        }
示例#20
0
 /// <summary>
 /// 设置河流模式
 /// </summary>
 /// <param name="mode"></param>
 public void SetRiverMode(int mode)
 {
     riverMode = (OptionToggle)mode;
 }
示例#21
0
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            var           primal = new PFoam();
            var           dual   = new PFoam();
            ContainerType container;

            try
            {
                var guids = LoadData.LoadPrimalDual(out primal, out dual, out container);

                if (dual.Cells.Count < 1)
                {
                    RhinoApp.WriteLine("No dual data retrieved from the container!");
                    return(Result.Failure);
                }

                // Primal ( the perping geometry )
                // load the foam from the geometry option to update from the geometry if any changes occured
                // select the structure to be perped - if dual not present raise error

                // show a set of options
                // Max steps 10 000
                // maximum deviation in degrees from dual direction
                // Update dual data from geometry
                // set edge legth constraint
                // set point position constraint

                var averageLen = primal.Edges.Select(x => x.GetLength()).Average();

                var getOptions = new GetOption();
                getOptions.SetDefaultString("enter");

                getOptions.SetCommandPrompt("Set max number of steps and perping options");

                var  optionSteps      = new OptionInteger(1000, true, 0);
                var  optionMaxDev     = new OptionDouble(0.1, 0.0, 10.0);
                var  optionMinLen     = new OptionDouble(averageLen / 4, true, averageLen / 100);
                var  optionSetEdge    = new OptionToggle(false, "setE", "E_set");
                var  optionSetVert    = new OptionToggle(false, "setV", "V_set");
                var  optionSetDualGeo = new OptionToggle(false, "setG", "G_set");
                var  storedSteps      = 1000.0;
                var  storedMaxDev     = 0.1;
                var  storedMinLen     = averageLen / 4;
                bool storedEdgeSet    = false;
                bool storedVertSet    = false;
                bool storedDualGeoSet = false;

                getOptions.AddOptionInteger("MaxIterations", ref optionSteps);
                getOptions.AddOptionDouble("MaxDeviation", ref optionMaxDev);
                getOptions.AddOptionDouble("MinEdgeLenght", ref optionMinLen);
                getOptions.AddOptionToggle("SetEdgeLen", ref optionSetEdge);
                getOptions.AddOptionToggle("SetVertPos", ref optionSetVert);
                getOptions.AddOptionToggle("UpdatePrimalGeo", ref optionSetDualGeo);

                while (true)
                {
                    var preres = getOptions.Get();
                    var res    = getOptions.CommandResult();
                    //var numres = getOptions.

                    if (res == Result.Success)
                    {
                        if (optionSetEdge.CurrentValue != storedEdgeSet)
                        {
                            primal.PickEdges();
                        }
                        if (optionSetVert.CurrentValue != storedVertSet)
                        {
                            primal.PickVertex();
                        }
                        if (optionSetDualGeo.CurrentValue != storedDualGeoSet)
                        {
                            var updatedDual = new PFoam();



                            LoadData.LoadPrimalDual(out updatedDual, out PFoam notUsedPrimal, out ContainerType dummyContainer, false);
                            // get the container geometry from a dual from the document
                            // check to see if the id matches
                            // load the point geometry, centroids, meshes and update data in the dual

                            // transform the primal/dual getter into a method to reuse it more easily

                            if (updatedDual.Dual.Id == primal.Id)
                            {
                                dual = updatedDual;
                                Util.ConnectDuals(ref primal, ref updatedDual);
                            }
                        }



                        if (optionSetEdge.CurrentValue == storedEdgeSet &&
                            optionSetVert.CurrentValue == storedVertSet &&
                            optionSetDualGeo.CurrentValue == storedDualGeoSet &&
                            optionSteps.CurrentValue == storedSteps &&
                            optionMaxDev.CurrentValue == storedMaxDev &&
                            optionMinLen.CurrentValue == storedMinLen
                            )
                        {
                            break;
                        }


                        storedEdgeSet    = optionSetEdge.CurrentValue;
                        storedVertSet    = optionSetVert.CurrentValue;
                        storedDualGeoSet = optionSetDualGeo.CurrentValue;
                        storedSteps      = optionSteps.CurrentValue;
                        storedMaxDev     = optionMaxDev.CurrentValue;
                        storedMinLen     = optionMinLen.CurrentValue;
                    }
                    else
                    {
                        return(Result.Cancel);
                    }
                }
                //Util.ConnectDuals(ref primal, ref dual);
                foreach (var edge in primal.Edges)
                {
                    edge.MinLength = optionMinLen.CurrentValue;
                }

                // delete the input objects
                doc.Objects.Delete(guids, true);

                primal.PerpSoft(optionSteps.CurrentValue, optionMaxDev.CurrentValue / 180 * Math.PI);

                //primal.ParaPerp(optionSteps.CurrentValue, 0, optionMaxDev.CurrentValue / 180 * Math.PI, null, 1);


                primal.Show(true, true, false);



                var pepedPrimalJsonString = primal.SerializeJson();

                if (!primal.SaveToDocument(container))
                {
                    primal.Hide();
                    return(Result.Cancel);
                }
                primal.Hide();

                return(Result.Success);
            }
            catch (PolyFrameworkException pfE)
            {
                RhinoApp.WriteLine(pfE.Message);
                primal.Hide();
                dual.Hide();
                return(Result.Failure);
            }
            // TODO: complete command.
        }
示例#22
0
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            //look at this for a summary of all the GET commands.

            // https://developer.rhino3d.com/api/RhinoCommon/html/T_Rhino_Input_Custom_GetBaseClass.htm.

            /*System.Object
             * Rhino.Input.Custom.GetBaseClass
             *  Rhino.Input.Custom.GetInteger
             *  Rhino.Input.Custom.GetNumber
             *  Rhino.Input.Custom.GetObject
             *  Rhino.Input.Custom.GetOption
             *  Rhino.Input.Custom.GetPoint
             *  Rhino.Input.Custom.GetString
             *
             * */
            var gc = new GetObject();

            gc.SetCommandPrompt("Select objects");
            gc.GeometryFilter = ObjectType.AnyObject;

            OptionInteger intOption  = new OptionInteger(1, 1, 99);
            OptionDouble  dblOption  = new OptionDouble(2.2, 0, 99);
            OptionToggle  boolOption = new OptionToggle(true, "off", "on");

            gc.AddOptionInteger("Integer", ref intOption);
            gc.AddOptionDouble("Double", ref dblOption);
            gc.AddOptionToggle("Boolean", ref boolOption);

            int listIndex = 0;

            string[] listValues = new string[] { "Bran", "Bob", "Arya", "Sansa", "Rickon" };

            int optList = gc.AddOptionList("List", listValues, listIndex);

            while (true)
            {
                GetResult res = gc.GetMultiple(1, 0);

                //we can check if the user selected something
                if (gc.CommandResult() != Result.Success)
                {
                    return(gc.CommandResult());
                }

                if (res == Rhino.Input.GetResult.Object)
                {
                    RhinoApp.WriteLine("Command line option values are");
                    RhinoApp.WriteLine("Integer = {0}", intOption.CurrentValue);
                    RhinoApp.WriteLine("Double = {0}", dblOption.CurrentValue);
                    RhinoApp.WriteLine("Boolean = {0}", boolOption.CurrentValue);
                    RhinoApp.WriteLine("List = {0}", listValues[listIndex]);
                }
                else if (res == Rhino.Input.GetResult.Option)
                {
                    if (gc.OptionIndex() == optList)
                    {
                        listIndex = gc.Option().CurrentListOptionIndex; //this updates the list option to whatever index the user has picked
                    }
                    continue;
                }

                break;
            }

            return(Result.Success);
        }
        public static void Load()
        {
            var harmony = HarmonyInstance.Create("exund.advancedbuilding");

            harmony.PatchAll(Assembly.GetExecutingAssembly());

            assetBundle = AssetBundle.LoadFromFile(asm_path + "Assets/advancedbuilding");

            try
            {
                _holder = new GameObject();
                _holder.AddComponent <AdvancedEditor>();
                _holder.AddComponent <BlockPicker>();

                if (Directory.Exists(PreciseSnapshotsFolder))
                {
                    _holder.AddComponent <LoadWindow>();
                }


                UnityEngine.Object.DontDestroyOnLoad(_holder);

                transformGizmo         = Singleton.cameraTrans.gameObject.AddComponent <RuntimeGizmos.TransformGizmo>();
                transformGizmo.enabled = false;

                config.TryGetConfig <float>("position_step", ref AdvancedEditor.position_step);
                config.TryGetConfig <float>("rotation_step", ref AdvancedEditor.rotation_step);
                config.TryGetConfig <float>("scale_step", ref AdvancedEditor.scale_step);

                config.TryGetConfig <bool>("open_inventory", ref BlockPicker.open_inventory);
                config.TryGetConfig <bool>("global_filters", ref BlockPicker.global_filters);
                var key = (int)BlockPicker.block_picker_key;
                config.TryGetConfig <int>("block_picker_key", ref key);
                BlockPicker.block_picker_key = (KeyCode)key;

                config.TryGetConfig <bool>("clearOnCollapse", ref PaletteTextFilter.clearOnCollapse);

                var key2 = (int)PhysicsInfo.centers_key;
                config.TryGetConfig <int>("centers_key", ref key2);
                PhysicsInfo.centers_key = (KeyCode)key2;


                string    modName        = "Advanced Building";
                OptionKey blockPickerKey = new OptionKey("Block Picker activation key", modName, BlockPicker.block_picker_key);
                blockPickerKey.onValueSaved.AddListener(() =>
                {
                    BlockPicker.block_picker_key = blockPickerKey.SavedValue;
                    config["block_picker_key"]   = (int)BlockPicker.block_picker_key;
                });

                OptionToggle globalFilterToggle = new OptionToggle("Block Picker - Use global filters", modName, BlockPicker.global_filters);
                globalFilterToggle.onValueSaved.AddListener(() =>
                {
                    BlockPicker.global_filters = globalFilterToggle.SavedValue;
                    config["global_filters"]   = BlockPicker.global_filters;
                });

                OptionToggle openInventoryToggle = new OptionToggle("Block Picker - Automatically open the inventory when picking a block", modName, BlockPicker.open_inventory);
                openInventoryToggle.onValueSaved.AddListener(() =>
                {
                    BlockPicker.open_inventory = openInventoryToggle.SavedValue;
                    config["open_inventory"]   = BlockPicker.open_inventory;
                });

                OptionToggle clearOnCollapse = new OptionToggle("Block Search - Clear filter when closing inventory", modName, PaletteTextFilter.clearOnCollapse);
                clearOnCollapse.onValueSaved.AddListener(() =>
                {
                    PaletteTextFilter.clearOnCollapse = clearOnCollapse.SavedValue;
                    config["clearOnCollapse"]         = PaletteTextFilter.clearOnCollapse;
                });

                OptionKey centersKey = new OptionKey("Open physics info menu (Ctrl + ?)", modName, PhysicsInfo.centers_key);
                centersKey.onValueSaved.AddListener(() =>
                {
                    PhysicsInfo.centers_key = centersKey.SavedValue;
                    config["centers_key"]   = (int)PhysicsInfo.centers_key;
                });

                NativeOptionsMod.onOptionsSaved.AddListener(() =>
                {
                    config.WriteConfigJsonFile();
                });

                new BlockPrefabBuilder(BlockTypes.GSOBlock_111, true)
                .SetBlockID(7020)
                .SetName("Reticule Research Hadamard Superposer")
                .SetDescription("This block can register quantum fluctuations applied on the tech's blocks and stabilize them during the snapshot process.\n\n<b>Warning</b>: Can cause temporary quantum jumps if it enters in contact with zero-stasis gluons.\nUsed to activate Advanced Building.")
                .SetFaction(FactionSubTypes.EXP)
                .SetCategory(BlockCategories.Accessories)
                .SetRarity(BlockRarity.Rare)
                .SetPrice(58860)
                .SetRecipe(new Dictionary <ChunkTypes, int> {
                    { ChunkTypes.SeedAI, 5 }
                })
                .SetModel(GameObjectJSON.MeshFromFile(asm_path + "Assets/hadamard_superposer.obj"), true, GameObjectJSON.GetObjectFromGameResources <Material>("RR_Main"))
                .SetIcon(GameObjectJSON.ImageFromFile(asm_path + "Assets/hadamard_superposer.png"))
                .AddComponent <ModuleOffgridStore>()
                .RegisterLater();

                {
                    var ontop = new Material(assetBundle.LoadAsset <Shader>("OnTop"));
                    var go    = new GameObject();
                    var mr    = go.AddComponent <MeshRenderer>();
                    mr.material                        = ontop;
                    mr.material.mainTexture            = GameObjectJSON.ImageFromFile(asm_path + "Assets/CO.png");
                    mr.material.mainTexture.filterMode = FilterMode.Point;
                    var mf = go.AddComponent <MeshFilter>();
                    mf.sharedMesh = mf.mesh = GameObjectJSON.MeshFromFile(asm_path + "Assets/CO.obj");

                    var line = new GameObject();
                    var lr   = line.AddComponent <LineRenderer>();
                    lr.startWidth = 0.5f;
                    lr.endWidth   = 0;
                    lr.SetPositions(new Vector3[] { Vector3.zero, Vector3.zero });
                    lr.useWorldSpace  = true;
                    lr.material       = ontop;
                    lr.material.color = lr.material.color.SetAlpha(1);
                    line.transform.SetParent(go.transform, false);

                    go.SetActive(false);
                    go.transform.SetParent(_holder.transform, false);

                    PhysicsInfo.COM = GameObject.Instantiate(go);
                    var commat = PhysicsInfo.COM.GetComponent <MeshRenderer>().material;
                    commat.color       = Color.yellow;
                    commat.renderQueue = 1;
                    PhysicsInfo.COM.GetComponentInChildren <LineRenderer>().enabled = false;

                    PhysicsInfo.COT = GameObject.Instantiate(go);
                    PhysicsInfo.COT.transform.localScale *= 0.8f;
                    var cotmat = PhysicsInfo.COT.GetComponent <MeshRenderer>().material;
                    cotmat.color       = Color.magenta;
                    cotmat.renderQueue = 3;
                    var COTlr = PhysicsInfo.COT.GetComponentInChildren <LineRenderer>();
                    COTlr.material.renderQueue = 2;
                    COTlr.startColor           = COTlr.endColor = Color.magenta;

                    PhysicsInfo.COL = GameObject.Instantiate(go);
                    PhysicsInfo.COL.transform.localScale *= 0.64f;
                    var colmat = PhysicsInfo.COL.GetComponent <MeshRenderer>().material;
                    colmat.color       = Color.cyan;
                    colmat.renderQueue = 5;
                    var COLlr = PhysicsInfo.COL.GetComponentInChildren <LineRenderer>();
                    COLlr.startColor           = COLlr.endColor = Color.cyan;
                    COLlr.material.renderQueue = 4;
                }

                _holder.AddComponent <PhysicsInfo>();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
示例#24
0
            protected override Result RunCommand(RhinoDoc doc, RunMode mode)
            {
                // Command variables
                var    selectedObjects = new List <RhinoObject>();
                string selectedSchema  = "";
                bool   automatic       = true;
                bool   directShape     = false;

                // Construct an objects getter
                // This includes an option toggle for "Automatic" (true means automagic schema application, no directshapes)
                var getObj = new GetObject();

                getObj.SetCommandPrompt("Select geometry");
                var toggleAutomatic = new OptionToggle(true, "Off", "On");

                getObj.AddOptionToggle("Automatic", ref toggleAutomatic);
                getObj.GroupSelect     = true;
                getObj.SubObjectSelect = false;
                getObj.EnableClearObjectsOnEntry(false);
                getObj.EnableUnselectObjectsOnExit(false);
                getObj.DeselectAllBeforePostSelect = false;

                // Get objects
                for (; ;)
                {
                    GetResult res = getObj.GetMultiple(1, 0);
                    if (res == GetResult.Option)
                    {
                        getObj.EnablePreSelect(false, true);
                        continue;
                    }
                    else if (res != GetResult.Object)
                    {
                        return(Result.Cancel);
                    }
                    if (getObj.ObjectsWerePreselected)
                    {
                        getObj.EnablePreSelect(false, true);
                        continue;
                    }
                    break;
                }

                selectedObjects = getObj.Objects().Select(o => o.Object()).ToList();
                automatic       = toggleAutomatic.CurrentValue;

                // Construct an options getter if "Automatic" was set to "off"
                if (!automatic)
                {
                    // Construct an options getter for schema options
                    // This includes an option toggle for "DirectShape" (true will asign selected schema as the family)
                    // Also includes an option list of supported schemas
                    var getOpt = new GetOption();
                    getOpt.SetCommandPrompt("Select schema options. Press Enter when done");
                    var           toggleDirectShape     = new OptionToggle(false, "Off", "On");
                    var           directShapeIndex      = getOpt.AddOptionToggle("DirectShape", ref toggleDirectShape);
                    List <string> schemas               = Enum.GetNames(typeof(SchemaObjectFilter.SupportedSchema)).ToList();
                    int           schemaListOptionIndex = getOpt.AddOptionList("Schema", schemas, 0);

                    // Get options
                    while (getOpt.Get() == GetResult.Option)
                    {
                        if (getOpt.OptionIndex() == schemaListOptionIndex)
                        {
                            selectedSchema = schemas[getOpt.Option().CurrentListOptionIndex];
                        }
                        if (getOpt.OptionIndex() == directShapeIndex)
                        {
                            directShape = toggleDirectShape.CurrentValue;
                        }
                    }
                }

                // Apply schemas
                if (automatic)
                {
                    ApplySchemas(selectedObjects, doc);
                }
                else
                {
                    ApplySchema(selectedObjects, selectedSchema, doc, directShape);
                }
                return(Result.Success);
            }
示例#25
0
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            var cs_option = new OptionToggle(m_use_cplane, "World", "CPlane");

            var go = new GetObject();

            go.SetCommandPrompt("Select objects for bounding box calculation");
            go.GroupSelect     = true;
            go.SubObjectSelect = false;
            for (;;)
            {
                go.ClearCommandOptions();
                go.AddOptionToggle("CoordinateSystem", ref cs_option);

                var res = go.GetMultiple(1, 0);

                if (res == GetResult.Option)
                {
                    continue;
                }
                else if (res != GetResult.Object)
                {
                    return(Result.Cancel);
                }

                break;
            }

            var plane = go.View().ActiveViewport.ConstructionPlane();

            m_use_cplane = cs_option.CurrentValue;

            var world_to_plane = new Transform(1.0);

            if (m_use_cplane)
            {
                world_to_plane = Transform.ChangeBasis(Plane.WorldXY, plane);
            }

            var bounding_box = new BoundingBox();

            for (var i = 0; i < go.ObjectCount; i++)
            {
                var rhino_obj = go.Object(i).Object();
                if (null != rhino_obj)
                {
                    var box = rhino_obj.Geometry.GetBoundingBox(world_to_plane);
                    if (box.IsValid)
                    {
                        if (i == 0)
                        {
                            bounding_box = box;
                        }
                        else
                        {
                            bounding_box.Union(box);
                        }
                    }
                }
            }

            if (!bounding_box.IsValid)
            {
                RhinoApp.WriteLine("BoundingBox failed. Unable to calculate bounding box.");
                return(Result.Failure);
            }

            var box_corners = new Point3d[8];

            box_corners[0] = bounding_box.Corner(false, false, false);
            box_corners[1] = bounding_box.Corner(true, false, false);
            box_corners[2] = bounding_box.Corner(true, true, false);
            box_corners[3] = bounding_box.Corner(false, true, false);
            box_corners[4] = bounding_box.Corner(false, false, true);
            box_corners[5] = bounding_box.Corner(true, false, true);
            box_corners[6] = bounding_box.Corner(true, true, true);
            box_corners[7] = bounding_box.Corner(false, true, true);

            if (m_use_cplane)
            {
                // Transform corners points from cplane coordinates
                // to world coordinates if necessary.
                var plane_to_world = Transform.ChangeBasis(plane, Plane.WorldXY);
                for (var i = 0; i < 8; i++)
                {
                    box_corners[i].Transform(plane_to_world);
                }
            }

            Point3d[] rect;
            var       type = ClassifyBoundingBox(box_corners, out rect);

            if (type == BoundingBoxClassification.Point)
            {
                RhinoApp.WriteLine("BoundingBox failed. The bounding box is a point.");
            }
            else if (type == BoundingBoxClassification.Line)
            {
                RhinoApp.WriteLine("BoundingBox failed. The bounding box is a line.");
            }
            else if (type == BoundingBoxClassification.Rectangle)
            {
                doc.Objects.AddPolyline(rect);
            }
            else //if (type == BoundingBoxClassification.Box)
            {
                var brep = Brep.CreateFromBox(box_corners);
                doc.Objects.AddBrep(brep);
            }

            doc.Views.Redraw();

            return(Result.Success);
        }
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            var getNumber = new GetNumber();

            getNumber.SetLowerLimit(2.0, false);
            getNumber.SetUpperLimit(uint.MaxValue, false);
            getNumber.SetDefaultInteger(RcCore.It.EngineSettings.Samples);
            getNumber.SetCommandPrompt("Set render samples");

            var showMaxPasses = new OptionToggle(RcCore.It.EngineSettings.ShowMaxPasses, "HideMaxPasses", "ShowMaxPasses");

            var maxBounce = new OptionInteger(RcCore.It.EngineSettings.MaxBounce, 0, 500);
            var tileX     = new OptionInteger(RcCore.It.EngineSettings.TileX, 0, 10000);
            var tileY     = new OptionInteger(RcCore.It.EngineSettings.TileY, 0, 10000);


            var maxDiffuseBounce      = new OptionInteger(RcCore.It.EngineSettings.MaxDiffuseBounce, 0, 200);
            var maxGlossyBounce       = new OptionInteger(RcCore.It.EngineSettings.MaxGlossyBounce, 0, 200);
            var maxTransmissionBounce = new OptionInteger(RcCore.It.EngineSettings.MaxTransmissionBounce, 0, 200);
            var maxVolumeBounce       = new OptionInteger(RcCore.It.EngineSettings.MaxVolumeBounce, 0, 200);

            var noCaustics = new OptionToggle(RcCore.It.EngineSettings.NoCaustics, "Caustics", "NoCaustics");

            var aaSamples     = new OptionInteger(RcCore.It.EngineSettings.AaSamples, 1, 100);
            var diffSamples   = new OptionInteger(RcCore.It.EngineSettings.DiffuseSamples, 1, 100);
            var glossySamples = new OptionInteger(RcCore.It.EngineSettings.GlossySamples, 1, 100);

            var seed = new OptionInteger(RcCore.It.EngineSettings.Seed, 0, int.MaxValue);

            var sensorWidth  = new OptionDouble(RcCore.It.EngineSettings.SensorWidth, 10.0, 100.0);
            var sensorHeight = new OptionDouble(RcCore.It.EngineSettings.SensorHeight, 10.0, 100.0);

            var transparentMaxBounce = new OptionInteger(RcCore.It.EngineSettings.TransparentMaxBounce, 0, 200);

            var filterGlossy            = new OptionDouble(RcCore.It.EngineSettings.FilterGlossy, 0.0, 100.0);
            var sampleClampDirect       = new OptionDouble(RcCore.It.EngineSettings.SampleClampDirect, 0.0, 100.0);
            var sampleClampIndirect     = new OptionDouble(RcCore.It.EngineSettings.SampleClampIndirect, 0.0, 100.0);
            var lightSamplingThreshold  = new OptionDouble(RcCore.It.EngineSettings.LightSamplingThreshold, 0.0, 1.0);
            var sampleAllLights         = new OptionToggle(RcCore.It.EngineSettings.SampleAllLights, "no", "yes");
            var sampleAllLightsIndirect = new OptionToggle(RcCore.It.EngineSettings.SampleAllLightsIndirect, "no", "yes");

            getNumber.AddOptionToggle("show_max_passes", ref showMaxPasses);
            getNumber.AddOptionInteger("max_bounces", ref maxBounce);
            getNumber.AddOptionInteger("tile_x", ref tileX);
            getNumber.AddOptionInteger("tile_y", ref tileY);
            getNumber.AddOptionToggle("no_caustics", ref noCaustics);

            getNumber.AddOptionInteger("max_diffuse_bounce", ref maxDiffuseBounce);
            getNumber.AddOptionInteger("max_glossy_bounce", ref maxGlossyBounce);
            getNumber.AddOptionInteger("max_transmission_bounce", ref maxTransmissionBounce);
            getNumber.AddOptionInteger("max_volume_bounce", ref maxVolumeBounce);

            getNumber.AddOptionInteger("transparent_max_bounce", ref transparentMaxBounce);

            getNumber.AddOptionInteger("aa_samples", ref aaSamples);
            getNumber.AddOptionInteger("diffuse_samples", ref diffSamples);
            getNumber.AddOptionInteger("glossy_samples", ref glossySamples);

            getNumber.AddOptionDouble("sensor_width", ref sensorWidth);
            getNumber.AddOptionDouble("sensor_height", ref sensorHeight);


            getNumber.AddOptionInteger("seed", ref seed, "Seed to use for sampling distribution");

            getNumber.AddOptionDouble("filter_glossy", ref filterGlossy);
            getNumber.AddOptionDouble("sample_clamp_direct", ref sampleClampDirect);
            getNumber.AddOptionDouble("sample_clamp_indirect", ref sampleClampIndirect);
            getNumber.AddOptionDouble("light_sampling_threshold", ref lightSamplingThreshold);
            getNumber.AddOptionToggle("sample_all_lights", ref sampleAllLights);
            getNumber.AddOptionToggle("sample_all_lights_indirect", ref sampleAllLightsIndirect);

            while (true)
            {
                var getRc = getNumber.Get();
                if (getNumber.CommandResult() != Result.Success)
                {
                    return(getNumber.CommandResult());
                }
                switch (getRc)
                {
                case GetResult.Number:
                    RhinoApp.WriteLine($"We got: {getNumber.Number()}, {maxBounce.CurrentValue}");
                    RcCore.It.EngineSettings.Samples                 = (int)getNumber.Number();
                    RcCore.It.EngineSettings.ShowMaxPasses           = showMaxPasses.CurrentValue;
                    RcCore.It.EngineSettings.Seed                    = seed.CurrentValue;
                    RcCore.It.EngineSettings.MaxBounce               = maxBounce.CurrentValue;
                    RcCore.It.EngineSettings.TileX                   = tileX.CurrentValue;
                    RcCore.It.EngineSettings.TileY                   = tileY.CurrentValue;
                    RcCore.It.EngineSettings.NoCaustics              = noCaustics.CurrentValue;
                    RcCore.It.EngineSettings.MaxDiffuseBounce        = maxDiffuseBounce.CurrentValue;
                    RcCore.It.EngineSettings.MaxGlossyBounce         = maxGlossyBounce.CurrentValue;
                    RcCore.It.EngineSettings.MaxTransmissionBounce   = maxTransmissionBounce.CurrentValue;
                    RcCore.It.EngineSettings.MaxVolumeBounce         = maxVolumeBounce.CurrentValue;
                    RcCore.It.EngineSettings.TransparentMaxBounce    = transparentMaxBounce.CurrentValue;
                    RcCore.It.EngineSettings.AaSamples               = aaSamples.CurrentValue;
                    RcCore.It.EngineSettings.DiffuseSamples          = diffSamples.CurrentValue;
                    RcCore.It.EngineSettings.GlossySamples           = glossySamples.CurrentValue;
                    RcCore.It.EngineSettings.SensorWidth             = (float)sensorWidth.CurrentValue;
                    RcCore.It.EngineSettings.SensorHeight            = (float)sensorHeight.CurrentValue;
                    RcCore.It.EngineSettings.FilterGlossy            = (float)filterGlossy.CurrentValue;
                    RcCore.It.EngineSettings.SampleClampDirect       = (float)sampleClampDirect.CurrentValue;
                    RcCore.It.EngineSettings.SampleClampIndirect     = (float)sampleClampIndirect.CurrentValue;
                    RcCore.It.EngineSettings.LightSamplingThreshold  = (float)lightSamplingThreshold.CurrentValue;
                    RcCore.It.EngineSettings.SampleAllLights         = sampleAllLights.CurrentValue;
                    RcCore.It.EngineSettings.SampleAllLightsIndirect = sampleAllLightsIndirect.CurrentValue;
                    break;

                case GetResult.Option:
                    continue;
                }

                break;
            }
            return(Result.Success);
        }
示例#27
0
        protected override Result RunCommand(Rhino.RhinoDoc doc, RunMode mode)
        {
            var dirname = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

            string[] pathComponent = new string[] { dirname.ToString(), @"common_paper_sizes.json" };
            var      jsonPath      = Path.Combine(pathComponent);

            GetPoint gp   = new GetPoint();
            string   text = System.IO.File.ReadAllText(jsonPath);

            gp.SetCommandPrompt("Set Origin of Paper Rectangle");

            OptionToggle boolOption = new OptionToggle(false, "Off", "On");

            gp.AddOptionToggle("Portrait", ref boolOption);

            var listNames  = new List <string>();
            var listValues = new List <Point2d>();



            List <Paper> papers = JsonConvert.DeserializeObject <List <Paper> >(text);
            //foreach(var paper in papers)
            //{
            var count = 0;

            foreach (var format in papers[0].formats)
            {
                var num = int.Parse(Regex.Match(format.name, @"\d+").Value);

                if (num < 6 && !format.name.Contains("C"))
                {
                    listNames.Add(format.name);
                    listValues.Add(new Point2d(format.size.mm[0], format.size.mm[1]));
                    count++;
                }
            }

            //}
            var listNamesArr = listNames.ToArray();
            int listIndex    = 0;
            int opList       = gp.AddOptionList("PaperType", listNamesArr, listIndex);

            while (true)
            {
                // perform the get operation. This will prompt the user to input a point, but also
                // allow for command line options defined above
                Rhino.Input.GetResult get_rc = gp.Get();
                if (gp.CommandResult() != Rhino.Commands.Result.Success)
                {
                    return(gp.CommandResult());
                }

                if (get_rc == Rhino.Input.GetResult.Point)
                {
                    var plane = doc.Views.ActiveView.ActiveViewport.GetConstructionPlane().Plane;
                    plane.Origin = gp.Point();
                    var item       = listValues[listIndex];
                    var isPortrait = boolOption.CurrentValue;
                    var rect       = new Rectangle3d(plane, isPortrait ? item.X : item.Y, isPortrait ? item.Y : item.X);
                    var attr       = new Rhino.DocObjects.ObjectAttributes();
                    attr.Name       = listNames[listIndex];
                    attr.LayerIndex = doc.Layers.CurrentLayerIndex;
                    doc.Objects.AddRectangle(rect, attr);
                    doc.Views.Redraw();
                }
                else if (get_rc == Rhino.Input.GetResult.Option)
                {
                    if (gp.OptionIndex() == opList)
                    {
                        listIndex = gp.Option().CurrentListOptionIndex;
                    }
                    continue;
                }
                break;
            }
            return(Rhino.Commands.Result.Success);
        }
示例#28
0
        public IList <PFVertex> PickVertex()
        {
            var innerVerts    = Vertices.Where(x => !x.External);
            var pickedVerts   = new List <PFVertex>();
            var doc           = Rhino.RhinoDoc.ActiveDoc;
            var vertexConduit = new DrawPFVertexConduit(innerVerts)
            {
                Enabled = true
            };

            doc.Views.Redraw();
            var gVert = new GetPFVertex(innerVerts);

            //var permOption = new OptionToggle(false, "temp", "perm");
            gVert.AddSnapPoints(innerVerts.Select(x => x.Point).ToArray());
            while (true)
            {
                gVert.SetCommandPrompt("select Vertex points. (<ESC> to exit");
                //gVert.AddOptionToggle("Remember", ref permOption);
                gVert.AcceptNothing(true);
                gVert.AcceptString(true);
                //gVert.SetCursor() // this we can change after switching to Rhino 6 - api

                gVert.SetDefaultString($"({pickedVerts.Count}) vertices selected press <Enter> to accept");
                gVert.Get(true);


                doc.Views.Redraw();
                var result    = gVert.CommandResult();
                var strResult = gVert.StringResult();
                pickedVerts = new List <PFVertex>();
                if (gVert.CommandResult() == Rhino.Commands.Result.Cancel)
                {
                    break;
                }
                foreach (var vrt in innerVerts)
                {
                    if (vrt.Picked)
                    {
                        pickedVerts.Add(vrt);
                    }
                }
                if (gVert.GotDefault())
                {
                    // here use a pick mechanism to get the geometry
                    if (pickedVerts.Count > 0)
                    {
                        var outside   = new OptionToggle(true, "true", "false");
                        var fixPoint  = new OptionToggle(false, "constrain", "fix");
                        var getRefGeo = new GetObject();
                        getRefGeo.SetCommandPrompt("Pick the constrain object for the selected vertices");

                        getRefGeo.AddOptionToggle("Outside", ref outside);
                        getRefGeo.AddOptionToggle("Fixed", ref fixPoint);
                        getRefGeo.AcceptNothing(true);
                        getRefGeo.DisablePreSelect();



                        if (getRefGeo.Get() == Rhino.Input.GetResult.Object)
                        {
                            var geoGet = getRefGeo.Object(0);
                            var idGet  = getRefGeo.Object(0).ObjectId;

                            SetVertexConstraints(pickedVerts, geoGet.Object(), 1, outside.CurrentValue);
                        }

                        else if (getRefGeo.Result() == Rhino.Input.GetResult.Nothing)
                        {
                            foreach (var vert in pickedVerts)
                            {
                                vert.RestrictPosition = null;
                                vert.RestrictSupport  = null;
                                vert.SupportGuid      = Guid.Empty;
                            }
                        }

                        else if (getRefGeo.Result() == Rhino.Input.GetResult.Option && fixPoint.CurrentValue == true)
                        {
                            foreach (var vert in pickedVerts)
                            {
                                vert.RestrictPosition = vert.ConstrainPoint;
                                vert.RestrictSupport  = new Rhino.Geometry.Point(vert.Point); // this is what keeps the vertex in place
                                vert.InfluenceCoef    = 100;                                  // this is what makes it relatively immovable
                                vert.SupportGuid      = Guid.Empty;
                                vert.Fixed            = true;                                 // this is just for serilization refference
                            }
                        }
                        doc.Objects.UnselectAll();
                        pickedVerts.ForEach(x => x.Picked = false);
                        doc.Views.Redraw();
                    }
                    else
                    {
                        break;
                    }
                }
            }
            vertexConduit.Enabled = false;
            doc.Views.Redraw();

            return(pickedVerts);
        }
示例#29
0
        /// <summary>
        /// Getter method to load primal/dual from a geometry container from the Rhino Document

        /// </summary>
        /// <param name="primal">provided primal - need to check if it has data after the method ends</param>
        /// <param name="dual">provided primal - just like primal check if it has cells </param>
        public static IList <Guid> LoadPrimalDual(out PFoam primal, out PFoam dual, out ContainerType container, bool connect = true)
        {
            primal = new PFoam();
            dual   = new PFoam();

            container = ContainerType.Edge;

            GetObject getObj              = new GetObject();
            var       togGeoUpdate        = new OptionToggle(true, "no", "yes");
            var       togClearConstraints = new OptionToggle(false, "no", "yes");

            //var togOptionReplace = new OptionToggle(true, "Keep", "Replace");

            getObj.SetCommandPrompt("Pick the geometry container (group of lines, surfaces, polysurfaces or meshes)");


            getObj.AddOptionToggle("UpdateGeo", ref togGeoUpdate);
            getObj.AddOptionToggle("ClearConstraints", ref togClearConstraints);
            //getObj.AddOptionToggle("ReplaceGeo", ref togOptionReplace);
            getObj.GroupSelect    = true;
            getObj.GeometryFilter = Rhino.DocObjects.ObjectType.Brep | Rhino.DocObjects.ObjectType.Curve | Rhino.DocObjects.ObjectType.Mesh;

            while (true)
            {
                var r = getObj.GetMultiple(1, 0);
                if (r == GetResult.Cancel)
                {
                    return(new List <Guid>());
                }
                else if (r == GetResult.Object)
                {
                    break;
                }
            }

            var guids = getObj.Objects().Select(x => x.ObjectId).ToList();

            var geoObj = getObj.Objects().Select(x => x.Geometry());

            if (geoObj.All(x => x.ObjectType == Rhino.DocObjects.ObjectType.Brep))
            {
                var brepInput = geoObj.Cast <Brep>().ToList();

                if (brepInput.Any(x => x.Faces.Count > 1))
                {
                    container = ContainerType.CellBrep;
                }
                else
                {
                    container = ContainerType.FaceBrep;
                }

                primal = LoadData.LoadFromFaces(brepInput, out dual, togGeoUpdate.CurrentValue);
            }
            else if (geoObj.All(x => x.ObjectType == Rhino.DocObjects.ObjectType.Curve))
            {
                container = ContainerType.Edge;
                var curveGeos = geoObj.Cast <Curve>().ToList();
                primal = LoadData.LoadFromEdges(curveGeos, out dual, togGeoUpdate.CurrentValue);
            }

            else if (geoObj.All(x => x.ObjectType == Rhino.DocObjects.ObjectType.Mesh))
            {
                var meshGeos = geoObj.Cast <Mesh>().ToList();
                if (meshGeos.Any(x => x.Ngons.Count > 1 ||
                                 (x.Ngons.Count == 0 && x.Faces.Count > 1) ||
                                 (x.Ngons.Count == 1 && x.Faces.Count > x.Ngons[0].FaceCount)))
                {
                    container = ContainerType.CellMesh;
                }
                else
                {
                    container = ContainerType.FaceMesh;
                }



                primal = LoadData.LoadFromMeshes(meshGeos, out dual, togGeoUpdate.CurrentValue);
            }
            else
            {
                Rhino.RhinoApp.WriteLine("Mixed data detected!");
                return(new List <Guid>());
            }


            if (primal.Cells.Count < 1)
            {
                Rhino.RhinoApp.WriteLine("Error creating primal from provided data!");
                return(new List <Guid>());
            }

            if (connect && dual.Cells.Count > 1 && primal.Dual.Id == dual.Id)
            {
                Util.ConnectDuals(ref primal, ref dual);
            }


            if (togClearConstraints.CurrentValue)
            {
                foreach (var vert in primal.Vertices)
                {
                    vert.RestrictPosition = null;
                    vert.RestrictSupport  = null;
                    vert.SupportGuid      = Guid.Empty;
                }
                foreach (var edge in primal.Edges)
                {
                    edge.TargetLength = double.NaN;
                    edge.MaxLength    = double.MaxValue;
                    edge.MinLength    = double.Epsilon;
                }
                foreach (var face in primal.Faces)
                {
                    face.TargetArea = double.NaN;
                }
            }


            Rhino.RhinoDoc.ActiveDoc.Objects.UnselectAll();
            Rhino.RhinoDoc.ActiveDoc.Views.Redraw();
            return(guids);
        }
示例#30
0
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            if (!(RhinoApp.GetPlugInObject("Grasshopper") is GH_RhinoScriptInterface Grasshopper))
            {
                return(Result.Cancel);
            }

            GetOption go = null;

            while (true)
            {
                var port     = new OptionInteger(Port, 1024, 65535);
                var toggle   = new OptionToggle(ShowEditor, "Hide", "Show");
                var debugger = new OptionToggle(Debug, "Off", "On");

                go = new GetOption();

                go.SetCommandPrompt("Noah Server");
                go.AddOption("Connect");
                go.AddOption("Stop");
                go.AddOption("Observer");
                go.AddOptionInteger("Port", ref port);
                go.AddOptionToggle("Editor", ref toggle);
                go.AddOptionToggle("Debug", ref debugger);
                go.AddOption("Workspace");

                GetResult result = go.Get();
                if (result != GetResult.Option)
                {
                    break;
                }

                ShowEditor = toggle.CurrentValue;
                Debug      = debugger.CurrentValue;

                string whereToGo = go.Option().EnglishName;

                if (whereToGo == "Connect")
                {
                    if (Port == 0)
                    {
                        RhinoApp.WriteLine("Please set Port you want to connect!");
                        continue;
                    }

                    if (WorkDir == null)
                    {
                        RhinoApp.WriteLine("Noah can not work without workspace!");
                        continue;
                    }

                    if (Client == null)
                    {
                        try
                        {
                            Grasshopper.DisableBanner();

                            if (!Grasshopper.IsEditorLoaded())
                            {
                                Grasshopper.LoadEditor();
                            }

                            Client               = new NoahClient(Port, WorkDir);
                            Client.InfoEvent    += Client_MessageEvent;
                            Client.ErrorEvent   += Client_ErrorEvent;
                            Client.WarningEvent += Client_WarningEvent;
                            Client.DebugEvent   += Client_DebugEvent;
                        }
                        catch (Exception ex)
                        {
                            RhinoApp.WriteLine("Error: " + ex.Message);
                        }

                        Client.Connect();
                    }
                    else
                    {
                        Client.Reconnect();
                    }

                    if (Debug)
                    {
                        try
                        {
                            if (Logger == null)
                            {
                                Panels.OpenPanel(LoggerPanel.PanelId);
                            }
                            Logger = Panels.GetPanel <LoggerPanel>(doc);
                        }
                        catch (Exception ex)
                        {
                            RhinoApp.WriteLine("Error: " + ex.Message);
                        }
                    }

                    if (ShowEditor)
                    {
                        Grasshopper.ShowEditor();
                    }

                    break;
                }

                if (whereToGo == "Stop")
                {
                    if (Port == 0)
                    {
                        continue;
                    }

                    if (Client != null)
                    {
                        Client.Close();
                    }
                    break;
                }

                if (whereToGo == "Workspace")
                {
                    RhinoGet.GetString("Noah Workspace", false, ref WorkDir);
                }

                if (whereToGo == "Observer")
                {
                    if (Port == 0)
                    {
                        RhinoApp.WriteLine("Server connecting need a port!");
                        continue;
                    }

                    Process.Start("http://localhost:" + Port + "/data/center");
                    break;
                }

                if (whereToGo == "Port")
                {
                    Port = port.CurrentValue;
                    RhinoApp.WriteLine("Port is set to " + Port.ToString());
                    continue;
                }
            }

            return(Result.Nothing);
        }