{"id":16926912,"url":"https://github.com/runxel/rhino-secrets","last_synced_at":"2026-01-04T07:48:40.097Z","repository":{"id":91517941,"uuid":"195090782","full_name":"runxel/rhino-secrets","owner":"runxel","description":"A short overview on the secrets of Rhino 3D \u0026 Grasshopper.","archived":false,"fork":false,"pushed_at":"2023-05-03T14:56:49.000Z","size":8379,"stargazers_count":45,"open_issues_count":0,"forks_count":5,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-03-18T22:42:31.691Z","etag":null,"topics":["grasshopper","rhino"],"latest_commit_sha":null,"homepage":"https://runxel.github.io/rhino-secrets/","language":"SCSS","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/runxel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"runxel","patreon":"runxel","open_collective":null,"ko_fi":"runxel","tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2019-07-03T16:25:50.000Z","updated_at":"2025-01-01T10:42:58.000Z","dependencies_parsed_at":null,"dependency_job_id":"7ef47cb5-26f5-4dae-9075-921702bc654e","html_url":"https://github.com/runxel/rhino-secrets","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/runxel%2Frhino-secrets","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/runxel%2Frhino-secrets/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/runxel%2Frhino-secrets/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/runxel%2Frhino-secrets/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/runxel","download_url":"https://codeload.github.com/runxel/rhino-secrets/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244722745,"owners_count":20499153,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["grasshopper","rhino"],"created_at":"2024-10-13T20:32:09.356Z","updated_at":"2026-01-04T07:48:40.064Z","avatar_url":"https://github.com/runxel.png","language":"SCSS","funding_links":["https://github.com/sponsors/runxel","https://patreon.com/runxel","https://ko-fi.com/runxel"],"categories":[],"sub_categories":[],"readme":"# [🦏 Rhino Secrets](https://runxel.github.io/rhino-secrets/)\nA collection of cool stuff and lesser known facts on Rhino \u0026 Grasshopper you might or might not know.\n\n\u003chr\u003e\n\n## Rhino 🦏\n\n- [Good model practices \u0026 techniques](./model-practices.md)\n- [Troubleshooting Guide](./troubleshooting.md)\n\n\n### Explain NURBS to me\nGo and see this wonderful explanation: [«Nurbs is just an acronym»](https://wordsandbuttons.online/nurbs_is_just_an_acronym.html)  \n![nurbs explaination picture](/img/explain_nurbs.png)\n\n### Learn modeling in Rhino\nThere is a great [video series on Vimeo](https://vimeo.com/showcase/4953232) where it's shown how to model things from scratch with an in-depth approach lasting around 90 minutes each.\n\n\n### Symbols in command line\nEver wondered what the specials chars in commands meant? Or are you always forgetting?  \n\n| Char | Meaning |\n| ---  | --- |\n| `*`  | Causes the command to repeat automatically without pressing \u003ckbd\u003eEnter\u003c/kbd\u003e to restart. (used in macros) |\n| `!`  | Cancels the previous command. |\n| `_`  | Runs command as English command name. |\n| `-`  | Suppress any dialog box. |\n| `'`  | The apostrophe tells that next command is a nestable command. (geometry creations are never nestable) |\n| `/`  | If the first character in a toolbar macro is not \"!\" and the last character is\" /\", the script runs on the command line without \u003ckbd\u003eEnter\u003c/kbd\u003e, so more information can be added. |\n| `~`  | Suppresses command options for clutter free command feedback. |\n| `;`  | Comment. (used in macros) |\n\n\n### Tolerances\nWhat are they? How are they important? Do _I_ have to do anything?  \nAll those questions are perfectly answered in the [McNeel Wiki](https://wiki.mcneel.com/rhino/faqtolerances).\n\nRule of thumb:  \nUse a tolerance setting one order of magnitude tighter than (1/10 of) your smallest modeled detail.  \nIn general keep the absolute tolerance setting in the range of `0.01` to `0.0001`. Never set it below `1.0e-5` – chrashes might occur and you pay with slow computing speed. If you need a tighter tolerance, use smaller units instead.\n\n\n### Find layer\nEvery so often you are in need of finding the layer the object is in – i.e. it's precise location in the layer tree. Of course we can see the layer name of the selected object in the statusbar, but when working with many (and possibly similar named) layers this information alone is sometimes not enough.  \nWith the wanted object selected go to your layers panel and click on the hammer icon, then choose \"Select Object Layer\". Rhino will unfold the layer structure for you and and highlight the right layer.\n\n\n### Fast layer assign\nTo change the layer of the selected object(s) click on the layer name in statusbar and choose another layer.  \nSince this pop-up is actually a full-fledged layer manager you can also set your current layer (when no object is selected), or hide/show and lock/unlock layers.\n\n\n### Disable a specific layer\nOften enough you want to disable a whole layer based on your selection. But going into a deeply nested layer tree is hard, so just use `_OneLayerOff`.  \n![Button picture](/img/icons/onelayeroff.png)\n\n\n### Too many layers to handle?\nTry the [layer state manager](https://docs.mcneel.com/rhino/5/help/en-us/commands/layerstatemanager.htm). It will save you tons of time of hiding (and showing) certain layers.\n\n\n### Different looking\nTake advantage of the possibility to assign a display mode to an object via `_SetObjectDisplayMode`.  \n![Artic Viewport with transparent paraboloid picture](/img/set_obj_display_mode.png)\n\n\n### Fast Osnap\nRight-mouse click on an osnap filter in the panel to check that one and uncheck all the others. Right click again to restore the state before.\n\n\n### Osnaps reloaded\nPressing and holding \u003ckbd\u003eshift\u003c/kbd\u003e to reverse the effect of your current Ortho setting.  \nPressing and holding \u003ckbd\u003ealt\u003c/kbd\u003e suspends any persistent Osnaps without unchecking them.\n\n\n### Easy dragging\nLong-press LMB on an object to drag and Rhino will find the closest snapping point and use that one while dragging.\n\n\n### Fast angle snap\nHover your mouse over a point during a command and press \u003ckbd\u003eTab\u003c/kbd\u003e to lock the current angle.\n\n\n### Snap to locked objects\nSometimes you want to snap to locked objects, other times you don't.  \nJust go to `Tools \u003e ObjectSnaps` and (un)check `snap to locked objects` – or type `SnapToLocked`. Tip: A good item to put on a custom button!\n\n\n### Quick angles\nWhile using a drawing command like `_pline`, you can choose a relative angle to your point by typing in `\u003cangle`. For example: `\u003c35`\n\n\n### Elevator mode\nWhen drawing a polyline \u003ckbd\u003ectrl\u003c/kbd\u003e + \u003ckbd\u003eclick\u003c/kbd\u003e on your previous point to draw vertical regarding the Cplane.\n\n\n### Elevate during drag\nEverybody knows \u003ckbd\u003eshift\u003c/kbd\u003e for constraining objects orthogonally on plane; use \u003ckbd\u003eshift\u003c/kbd\u003e + \u003ckbd\u003ectrl\u003c/kbd\u003e and you can lock it vertically.\n\n\n### Distance constraint\nWhen prompted for a second point you can also just type in a distance and enter. That constrains the distance from the first point. Then click on something in the correct direction and you're done!\n\n\n### Select Last\nWhile many operations unselect objects that have just been created or modified, `_SelLast` gives an instant access to them.  \n(Mind that the default option `DeselectOthersBeforeSelect` is set to `Yes`. Having changed it once the option will stick.)\n\n\n### Select specific\n`_SelectionFilter` gives you a dockable menu which let you omit whatever geometry types you want from being selected.\n\n\n### Select in dense areas\nWhen selecting in dense environments, you often want to select around something, but then once clicking to drag your selection window, it already selects something and you end up dragging geometry instead. This can be avoided using the \u003ckbd\u003ealt\u003c/kbd\u003e button while making the selection.\n\n\n### Coordinates\nWhen Rhino prompts for a \"next point\", typing `.x`, `.y` or `.z` (or even combinations like `.zx`) constrains the following point input to that coordinate type. Very useful when selecting points in different viewports.\n\n\n### Easy Polysurface editing\nGive `_SolidPtOn` a try.  \n![solidpt picture](/img/solidpton.png)\n\n\n### Move on\n... with `_MoveUVN`. Works beatifully with `_SelU` and `_SelV`.\n\n\n### Surfaces want to be one\n`_MergeAllFaces` command to turn _coplanar polysurface faces_ into one face.  \n\n`_MergeSrf` command to join surfaces together without making a polysurface (makes a new single surface, even if surfaces are not co-planar; works only with untrimmed surfaces).\n\n\n### Rebuild your edges\nIf you use the `_RebuildEdges` command it will restore the original trimmed or non-trimmed edges of a surface. This will vastly reduce the amount of newly added control points of most surfaces that are extruded from- or matched to the surface with rebuilt edges.  \nYou can use this macro with polysurfaces:\n```\n! _Explode\n_RebuildEdges _Enter\n_Join\n```\n\n### Joining fails\nYou might run into cases where you just can't seem to be able to join your surfaces into a solid. In those circumstances you should try to use `! _RemoveAllNakedMicroEdges`. You have to type that in – it is in no toolbar or menu.  \n[For Rhino 5 the similar command is `_testRemoveAllNakedMicroLoops`.]\n\n\n### Control UnrollSrf\nUnrolling an object can not be directly controlled in Rhino, the result might be unintentional. There is a small trick however, which will help you: Using `_UnjoinEdge` splits the polysurface at the selected edges in place, the subsequent `_UnrollSrf` will follow those \"break marks\".\n\n\n### To Infinity...\n... and beyond. Use `_IPlane` (alias `ip`) any time you need a plane – to trim with, intersect, Boolean operations, etc. You can even `_FilletSrf` to an IP!\n\n\n### Batch delete Blocks\nIf you import files from other CADs you mostly end up with a lot of block definitions. If you try to delete layers you will get a pesky message that you have to delete those block definitions first, before you can delete the layer.  \nThat's where the `Purge` [command](http://docs.mcneel.com/rhino/mac/help/en-us/index.htm#commands/purge.htm?Highlight=purge) comes in handy. You can delete all _unused_ block definitions, dimension annotation styles, groups, hatch patterns, layers, linetypes, and materials.\n\n\n### Gumball galore\nUse \u003ckbd\u003eshift\u003c/kbd\u003e + \u003ckbd\u003ectrl\u003c/kbd\u003e + \u003ckbd\u003eleft click\u003c/kbd\u003e to select the faces or edges of polysurfaces. You can then use the gumball to move/scale/rotate the selection.  \n\nPress \u003ckbd\u003ealt\u003c/kbd\u003e, then drag gumball arrow to make a copy.  \n\n\u003ckbd\u003eShift\u003c/kbd\u003e + drag gumball scale box to scale in all directions.  \n\nScale numerically with a value of `0` in one axis using the Gumball to get the same result as `_SetPt_`.  \nUse `-1` for fast mirroring in place.  \n\n\u003ciframe title=\"vimeo-player\" src=\"https://player.vimeo.com/video/260472052\" width=\"640\" height=\"360\" frameborder=\"0\" allowfullscreen\u003e\u003c/iframe\u003e\n\n\n### Group-on\n\u003ckbd\u003eCtrl\u003c/kbd\u003e + \u003ckbd\u003eshift\u003c/kbd\u003e click on an object in a group to select that single object without losing the group. \n\n\n### They see me rollin'\n\u003ckbd\u003eCtrl\u003c/kbd\u003e + \u003ckbd\u003eshift\u003c/kbd\u003e + \u003ckbd\u003eRMB-drag\u003c/kbd\u003e rotates the camera around the cursor (as long the cursor is hovering over any geometry).  \n\n\nWhen spinning the view with RMB-drag, press/hold \u003ckbd\u003eshift\u003c/kbd\u003e to limit spin to dominant initial rotation axis.\n\n\n### Perspective is the way to go\nWith `_OneView` you get dynamic CPlanes in your perspective viewport.  \n![oneview gif](/img/oneview.gif)\n\n\n### Calibrate your scale\nIf you're projecting your drawing and want to set it to a specific usable scale, you should set your scale (monitor dependent) via `_Zoom1To1Calibrate`.\n![calibrate zoom picture](/img/zoom_to_calibrate.png)\n\n\n### Get the ZBuffer\nWith `_ShowZBuffer` you can view a z-buffer output in your viewport. Use the command again to exit the view. Sadly there is currently no way to set a custom render distance – it will be calculated automatically based on the geometry in your scene.  \n![zbuffer picture](/img/zbuffer.png)\n\n\n### Render mesh\nSometimes it might be necessary to see the render mesh of an object. You could achieve this by typing in `_ShowRenderMesh`, but a better way is the command `_ToggleRenderMesh`. This way you can use the same command for showing and hiding the render mesh. Both commands are not available by menu or toolbar, so it might be helpful to create it.\n\nTo get a 'physical' access use `_ExtractRenderMesh`, which gives you, well, the polygonal render mesh. This also works on any applied render mesh properties, like [_Thickness_](https://docs.mcneel.com/rhino/6/help/en-us/properties/thickness.htm).\n\n\n### View it like it's 1999\nBecause you want it. `_GradientView`\n\n\n### Adding languages to Rhino\n[See on the McNeel Wiki](https://wiki.mcneel.com/rhino/6/addlanguages)\n\n\n### What are your favorites?\nFind your favorite commands in this session with `_PopUpPopular`.\n\n\n### Be a DJ\nUse `_Turntable` to let your camera rotate around your scene. Only thing missing: some sick beats.\n\n\n### Dual Monitor\nTry `TestMooCow` to synchronize 2 viewports.  \n\nEXPERIMENTAL\n{: .exp}\n\n\n### Flashing\n`TestRandColor` – Epileptics beware!  \n\nEXPERIMENTAL\n{: .exp}\n\n\n### Sesame Street\nEasteregg: `Elmo` is still a valid alias for `_Rebuild`.  \n(Why? Because it makes objects soft and friendly...)\n\n\n### Running Python scripts from aliases or toolbar buttons\n[Read on the McNeel forum](https://discourse.mcneel.com/t/running-python-scripts-from-aliases-or-toolbar-buttons/)\n\n\n### Modeling challenge\nAre you after a challenge to model something? Have a look at the [_Model Mania_](https://blogs.solidworks.com/tech/2020/03/20-years-of-model-mania.html) of Solidworks.\n\n\n### Programming\nIf you're into programming you can't get around the API of Rhino, called RhinoCommon.  \nOf course you can use the [official docs](https://developer.rhino3d.com/api/), or you can use the great [APIdocs.co](https://apidocs.co/) site, which not only has the Rhino API, but Grasshopper and other .NET APIs (like Revit's) as well.\n\n\u003chr\u003e\n\n\n## Grasshopper 1.0 🦗\n\n- [Grasshopper components help](https://rhino.github.io/)  \n  Every standard component and also many plug-ins are explained here.\n- [Grasshopper FAQ](https://www.grasshopper3d.com/forum/categories/faq-frequent-questions/listForCategory?categoryId=2985220%3ACategory%3A598480\u0026page=1)  \n  The FAQ on the old Grasshopper forum.\n- [ModeLab's Grasshopper Primer](https://aae280.files.wordpress.com/2014/10/mode-lab-grasshopper-primer-third-edition.pdf) might be the best comprehensive material  for beginners and experts alike.\n- Have a look at some of my custom made [GH-userobjects](https://github.com/runxel/gh-userobjects), which I use in production.\n\n\n### Understanding Data Trees\nThe famous ['Data Trees Masterclass with David Rutten'](https://vimeo.com/channels/datatreegh) is highly recommended to watch.\n\nAlso have a look at this wonderful [PDF](/files/Data-Trees-by-Andrew-Heuman.pdf) made by Andrew Heumann from which the following figures were taken:\n\n![Data trees architectural explanation picture](/img/gh1/data_trees_expl_arch.png)\n\n![Data trees explanation picture](/img/gh1/data_tree_expl.png)\n\n\n### Essential Algorithms and Data Structures\n… is the title of a new book by Rajaa Issa from McNeel. You can get a digital copy for free over [here](https://www.rhino3d.com/download/rhino/6.0/essential-algorithms)!\n\n![cover picture](/img/gh1/eads-book.png)\n\n\n### Find a certain component\nIf you see a component where you don't know from which tab it came from you can \u003ckbd\u003ectrl\u003c/kbd\u003e + \u003ckbd\u003ealt\u003c/kbd\u003e left-click it. Grasshopper will happily show you the location:\n\n![Where is the component? picture](/img/gh1/where-component.png)\n\n\n### I/O Modifier\nA short [recap](gh1-iomodifier.md) of the possible input and output modifier in a Grasshopper component.\n\n![I/O modifier picture](/img/gh1/iomods.png)\n\n\n### Load GH definition with Rhino doc\nOften enough you have a Rhino document with an \"associated\" Grasshopper definition, and switching between multiple files can be tiresome. With this [script](https://github.com/runxel/rhino-scripts#autoloadgrasshopperdefpy) you have a hassle-free working experience: it will load the Grasshopper definition automagically when you open a Rhino file.\n\n\n### Pop Up Shortcuts\nThe double click popup window for inserting components accepts a number of different input formats. If you provide a plain component name (or the abbreviation or a word used in the description) then you will see a list of potential matches, sorted from most relevant to least relevant:  \n![pop up sorting picture](/img/gh1/pop-up-1.png)\n\nSome components and objects support initialisation codes, which means you can assign certain values directly from the popup box. You can do this by adding an equals symbol after the name and then the value you wish to assign. For example, the \\[Curve Offset\\] ![](/img/icons/gh/crv/Offset_Curve.png) component allows you to specify the offset distance via the popup box by typing `=5` after the offset command:  \n![pop up init picture](/img/gh1/pop-up-2.png)\n\n| Special popup formats | Explanation |\n|          ---          |     ---     |\n| `\"…`                  | If the format starts with a double quote, then the entire contents (minus any other double quotes) will be placed into a \\[Text Panel\\] ![](img/icons/gh/param/Panel.png). |\n| `//…`                 | Two forward slashes also generats a \\[Text Panel\\] ![](img/icons/gh/param/Panel.png). |\n| `~…`                  | If the format starts with a tilde, then the entire contents will be placed in a Scribble object. |\n| `d,d[,d]`             | If the format contains two or three numerics separated by commas, a \\[Point\\] ![](img/icons/gh/param/Point.png) parameter will be created with the specified coordinates. |\n| `+[d]`                | Plus creates an \\[Addition\\] ![](img/icons/gh/math/Addition.png) compononent. |\n| `-[d]`                | Minus creates a \\[Subtraction\\] ![](img/icons/gh/math/Subtraction.png) component. |\n| `*[d]`                | Asterisk creates a \\[Multiplication\\] ![](img/icons/gh/math/Multiplication.png) component. |\n| `/[d]`                | One forward slash creates a \\[Division\\] ![](img/icons/gh/math/Division.png) component. |\n| `\\[d]`                | A backward slash will create an \\[Integer Division\\] ![](img/icons/gh/math/Integer_Division.png) component. |\n| `%[d]`                | The percent symbol creates a \\[Modulus\\] ![](img/icons/gh/math/Modulus.png) component. |\n| `\u0026…`                  | The ampersand creates a \\[Concatenation\\] ![](img/icons/gh/sets/Concatenate.png) component. |\n| `=…`                  | The equals symbol creates an \\[Equality\\] ![](img/icons/gh/math/Equality.png) component. |\n| `\u003c`                   | Creates a \\[Smaller Than\\] ![](img/icons/gh/math/Smaller_Than.png) component. |\n| `\u003e`                   | Creates a \\[Larger Than\\] ![](img/icons/gh/math/Larger_Than.png) component. |\n| `[d *] Pi`            | If the format contains the text \"Pi\" with an optional multiplication factor, then a \\[Pi\\] ![](img/icons/gh/math/Pi.png) component will be created. |\n| `d`                   | If the format can be evaluated as a single numeric value, then a \\[Slider\\] ![](img/icons/gh/param/Number_Slider.png) will be created with the specified initial value and sensible™ lower and upper limits. |\n| `d\u003cd` or `d..d`       | Two numerics separated by a smaller than symbol or by two or more consecutive dots will create a \\[Slider\\] ![](img/icons/gh/param/Number_Slider.png) with the specified limits. The initial slider value will be equal to the lower limit. |\n| `d\u003cd\u003cd` or `d..d..d`  | Three numerics separated by a smaller than symbol or by two or more consecutive dots will create a \\[Slider\\] ![](img/icons/gh/param/Number_Slider.png) with the specified limits. The initial slider value will be the value in the middle.|\n| `d/d/[d]`             | Two or three numerics separated by forward slashes will create a \\[Calendar\\] ![](img/icons/gh/param/Clock.png) object. The order of value is *day/month/year*. If year is omitted then the current year is used. Note that a second slash is required because `#/#` is interpreted as a number and thus results in a Slider. |\n| `#:#[:#] [am/pm]`     | If the format contains at least two numerics separated by a colon, a \\[Clock\\] ![](img/icons/gh/param/Calendar.png) object is created. Seconds are optional, as are am/pm suffixes. |\n| `f([…[,…[,…]]]) [= *]` | If the format starts with a lower case _f_ followed by an opening bracket, an \\[Expression\\] ![](img/icons/gh/math/Expression.png) component is created. A list of comma separated arguments can be provided as inputs, and anything after the optional equals symbol becomes the expression string. \u003cbr\u003e Example: `f(x, y) = x^2 + sin(y)` | \n| `#…`                  | A hash infront will yield old (legacy) components. |\n\nNote that decimal places will be harvested from formats that indicate sliders. I.e. the format `0..2..10` is not the same as `0..2..10.00`, as the former will create an integer slider from zero to ten whereas the latter will create a floating point slider with two decimal places from zero to ten.\n\n\n### Panel Special Codes\nWhen enabled in the right-click menu of a panel, special character combinations in curly braces will be replaced by other characters. (_Note: 'Multiline Data' must be off.)\n\n![panel special codes picture](/img/gh1/panel-special-codes.png)\n\n   \n| Examples | Look when option enabled |\n|   ---    |           ---            |\n| `3{dot}10{^-3} {times} 2{dot}10{^+7} = 6{dot}10{^+4}` | 3·10⁻³ × 2·10⁺⁷ = 6·10⁺⁴ |\n| `N{_n-1} + N{_n+2}`               | Nₙ₋₁ + Nₙ₊₂ |\n| `Copyright {copyright} 2019`      | Copyright © 2019 |\n| `1.00{dollar} {right} 0.89{euro}` | 1.00$ → 0.89€ |\n| `I'm {---} really {---} impressed by this.` | I'm — really — impressed by this. |\n\nThe attached file shows all predefined mapping pairs. This data is always up to date as it is harvested directly from the panel API itself.  \n[Panel Mappings Gh example file](/files/panelmappings.gh)\n\n\n### Geometry Pipeline\nIf you haven't already used the \"Geometry Pipeline\" component in Grasshopper, you should start doing it!  \nThe geometry pipeline is a link to the opened Rhino doc which lets you auto-reference any geometry. It _pipes_ your geometry into Grasshopper, based on type, name and layer filters.  \nThe notation for the filter is Regex-style and case sensitive. A double colon `::` is used to get into nested layers.  \n\n| Wildcard | Meaning |\n|   ---    |   ---   |\n| `?`      | Any single character |\n| `*`      | Zero or more character |\n| `#`      | Any single digit \\[0-9\\] |\n| `[chars]` | Any character from inside the brackets |\n| `[!chars]` | Any character _except_ from inside the brackets |\n\n![geo pipeline picture](/img/gh1/geo_pipeline.png)\n\n\n### Data Tree Selection Rules\nThe following rules will work with the \\[Path Compare\\] ![](img/icons/gh/sets/Path_Compare.png), \\[Split Tree\\] ![](img/icons/gh/sets/Split_Tree.png) and \\[Replace Paths\\] ![](img/icons/gh/sets/Replace_Paths.png) components.  \n\nImagine we have the following data tree, containing a bunch of textual characters:  \n```\n{0;0} = [a,e,i,o,u,y]\n{0;1} = [ä,ë,ê,ï,î,ö,ô,õ,ü,û,ÿ,ý]\n{1;0} = [b,c,d,f,g,h,j,k,l,m,n,p,q,r,s,t,v,w,x,z]\n{1;1} = [ç,ĉ,č,ĝ,ř,š,ş,ž]\n```\nThere are a total of four branches `{0;0}`, `{0;1}`, `{1;0}` and `{1;1}`. The first branch contains all the vowels that are part of the standard English alphabet. The second branch contains all non-standard vowels and branches three and four contain the standard and non-standard consonants respectively.  \nSo what if we want to select from this tree only the standard vowels? Basically include everything in the first branch and disregard everything else. We can use the \\[Tree Split\\] component with a selection rule to achieve this: `{0;0}`  \nThis selection rule hard-codes the number zero in both tree path locations. It doesn't define an item index rule, so all items in `{0;0}` will be selected.\n\nIf we want _all_ the vowels (both standard and non-standard), then we have several options:  \n```\n{0;?}        = select all branches that start with 0\n{0;(0,1)}    = select all branches that start with 0 and end in either 0 or 1\n{0;(0 to 1)} =    .................................. and end in the range 0 to 1.\n```\n\nConversely, selecting all standard vowels and consonants while disregarding all non-standard character can be achieved with rules as follows:  \n```\n{?;0}\n{(0,1);0}\n{(0 to 1);0}\n```\n\nIt is also possible to select items from each branch in addition to limiting the selection to specific branches. In this case another rule stated in square brackets needs to be appended:  \n`{0;?}[0 to 2]`  \nThe above rule will select the first three vowels from the standard and the non-standard lists.\n\nBasically, rules work in a very consistent way, but there are some syntax conventions you need to know. The first thing to realize is that every individual piece of data in a data-tree can be uniquely and unambiguously identified by a collection of integers. One integer describes its index within the branch and the others are used to identify the branch within the tree. As a result a rule for selection items always looks the same:  \n```\n{A;B;C;...;Z}[i]              where A, B, C, Z and i represent rules.\n```\nAll in all it's very similar to the \\[Path Mapper\\] ![](img/icons/gh/sets/Replace_Paths.png) syntax.\n\n\n| Rule Notations | Explanation |\n|       ---      |     ---     |\n| `*`            | Any number of integers in a path. |\n| `?`            | Any single integer. |\n| `d`            | Any specific integer. |\n| `!d`           | Anything _except_ a specific integer. |\n| `\u003c d`          |  Any number smaller than `d`. This notation is shorthand for `\\[0 to d\\]`. |\n| `\u003c= d`         | Any number equal to or smaller than `d`. This notation is shorthand for `\\[0 to d\\]`. |\n| `\u003e d`          | Any number larger than `d`. This notation is shorthand for `[d to infinity]`. |\n| `\u003e= d`         | Any number larger than or equal to `d`. This notation is shorthand for `[d to infinity]`. |\n| `(2,6,7)`      | Any one of the specific integers in this group. |\n| `!(2,6,7)`     | Anything _except_ one of the integers in this group. |\n| `(2 to 20)`    | Any integer in this range (including both 2 and 20). |\n| `!(2 to 20)`   | Any integer _outside_ this range. |\n| `(0,2,...)`    | Any integer part of this infinite sequence. Sequences have to be at least two integers long, and every subsequent integer has to be bigger than the previous one. |\n| `(0,2,...,48)` | Any integer part of this finite sequence. |\n| `!(3,5,...)`   | Any integer _not_ part of this infinite sequence. The sequence doesn't extend to the left, only towards the right. So this rule would select the numbers 0, 1, 2, 4, 6, 8, 10, 12 and all remaining even numbers. |\n| `!(7,10,21,...,425)` | Any integer _not_ part of this finite sequence. |\n\nFurthermore, it is possible to combine two or more rules using the boolean and/or operators. If you want to select the first five items in every list of a datatree and also the items 7, 12 and 42, then the selection rule would look as follows: `{*}[(0 to 4) or (6,11,41)]`  \n\nThe asterisk allows you to include all branches, no matter what their paths looks like.\n\n\nSee also this webinar by David Rutten aimed at experienced users:  \n\u003cdiv style=\"padding:56.25% 0 0 0;position:relative;\"\u003e\u003ciframe src=\"https://player.vimeo.com/video/78886857?title=0\u0026byline=0\u0026portrait=0\" style=\"position:absolute;top:0;left:0;width:100%;height:100%;\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen\u003e\u003c/iframe\u003e\u003c/div\u003e\u003cscript src=\"https://player.vimeo.com/api/player.js\"\u003e\u003c/script\u003e\n\n\n### Multi-wiring\nIf you need to plug in one wire into multiple components you can do so by _right clicking_ instead of releasing the left mouse button when plugging in a wire. See also this short video by David Rutten:  \n\n\u003ciframe width=\"560\" height=\"315\" src=\"https://www.youtube-nocookie.com/embed/EEp4Mpaibw4\" frameborder=\"0\" allow=\"accelerometer; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen\u003e\u003c/iframe\u003e\n\n\n### What does the red wire do?\nYou probably already asked yourself what the red wire does in Grasshopper when you accidentally pressed \u003ckbd\u003eAlt\u003c/kbd\u003e on your keyboard while wiring components.  \nThe answer: it names relays and also other inputs!  \n_(Note: at least for me the behaviour is bugged and you need to do this twice, bevor the name gets auto propagated.)_  \n![red wiring picture](/img/gh1/red_wiring.png)\n\n\n### Z-Coordinates are important\nIn a basic Grashopper you might not encounter the need, but if you interact with the \"outside world\", your filesystem or the web that is, you'll need to be extra sure one step is done after the other. Think of writing and reading files.  \nIn a vanilla GH file this is obviously determined by the graph itself. An output is the dependancy of an input. However this might not a viable way – e.g. one component might have no output at all. The order in which components are calculated is determined by it's stacking order: Those in the Back are calculated before those in the front. Use `Edit \u003e Arrange \u003e Send to Back` to ensure things are done in the right order.\n\n\n### Code in your editor of choice – Run in Grasshopper\nRight click into the GhPython component and choose \"Show 'code' input parameter\". Now using a \"File path\" primitive and the \"Read File\" component we can feed the python component with some external source code.  \n![code feed into python picture](/img/gh1/code_feed_python.png)\n\nIf you want to have autocomplete in your editor, you should have a look at the awesome [\"Ironstubs\"](https://github.com/gtalarico/ironpython-stubs). It's usable in Atom, Sublime Text, Vim and Visual Studio Code.  \n![sublime-large-demo](https://raw.githubusercontent.com/gtalarico/ironpython-stubs/master/docs/sublime/sublime-demo-large.gif)\n\n\n### Have IO descriptors in python\n[Sample file](/files/inputDescription.gh)  \n\n![io picture](/img/gh1/python_io_descr.png)\n\n\n### Python to native GH component\n[Tutorial on discourse.mcneel.com](https://discourse.mcneel.com/t/tutorial-creating-a-grasshopper-component-with-the-python-ghpy-compiler/)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frunxel%2Frhino-secrets","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frunxel%2Frhino-secrets","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frunxel%2Frhino-secrets/lists"}